diff --git a/.github/workflows/csharp-qltest.yml b/.github/workflows/csharp-qltest.yml index cb301d65f9a..c24b8d3bc00 100644 --- a/.github/workflows/csharp-qltest.yml +++ b/.github/workflows/csharp-qltest.yml @@ -5,8 +5,10 @@ on: paths: - "csharp/**" - "shared/**" + - "misc/bazel/**" - .github/actions/fetch-codeql/action.yml - codeql-workspace.yml + - "MODULE.bazel" branches: - main - "rc/*" @@ -14,9 +16,11 @@ on: paths: - "csharp/**" - "shared/**" + - "misc/bazel/**" - .github/workflows/csharp-qltest.yml - .github/actions/fetch-codeql/action.yml - codeql-workspace.yml + - "MODULE.bazel" branches: - main - "rc/*" diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 2b677468025..c0bd4abd0d0 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -72,7 +72,7 @@ repos: - id: rust-codegen name: Run Rust checked in code generation - files: ^misc/codegen/|^rust/(schema.py$|codegen/|.*/generated/|ql/lib/(rust\.dbscheme$|codeql/rust/elements)|\.generated.list) + files: ^misc/codegen/|^rust/(prefix\.dbscheme|schema/|codegen/|.*/generated/|ql/lib/(rust\.dbscheme$|codeql/rust/elements)|\.generated.list) language: system entry: bazel run //rust/codegen -- --quiet pass_filenames: false diff --git a/Cargo.lock b/Cargo.lock index 2b31f24bac4..65a77b316c9 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -381,6 +381,7 @@ version = "0.1.0" dependencies = [ "anyhow", "argfile", + "chrono", "clap", "codeql-extractor", "dunce", @@ -405,6 +406,7 @@ dependencies = [ "ra_ap_vfs", "rust-extractor-macros", "serde", + "serde_json", "serde_with", "stderrlog", "triomphe", @@ -2041,9 +2043,9 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.132" +version = "1.0.133" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d726bfaff4b320266d395898905d0eba0345aae23b54aee3a737e260fd46db03" +checksum = "c7fceb2473b9166b2294ef05efcb65a3db80803f0b03ef86a5fc88a2b85ee377" dependencies = [ "itoa", "memchr", diff --git a/MODULE.bazel b/MODULE.bazel index ca09ada4700..08a4aaa78af 100644 --- a/MODULE.bazel +++ b/MODULE.bazel @@ -68,7 +68,7 @@ use_repo(py_deps, "vendor__anyhow-1.0.44", "vendor__cc-1.0.70", "vendor__clap-2. # deps for ruby+rust # keep in sync by running `misc/bazel/3rdparty/update_cargo_deps.sh` tree_sitter_extractors_deps = use_extension("//misc/bazel/3rdparty:tree_sitter_extractors_extension.bzl", "r") -use_repo(tree_sitter_extractors_deps, "vendor__anyhow-1.0.93", "vendor__argfile-0.2.1", "vendor__chrono-0.4.38", "vendor__clap-4.5.20", "vendor__dunce-1.0.5", "vendor__encoding-0.2.33", "vendor__figment-0.10.19", "vendor__flate2-1.0.34", "vendor__glob-0.3.1", "vendor__globset-0.4.15", "vendor__itertools-0.10.5", "vendor__itertools-0.13.0", "vendor__lazy_static-1.5.0", "vendor__log-0.4.22", "vendor__num-traits-0.2.19", "vendor__num_cpus-1.16.0", "vendor__proc-macro2-1.0.89", "vendor__quote-1.0.37", "vendor__ra_ap_base_db-0.0.232", "vendor__ra_ap_cfg-0.0.232", "vendor__ra_ap_hir-0.0.232", "vendor__ra_ap_hir_def-0.0.232", "vendor__ra_ap_hir_expand-0.0.232", "vendor__ra_ap_ide_db-0.0.232", "vendor__ra_ap_intern-0.0.232", "vendor__ra_ap_load-cargo-0.0.232", "vendor__ra_ap_parser-0.0.232", "vendor__ra_ap_paths-0.0.232", "vendor__ra_ap_project_model-0.0.232", "vendor__ra_ap_span-0.0.232", "vendor__ra_ap_syntax-0.0.232", "vendor__ra_ap_vfs-0.0.232", "vendor__rand-0.8.5", "vendor__rayon-1.10.0", "vendor__regex-1.11.1", "vendor__serde-1.0.214", "vendor__serde_json-1.0.132", "vendor__serde_with-3.11.0", "vendor__stderrlog-0.6.0", "vendor__syn-2.0.87", "vendor__tracing-0.1.40", "vendor__tracing-subscriber-0.3.18", "vendor__tree-sitter-0.24.4", "vendor__tree-sitter-embedded-template-0.23.2", "vendor__tree-sitter-json-0.24.8", "vendor__tree-sitter-ql-0.23.1", "vendor__tree-sitter-ruby-0.23.1", "vendor__triomphe-0.1.14", "vendor__ungrammar-1.16.1") +use_repo(tree_sitter_extractors_deps, "vendor__anyhow-1.0.93", "vendor__argfile-0.2.1", "vendor__chrono-0.4.38", "vendor__clap-4.5.20", "vendor__dunce-1.0.5", "vendor__encoding-0.2.33", "vendor__figment-0.10.19", "vendor__flate2-1.0.34", "vendor__glob-0.3.1", "vendor__globset-0.4.15", "vendor__itertools-0.10.5", "vendor__itertools-0.13.0", "vendor__lazy_static-1.5.0", "vendor__log-0.4.22", "vendor__num-traits-0.2.19", "vendor__num_cpus-1.16.0", "vendor__proc-macro2-1.0.89", "vendor__quote-1.0.37", "vendor__ra_ap_base_db-0.0.232", "vendor__ra_ap_cfg-0.0.232", "vendor__ra_ap_hir-0.0.232", "vendor__ra_ap_hir_def-0.0.232", "vendor__ra_ap_hir_expand-0.0.232", "vendor__ra_ap_ide_db-0.0.232", "vendor__ra_ap_intern-0.0.232", "vendor__ra_ap_load-cargo-0.0.232", "vendor__ra_ap_parser-0.0.232", "vendor__ra_ap_paths-0.0.232", "vendor__ra_ap_project_model-0.0.232", "vendor__ra_ap_span-0.0.232", "vendor__ra_ap_syntax-0.0.232", "vendor__ra_ap_vfs-0.0.232", "vendor__rand-0.8.5", "vendor__rayon-1.10.0", "vendor__regex-1.11.1", "vendor__serde-1.0.214", "vendor__serde_json-1.0.133", "vendor__serde_with-3.11.0", "vendor__stderrlog-0.6.0", "vendor__syn-2.0.87", "vendor__tracing-0.1.40", "vendor__tracing-subscriber-0.3.18", "vendor__tree-sitter-0.24.4", "vendor__tree-sitter-embedded-template-0.23.2", "vendor__tree-sitter-json-0.24.8", "vendor__tree-sitter-ql-0.23.1", "vendor__tree-sitter-ruby-0.23.1", "vendor__triomphe-0.1.14", "vendor__ungrammar-1.16.1") dotnet = use_extension("@rules_dotnet//dotnet:extensions.bzl", "dotnet") dotnet.toolchain(dotnet_version = "9.0.100") diff --git a/config/identical-files.json b/config/identical-files.json index 064da36677d..b066c443d9f 100644 --- a/config/identical-files.json +++ b/config/identical-files.json @@ -1,58 +1,4 @@ { - "DataFlow Java/C++/C#/Go/Python/Ruby/Swift Legacy Configuration": [ - "java/ql/lib/semmle/code/java/dataflow/internal/DataFlowImpl1.qll", - "java/ql/lib/semmle/code/java/dataflow/internal/DataFlowImpl2.qll", - "java/ql/lib/semmle/code/java/dataflow/internal/DataFlowImpl3.qll", - "java/ql/lib/semmle/code/java/dataflow/internal/DataFlowImpl4.qll", - "java/ql/lib/semmle/code/java/dataflow/internal/DataFlowImpl5.qll", - "java/ql/lib/semmle/code/java/dataflow/internal/DataFlowImpl6.qll", - "cpp/ql/lib/semmle/code/cpp/dataflow/internal/DataFlowImpl1.qll", - "cpp/ql/lib/semmle/code/cpp/dataflow/internal/DataFlowImpl2.qll", - "cpp/ql/lib/semmle/code/cpp/dataflow/internal/DataFlowImpl3.qll", - "cpp/ql/lib/semmle/code/cpp/dataflow/internal/DataFlowImpl4.qll", - "cpp/ql/lib/semmle/code/cpp/dataflow/internal/DataFlowImplLocal.qll", - "cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowImpl1.qll", - "cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowImpl2.qll", - "cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowImpl3.qll", - "cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowImpl4.qll", - "csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowImpl1.qll", - "csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowImpl2.qll", - "csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowImpl3.qll", - "csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowImpl4.qll", - "csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowImpl5.qll", - "go/ql/lib/semmle/go/dataflow/internal/DataFlowImpl1.qll", - "go/ql/lib/semmle/go/dataflow/internal/DataFlowImpl2.qll", - "python/ql/lib/semmle/python/dataflow/new/internal/DataFlowImpl1.qll", - "python/ql/lib/semmle/python/dataflow/new/internal/DataFlowImpl2.qll", - "python/ql/lib/semmle/python/dataflow/new/internal/DataFlowImpl3.qll", - "python/ql/lib/semmle/python/dataflow/new/internal/DataFlowImpl4.qll", - "ruby/ql/lib/codeql/ruby/dataflow/internal/DataFlowImpl1.qll", - "ruby/ql/lib/codeql/ruby/dataflow/internal/DataFlowImpl2.qll", - "swift/ql/lib/codeql/swift/dataflow/internal/DataFlowImpl1.qll" - ], - "TaintTracking Legacy Configuration Java/C++/C#/Go/Python/Ruby/Swift": [ - "cpp/ql/lib/semmle/code/cpp/dataflow/internal/tainttracking1/TaintTrackingImpl.qll", - "cpp/ql/lib/semmle/code/cpp/dataflow/internal/tainttracking2/TaintTrackingImpl.qll", - "cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/tainttracking1/TaintTrackingImpl.qll", - "cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/tainttracking2/TaintTrackingImpl.qll", - "cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/tainttracking3/TaintTrackingImpl.qll", - "csharp/ql/lib/semmle/code/csharp/dataflow/internal/tainttracking1/TaintTrackingImpl.qll", - "csharp/ql/lib/semmle/code/csharp/dataflow/internal/tainttracking2/TaintTrackingImpl.qll", - "csharp/ql/lib/semmle/code/csharp/dataflow/internal/tainttracking3/TaintTrackingImpl.qll", - "csharp/ql/lib/semmle/code/csharp/dataflow/internal/tainttracking4/TaintTrackingImpl.qll", - "csharp/ql/lib/semmle/code/csharp/dataflow/internal/tainttracking5/TaintTrackingImpl.qll", - "go/ql/lib/semmle/go/dataflow/internal/tainttracking1/TaintTrackingImpl.qll", - "go/ql/lib/semmle/go/dataflow/internal/tainttracking2/TaintTrackingImpl.qll", - "java/ql/lib/semmle/code/java/dataflow/internal/tainttracking1/TaintTrackingImpl.qll", - "java/ql/lib/semmle/code/java/dataflow/internal/tainttracking2/TaintTrackingImpl.qll", - "java/ql/lib/semmle/code/java/dataflow/internal/tainttracking3/TaintTrackingImpl.qll", - "python/ql/lib/semmle/python/dataflow/new/internal/tainttracking1/TaintTrackingImpl.qll", - "python/ql/lib/semmle/python/dataflow/new/internal/tainttracking2/TaintTrackingImpl.qll", - "python/ql/lib/semmle/python/dataflow/new/internal/tainttracking3/TaintTrackingImpl.qll", - "python/ql/lib/semmle/python/dataflow/new/internal/tainttracking4/TaintTrackingImpl.qll", - "ruby/ql/lib/codeql/ruby/dataflow/internal/tainttracking1/TaintTrackingImpl.qll", - "swift/ql/lib/codeql/swift/dataflow/internal/tainttracking1/TaintTrackingImpl.qll" - ], "SsaReadPosition Java/C#": [ "java/ql/lib/semmle/code/java/dataflow/internal/rangeanalysis/SsaReadPositionCommon.qll", "csharp/ql/lib/semmle/code/csharp/dataflow/internal/rangeanalysis/SsaReadPositionCommon.qll" diff --git a/cpp/ql/lib/CHANGELOG.md b/cpp/ql/lib/CHANGELOG.md index 0536c1c361b..4091ef97e4d 100644 --- a/cpp/ql/lib/CHANGELOG.md +++ b/cpp/ql/lib/CHANGELOG.md @@ -1,3 +1,17 @@ +## 3.0.0 + +### Breaking Changes + +* Deleted the old deprecated data flow API that was based on extending a configuration class. See https://github.blog/changelog/2023-08-14-new-dataflow-api-for-writing-custom-codeql-queries for instructions on migrating your queries to use the new API. + +### Deprecated APIs + +* The `NonThrowing` class (`semmle.code.cpp.models.interfaces.NonThrowing`) has been deprecated. Please use the `NonCppThrowingFunction` class instead. + +## 2.1.1 + +No user-facing changes. + ## 2.1.0 ### New Features diff --git a/cpp/ql/lib/change-notes/2024-11-18-guard-conditions.md b/cpp/ql/lib/change-notes/2024-11-18-guard-conditions.md deleted file mode 100644 index 8fb914bf51b..00000000000 --- a/cpp/ql/lib/change-notes/2024-11-18-guard-conditions.md +++ /dev/null @@ -1,4 +0,0 @@ ---- -category: minorAnalysis ---- -* The `Guards` library (`semmle.code.cpp.controlflow.Guards`) has been improved to recognize more guard conditions. Additionally, the guards library no longer considers guards in static local initializers or global initializers as `GuardCondition`s. \ No newline at end of file diff --git a/cpp/ql/lib/change-notes/released/2.1.1.md b/cpp/ql/lib/change-notes/released/2.1.1.md new file mode 100644 index 00000000000..f023e9166c2 --- /dev/null +++ b/cpp/ql/lib/change-notes/released/2.1.1.md @@ -0,0 +1,3 @@ +## 2.1.1 + +No user-facing changes. diff --git a/cpp/ql/lib/change-notes/released/3.0.0.md b/cpp/ql/lib/change-notes/released/3.0.0.md new file mode 100644 index 00000000000..5945c94c566 --- /dev/null +++ b/cpp/ql/lib/change-notes/released/3.0.0.md @@ -0,0 +1,9 @@ +## 3.0.0 + +### Breaking Changes + +* Deleted the old deprecated data flow API that was based on extending a configuration class. See https://github.blog/changelog/2023-08-14-new-dataflow-api-for-writing-custom-codeql-queries for instructions on migrating your queries to use the new API. + +### Deprecated APIs + +* The `NonThrowing` class (`semmle.code.cpp.models.interfaces.NonThrowing`) has been deprecated. Please use the `NonCppThrowingFunction` class instead. diff --git a/cpp/ql/lib/codeql-pack.release.yml b/cpp/ql/lib/codeql-pack.release.yml index 487a1a58b2b..33d3a2cd113 100644 --- a/cpp/ql/lib/codeql-pack.release.yml +++ b/cpp/ql/lib/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 2.1.0 +lastReleaseVersion: 3.0.0 diff --git a/cpp/ql/lib/qlpack.yml b/cpp/ql/lib/qlpack.yml index 397a56ac535..4bb4b04e02f 100644 --- a/cpp/ql/lib/qlpack.yml +++ b/cpp/ql/lib/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/cpp-all -version: 2.1.1-dev +version: 3.0.1-dev groups: cpp dbscheme: semmlecode.cpp.dbscheme extractor: cpp diff --git a/cpp/ql/lib/semmle/code/cpp/controlflow/IRGuards.qll b/cpp/ql/lib/semmle/code/cpp/controlflow/IRGuards.qll index f16dbd3d49d..9b4d28430ff 100644 --- a/cpp/ql/lib/semmle/code/cpp/controlflow/IRGuards.qll +++ b/cpp/ql/lib/semmle/code/cpp/controlflow/IRGuards.qll @@ -5,7 +5,6 @@ import cpp import semmle.code.cpp.ir.IR -private import semmle.code.cpp.ir.ValueNumbering private import semmle.code.cpp.ir.implementation.raw.internal.TranslatedExpr private import semmle.code.cpp.ir.implementation.raw.internal.InstructionTag @@ -60,91 +59,7 @@ class MatchValue extends AbstractValue, TMatchValue { } /** - * A value number such that at least one of the instructions is - * a `CompareInstruction`. - */ -private class CompareValueNumber extends ValueNumber { - CompareInstruction cmp; - - CompareValueNumber() { cmp = this.getAnInstruction() } - - /** Gets a `CompareInstruction` belonging to this value number. */ - CompareInstruction getCompareInstruction() { result = cmp } - - /** - * Gets the left and right operands of a `CompareInstruction` that - * belong to this value number. - */ - predicate hasOperands(Operand left, Operand right) { - left = cmp.getLeftOperand() and - right = cmp.getRightOperand() - } -} - -private class CompareEQValueNumber extends CompareValueNumber { - override CompareEQInstruction cmp; -} - -private class CompareNEValueNumber extends CompareValueNumber { - override CompareNEInstruction cmp; -} - -private class CompareLTValueNumber extends CompareValueNumber { - override CompareLTInstruction cmp; -} - -private class CompareGTValueNumber extends CompareValueNumber { - override CompareGTInstruction cmp; -} - -private class CompareLEValueNumber extends CompareValueNumber { - override CompareLEInstruction cmp; -} - -private class CompareGEValueNumber extends CompareValueNumber { - override CompareGEInstruction cmp; -} - -/** - * A value number such that at least one of the instructions provides - * the integer value controlling a `SwitchInstruction`. - */ -private class SwitchConditionValueNumber extends ValueNumber { - SwitchInstruction switch; - - pragma[nomagic] - SwitchConditionValueNumber() { this.getAnInstruction() = switch.getExpression() } - - /** Gets an expression that belongs to this value number. */ - Operand getExpressionOperand() { result = switch.getExpressionOperand() } - - Instruction getSuccessor(CaseEdge kind) { result = switch.getSuccessor(kind) } -} - -private class BuiltinExpectCallValueNumber extends ValueNumber { - BuiltinExpectCallInstruction instr; - - BuiltinExpectCallValueNumber() { this.getAnInstruction() = instr } - - ValueNumber getCondition() { result.getAnInstruction() = instr.getCondition() } - - Operand getAUse() { result = instr.getAUse() } -} - -private class LogicalNotValueNumber extends ValueNumber { - LogicalNotInstruction instr; - - LogicalNotValueNumber() { this.getAnInstruction() = instr } - - ValueNumber getUnary() { result.getAnInstruction() = instr.getUnary() } -} - -/** - * A Boolean condition in the AST that guards one or more basic blocks. This includes - * operands of logical operators but not switch statements. - * - * For performance reasons conditions inside static local initializers or - * global initializers are not considered `GuardCondition`s. + * A Boolean condition in the AST that guards one or more basic blocks. */ cached class GuardCondition extends Expr { @@ -454,9 +369,6 @@ private predicate nonExcludedIRAndBasicBlock(IRBlock irb, BasicBlock controlled) * * Note that `&&` and `||` don't have an explicit representation in the IR, * and therefore will not appear as IRGuardConditions. - * - * For performance reasons conditions inside static local initializers or - * global initializers are not considered `IRGuardCondition`s. */ cached class IRGuardCondition extends Instruction { @@ -605,7 +517,7 @@ class IRGuardCondition extends Instruction { cached predicate comparesLt(Operand left, Operand right, int k, boolean isLessThan, boolean testIsTrue) { exists(BooleanValue value | - compares_lt(valueNumber(this), left, right, k, isLessThan, value) and + compares_lt(this, left, right, k, isLessThan, value) and value.getValue() = testIsTrue ) } @@ -616,7 +528,7 @@ class IRGuardCondition extends Instruction { */ cached predicate comparesLt(Operand op, int k, boolean isLessThan, AbstractValue value) { - compares_lt(valueNumber(this), op, k, isLessThan, value) + compares_lt(this, op, k, isLessThan, value) } /** @@ -626,8 +538,7 @@ class IRGuardCondition extends Instruction { cached predicate ensuresLt(Operand left, Operand right, int k, IRBlock block, boolean isLessThan) { exists(AbstractValue value | - compares_lt(valueNumber(this), left, right, k, isLessThan, value) and - this.valueControls(block, value) + compares_lt(this, left, right, k, isLessThan, value) and this.valueControls(block, value) ) } @@ -638,8 +549,7 @@ class IRGuardCondition extends Instruction { cached predicate ensuresLt(Operand op, int k, IRBlock block, boolean isLessThan) { exists(AbstractValue value | - compares_lt(valueNumber(this), op, k, isLessThan, value) and - this.valueControls(block, value) + compares_lt(this, op, k, isLessThan, value) and this.valueControls(block, value) ) } @@ -652,7 +562,7 @@ class IRGuardCondition extends Instruction { Operand left, Operand right, int k, IRBlock pred, IRBlock succ, boolean isLessThan ) { exists(AbstractValue value | - compares_lt(valueNumber(this), left, right, k, isLessThan, value) and + compares_lt(this, left, right, k, isLessThan, value) and this.valueControlsEdge(pred, succ, value) ) } @@ -664,7 +574,7 @@ class IRGuardCondition extends Instruction { cached predicate ensuresLtEdge(Operand left, int k, IRBlock pred, IRBlock succ, boolean isLessThan) { exists(AbstractValue value | - compares_lt(valueNumber(this), left, k, isLessThan, value) and + compares_lt(this, left, k, isLessThan, value) and this.valueControlsEdge(pred, succ, value) ) } @@ -673,7 +583,7 @@ class IRGuardCondition extends Instruction { cached predicate comparesEq(Operand left, Operand right, int k, boolean areEqual, boolean testIsTrue) { exists(BooleanValue value | - compares_eq(valueNumber(this), left, right, k, areEqual, value) and + compares_eq(this, left, right, k, areEqual, value) and value.getValue() = testIsTrue ) } @@ -681,7 +591,7 @@ class IRGuardCondition extends Instruction { /** Holds if (determined by this guard) `op == k` evaluates to `areEqual` if this expression evaluates to `value`. */ cached predicate comparesEq(Operand op, int k, boolean areEqual, AbstractValue value) { - unary_compares_eq(valueNumber(this), op, k, areEqual, false, value) + unary_compares_eq(this, op, k, areEqual, false, value) } /** @@ -691,8 +601,7 @@ class IRGuardCondition extends Instruction { cached predicate ensuresEq(Operand left, Operand right, int k, IRBlock block, boolean areEqual) { exists(AbstractValue value | - compares_eq(valueNumber(this), left, right, k, areEqual, value) and - this.valueControls(block, value) + compares_eq(this, left, right, k, areEqual, value) and this.valueControls(block, value) ) } @@ -703,8 +612,7 @@ class IRGuardCondition extends Instruction { cached predicate ensuresEq(Operand op, int k, IRBlock block, boolean areEqual) { exists(AbstractValue value | - unary_compares_eq(valueNumber(this), op, k, areEqual, false, value) and - this.valueControls(block, value) + unary_compares_eq(this, op, k, areEqual, false, value) and this.valueControls(block, value) ) } @@ -717,7 +625,7 @@ class IRGuardCondition extends Instruction { Operand left, Operand right, int k, IRBlock pred, IRBlock succ, boolean areEqual ) { exists(AbstractValue value | - compares_eq(valueNumber(this), left, right, k, areEqual, value) and + compares_eq(this, left, right, k, areEqual, value) and this.valueControlsEdge(pred, succ, value) ) } @@ -729,7 +637,7 @@ class IRGuardCondition extends Instruction { cached predicate ensuresEqEdge(Operand op, int k, IRBlock pred, IRBlock succ, boolean areEqual) { exists(AbstractValue value | - unary_compares_eq(valueNumber(this), op, k, areEqual, false, value) and + unary_compares_eq(this, op, k, areEqual, false, value) and this.valueControlsEdge(pred, succ, value) ) } @@ -817,20 +725,13 @@ class IRGuardCondition extends Instruction { } private Instruction getBranchForCondition(Instruction guard) { - // There are a lot of guards inside global or static local initializers, - // and on certain databases this can make the `ensures*` predicates - // blow up. - // These guards are likely not super important anyway. - guard.getEnclosingFunction() instanceof Function and - ( - result.(ConditionalBranchInstruction).getCondition() = guard - or - result.(SwitchInstruction).getExpression() = guard - ) + result.(ConditionalBranchInstruction).getCondition() = guard or exists(LogicalNotInstruction cond | result = getBranchForCondition(cond) and cond.getUnary() = guard ) + or + result.(SwitchInstruction).getExpression() = guard } /** @@ -839,7 +740,7 @@ private Instruction getBranchForCondition(Instruction guard) { * Beware making mistaken logical implications here relating `areEqual` and `testIsTrue`. */ private predicate compares_eq( - ValueNumber test, Operand left, Operand right, int k, boolean areEqual, AbstractValue value + Instruction test, Operand left, Operand right, int k, boolean areEqual, AbstractValue value ) { /* The simple case where the test *is* the comparison so areEqual = testIsTrue xor eq. */ exists(AbstractValue v | simple_comparison_eq(test, left, right, k, v) | @@ -858,10 +759,10 @@ private predicate compares_eq( or /* (x is true => (left == right + k)) => (!x is false => (left == right + k)) */ exists(AbstractValue dual | value = dual.getDualValue() | - compares_eq(test.(LogicalNotValueNumber).getUnary(), left, right, k, areEqual, dual) + compares_eq(test.(LogicalNotInstruction).getUnary(), left, right, k, areEqual, dual) ) or - compares_eq(test.(BuiltinExpectCallValueNumber).getCondition(), left, right, k, areEqual, value) + compares_eq(test.(BuiltinExpectCallInstruction).getCondition(), left, right, k, areEqual, value) } /** @@ -900,10 +801,12 @@ private predicate compares_eq( * latter. */ private predicate unary_compares_eq( - ValueNumber test, Operand op, int k, boolean areEqual, boolean inNonZeroCase, AbstractValue value + Instruction test, Operand op, int k, boolean areEqual, boolean inNonZeroCase, AbstractValue value ) { /* The simple case where the test *is* the comparison so areEqual = testIsTrue xor eq. */ - exists(AbstractValue v | unary_simple_comparison_eq(test, op, k, inNonZeroCase, v) | + exists(AbstractValue v | + unary_simple_comparison_eq(test, k, inNonZeroCase, v) and op.getDef() = test + | areEqual = true and value = v or areEqual = false and value = v.getDualValue() @@ -914,7 +817,7 @@ private predicate unary_compares_eq( /* (x is true => (op == k)) => (!x is false => (op == k)) */ exists(AbstractValue dual, boolean inNonZeroCase0 | value = dual.getDualValue() and - unary_compares_eq(test.(LogicalNotValueNumber).getUnary(), op, k, inNonZeroCase0, areEqual, dual) + unary_compares_eq(test.(LogicalNotInstruction).getUnary(), op, k, inNonZeroCase0, areEqual, dual) | k = 0 and inNonZeroCase = inNonZeroCase0 or @@ -924,95 +827,82 @@ private predicate unary_compares_eq( // ((test is `areEqual` => op == const + k2) and const == `k1`) => // test is `areEqual` => op == k1 + k2 inNonZeroCase = false and - exists(int k1, int k2, Instruction const | + exists(int k1, int k2, ConstantInstruction const | compares_eq(test, op, const.getAUse(), k2, areEqual, value) and int_value(const) = k1 and k = k1 + k2 ) or - unary_compares_eq(test.(BuiltinExpectCallValueNumber).getCondition(), op, k, areEqual, + unary_compares_eq(test.(BuiltinExpectCallInstruction).getCondition(), op, k, areEqual, inNonZeroCase, value) } /** Rearrange various simple comparisons into `left == right + k` form. */ private predicate simple_comparison_eq( - CompareValueNumber cmp, Operand left, Operand right, int k, AbstractValue value + CompareInstruction cmp, Operand left, Operand right, int k, AbstractValue value ) { - cmp instanceof CompareEQValueNumber and - cmp.hasOperands(left, right) and + left = cmp.getLeftOperand() and + cmp instanceof CompareEQInstruction and + right = cmp.getRightOperand() and k = 0 and value.(BooleanValue).getValue() = true or - cmp instanceof CompareNEValueNumber and - cmp.hasOperands(left, right) and + left = cmp.getLeftOperand() and + cmp instanceof CompareNEInstruction and + right = cmp.getRightOperand() and k = 0 and value.(BooleanValue).getValue() = false } /** - * Holds if `op` is an operand that is eventually used in a unary comparison - * with a constant. + * Rearrange various simple comparisons into `op == k` form. */ -private predicate isRelevantUnaryComparisonOperand(Operand op) { - // Base case: `op` is an operand of a `CompareEQInstruction` or `CompareNEInstruction`, - // and the other operand is a constant. - exists(CompareInstruction eq, Instruction instr | - eq.hasOperands(op, instr.getAUse()) and - exists(int_value(instr)) - | - eq instanceof CompareEQInstruction - or - eq instanceof CompareNEInstruction - ) - or - // C doesn't have int-to-bool conversions, so `if(x)` will just generate: - // r2_1(glval) = VariableAddress[x] - // r2_2(int) = Load[x] : &:r2_1, m1_6 - // v2_3(void) = ConditionalBranch : r2_2 - exists(ConditionalBranchInstruction branch | branch.getConditionOperand() = op) - or - // If `!x` is a relevant unary comparison then so is `x`. - exists(LogicalNotInstruction logicalNot | - isRelevantUnaryComparisonOperand(unique( | | logicalNot.getAUse())) and - logicalNot.getUnaryOperand() = op - ) - or - // If `y` is a relevant unary comparison and `y = x` then so is `x`. - not op.isDefinitionInexact() and - exists(CopyInstruction copy | - isRelevantUnaryComparisonOperand(unique( | | copy.getAUse())) and - op = copy.getSourceValueOperand() - ) - or - // If phi(x1, x2) is a relevant unary comparison then so are `x1` and `x2`. - not op.isDefinitionInexact() and - exists(PhiInstruction phi | - isRelevantUnaryComparisonOperand(unique( | | phi.getAUse())) and - op = phi.getAnInputOperand() - ) - or - // If `__builtin_expect(x)` is a relevant unary comparison then so is `x`. - exists(BuiltinExpectCallInstruction call | - isRelevantUnaryComparisonOperand(unique( | | call.getAUse())) and - op = call.getConditionOperand() - ) -} - -/** Rearrange various simple comparisons into `op == k` form. */ private predicate unary_simple_comparison_eq( - ValueNumber test, Operand op, int k, boolean inNonZeroCase, AbstractValue value + Instruction test, int k, boolean inNonZeroCase, AbstractValue value ) { - exists(CaseEdge case, SwitchConditionValueNumber condition | - condition = test and - op = condition.getExpressionOperand() and + exists(SwitchInstruction switch, CaseEdge case | + test = switch.getExpression() and case = value.(MatchValue).getCase() and - exists(condition.getSuccessor(case)) and + exists(switch.getSuccessor(case)) and case.getValue().toInt() = k and inNonZeroCase = false ) or - isRelevantUnaryComparisonOperand(op) and - op.getDef() = test.getAnInstruction() and + // Any instruction with an integral type could potentially be part of a + // check for nullness when used in a guard. So we include all integral + // typed instructions here. However, since some of these instructions are + // already included as guards in other cases, we exclude those here. + // These are instructions that compute a binary equality or inequality + // relation. For example, the following: + // ```cpp + // if(a == b + 42) { ... } + // ``` + // generates the following IR: + // ``` + // r1(glval) = VariableAddress[a] : + // r2(int) = Load[a] : &:r1, m1 + // r3(glval) = VariableAddress[b] : + // r4(int) = Load[b] : &:r3, m2 + // r5(int) = Constant[42] : + // r6(int) = Add : r4, r5 + // r7(bool) = CompareEQ : r2, r6 + // v1(void) = ConditionalBranch : r7 + // ``` + // and since `r7` is an integral typed instruction this predicate could + // include a case for when `r7` evaluates to true (in which case we would + // infer that `r6` was non-zero, and a case for when `r7` evaluates to false + // (in which case we would infer that `r6` was zero). + // However, since `a == b + 42` is already supported when reasoning about + // binary equalities we exclude those cases here. + not test.isGLValue() and + not simple_comparison_eq(test, _, _, _, _) and + not simple_comparison_lt(test, _, _, _) and + not test = any(SwitchInstruction switch).getExpression() and + ( + test.getResultIRType() instanceof IRAddressType or + test.getResultIRType() instanceof IRIntegerType or + test.getResultIRType() instanceof IRBooleanType + ) and ( k = 1 and value.(BooleanValue).getValue() = true and @@ -1029,12 +919,10 @@ private class BuiltinExpectCallInstruction extends CallInstruction { BuiltinExpectCallInstruction() { this.getStaticCallTarget().hasName("__builtin_expect") } /** Gets the condition of this call. */ - Instruction getCondition() { result = this.getConditionOperand().getDef() } - - Operand getConditionOperand() { + Instruction getCondition() { // The first parameter of `__builtin_expect` has type `long`. So we skip // the conversion when inferring guards. - result = this.getArgument(0).(ConvertInstruction).getUnaryOperand() + result = this.getArgument(0).(ConvertInstruction).getUnary() } } @@ -1044,23 +932,23 @@ private class BuiltinExpectCallInstruction extends CallInstruction { * `__builtin_expect(left == right + k, _)` to `0`. */ private predicate builtin_expect_eq( - CompareValueNumber cmp, Operand left, Operand right, int k, boolean areEqual, AbstractValue value + CompareInstruction cmp, Operand left, Operand right, int k, boolean areEqual, AbstractValue value ) { - exists(BuiltinExpectCallValueNumber call, Instruction const, AbstractValue innerValue | + exists(BuiltinExpectCallInstruction call, Instruction const, AbstractValue innerValue | int_value(const) = 0 and cmp.hasOperands(call.getAUse(), const.getAUse()) and compares_eq(call.getCondition(), left, right, k, areEqual, innerValue) | - cmp instanceof CompareNEValueNumber and + cmp instanceof CompareNEInstruction and value = innerValue or - cmp instanceof CompareEQValueNumber and + cmp instanceof CompareEQInstruction and value.getDualValue() = innerValue ) } private predicate complex_eq( - ValueNumber cmp, Operand left, Operand right, int k, boolean areEqual, AbstractValue value + CompareInstruction cmp, Operand left, Operand right, int k, boolean areEqual, AbstractValue value ) { sub_eq(cmp, left, right, k, areEqual, value) or @@ -1074,24 +962,24 @@ private predicate complex_eq( * an instruction that compares the value of `__builtin_expect(op == k, _)` to `0`. */ private predicate unary_builtin_expect_eq( - CompareValueNumber cmp, Operand op, int k, boolean areEqual, boolean inNonZeroCase, + CompareInstruction cmp, Operand op, int k, boolean areEqual, boolean inNonZeroCase, AbstractValue value ) { - exists(BuiltinExpectCallValueNumber call, Instruction const, AbstractValue innerValue | + exists(BuiltinExpectCallInstruction call, Instruction const, AbstractValue innerValue | int_value(const) = 0 and cmp.hasOperands(call.getAUse(), const.getAUse()) and unary_compares_eq(call.getCondition(), op, k, areEqual, inNonZeroCase, innerValue) | - cmp instanceof CompareNEValueNumber and + cmp instanceof CompareNEInstruction and value = innerValue or - cmp instanceof CompareEQValueNumber and + cmp instanceof CompareEQInstruction and value.getDualValue() = innerValue ) } private predicate unary_complex_eq( - ValueNumber test, Operand op, int k, boolean areEqual, boolean inNonZeroCase, AbstractValue value + Instruction test, Operand op, int k, boolean areEqual, boolean inNonZeroCase, AbstractValue value ) { unary_sub_eq(test, op, k, areEqual, inNonZeroCase, value) or @@ -1107,7 +995,7 @@ private predicate unary_complex_eq( /** Holds if `left < right + k` evaluates to `isLt` given that test is `testIsTrue`. */ private predicate compares_lt( - ValueNumber test, Operand left, Operand right, int k, boolean isLt, AbstractValue value + Instruction test, Operand left, Operand right, int k, boolean isLt, AbstractValue value ) { /* In the simple case, the test is the comparison, so isLt = testIsTrue */ simple_comparison_lt(test, left, right, k) and @@ -1120,22 +1008,23 @@ private predicate compares_lt( or /* (x is true => (left < right + k)) => (!x is false => (left < right + k)) */ exists(AbstractValue dual | value = dual.getDualValue() | - compares_lt(test.(LogicalNotValueNumber).getUnary(), left, right, k, isLt, dual) + compares_lt(test.(LogicalNotInstruction).getUnary(), left, right, k, isLt, dual) ) } /** Holds if `op < k` evaluates to `isLt` given that `test` evaluates to `value`. */ -private predicate compares_lt(ValueNumber test, Operand op, int k, boolean isLt, AbstractValue value) { - unary_simple_comparison_lt(test, op, k, isLt, value) +private predicate compares_lt(Instruction test, Operand op, int k, boolean isLt, AbstractValue value) { + unary_simple_comparison_lt(test, k, isLt, value) and + op.getDef() = test or complex_lt(test, op, k, isLt, value) or /* (x is true => (op < k)) => (!x is false => (op < k)) */ exists(AbstractValue dual | value = dual.getDualValue() | - compares_lt(test.(LogicalNotValueNumber).getUnary(), op, k, isLt, dual) + compares_lt(test.(LogicalNotInstruction).getUnary(), op, k, isLt, dual) ) or - exists(int k1, int k2, Instruction const | + exists(int k1, int k2, ConstantInstruction const | compares_lt(test, op, const.getAUse(), k2, isLt, value) and int_value(const) = k1 and k = k1 + k2 @@ -1144,38 +1033,42 @@ private predicate compares_lt(ValueNumber test, Operand op, int k, boolean isLt, /** `(a < b + k) => (b > a - k) => (b >= a + (1-k))` */ private predicate compares_ge( - ValueNumber test, Operand left, Operand right, int k, boolean isGe, AbstractValue value + Instruction test, Operand left, Operand right, int k, boolean isGe, AbstractValue value ) { exists(int onemk | k = 1 - onemk | compares_lt(test, right, left, onemk, isGe, value)) } /** Rearrange various simple comparisons into `left < right + k` form. */ -private predicate simple_comparison_lt(CompareValueNumber cmp, Operand left, Operand right, int k) { - cmp.hasOperands(left, right) and - cmp instanceof CompareLTValueNumber and +private predicate simple_comparison_lt(CompareInstruction cmp, Operand left, Operand right, int k) { + left = cmp.getLeftOperand() and + cmp instanceof CompareLTInstruction and + right = cmp.getRightOperand() and k = 0 or - cmp.hasOperands(left, right) and - cmp instanceof CompareLEValueNumber and + left = cmp.getLeftOperand() and + cmp instanceof CompareLEInstruction and + right = cmp.getRightOperand() and k = 1 or - cmp.hasOperands(right, left) and - cmp instanceof CompareGTValueNumber and + right = cmp.getLeftOperand() and + cmp instanceof CompareGTInstruction and + left = cmp.getRightOperand() and k = 0 or - cmp.hasOperands(right, left) and - cmp instanceof CompareGEValueNumber and + right = cmp.getLeftOperand() and + cmp instanceof CompareGEInstruction and + left = cmp.getRightOperand() and k = 1 } /** Rearrange various simple comparisons into `op < k` form. */ private predicate unary_simple_comparison_lt( - SwitchConditionValueNumber test, Operand op, int k, boolean isLt, AbstractValue value + Instruction test, int k, boolean isLt, AbstractValue value ) { - exists(CaseEdge case | - test.getExpressionOperand() = op and + exists(SwitchInstruction switch, CaseEdge case | + test = switch.getExpression() and case = value.(MatchValue).getCase() and - exists(test.getSuccessor(case)) and + exists(switch.getSuccessor(case)) and case.getMaxValue() > case.getMinValue() | // op <= k => op < k - 1 @@ -1188,7 +1081,7 @@ private predicate unary_simple_comparison_lt( } private predicate complex_lt( - ValueNumber cmp, Operand left, Operand right, int k, boolean isLt, AbstractValue value + CompareInstruction cmp, Operand left, Operand right, int k, boolean isLt, AbstractValue value ) { sub_lt(cmp, left, right, k, isLt, value) or @@ -1196,7 +1089,7 @@ private predicate complex_lt( } private predicate complex_lt( - ValueNumber test, Operand left, int k, boolean isLt, AbstractValue value + Instruction test, Operand left, int k, boolean isLt, AbstractValue value ) { sub_lt(test, left, k, isLt, value) or @@ -1206,7 +1099,7 @@ private predicate complex_lt( // left - x < right + c => left < right + (c+x) // left < (right - x) + c => left < right + (c-x) private predicate sub_lt( - ValueNumber cmp, Operand left, Operand right, int k, boolean isLt, AbstractValue value + CompareInstruction cmp, Operand left, Operand right, int k, boolean isLt, AbstractValue value ) { exists(SubInstruction lhs, int c, int x | compares_lt(cmp, lhs.getAUse(), right, c, isLt, value) and @@ -1237,7 +1130,7 @@ private predicate sub_lt( ) } -private predicate sub_lt(ValueNumber test, Operand left, int k, boolean isLt, AbstractValue value) { +private predicate sub_lt(Instruction test, Operand left, int k, boolean isLt, AbstractValue value) { exists(SubInstruction lhs, int c, int x | compares_lt(test, lhs.getAUse(), c, isLt, value) and left = lhs.getLeftOperand() and @@ -1256,7 +1149,7 @@ private predicate sub_lt(ValueNumber test, Operand left, int k, boolean isLt, Ab // left + x < right + c => left < right + (c-x) // left < (right + x) + c => left < right + (c+x) private predicate add_lt( - ValueNumber cmp, Operand left, Operand right, int k, boolean isLt, AbstractValue value + CompareInstruction cmp, Operand left, Operand right, int k, boolean isLt, AbstractValue value ) { exists(AddInstruction lhs, int c, int x | compares_lt(cmp, lhs.getAUse(), right, c, isLt, value) and @@ -1299,7 +1192,7 @@ private predicate add_lt( ) } -private predicate add_lt(ValueNumber test, Operand left, int k, boolean isLt, AbstractValue value) { +private predicate add_lt(Instruction test, Operand left, int k, boolean isLt, AbstractValue value) { exists(AddInstruction lhs, int c, int x | compares_lt(test, lhs.getAUse(), c, isLt, value) and ( @@ -1324,7 +1217,7 @@ private predicate add_lt(ValueNumber test, Operand left, int k, boolean isLt, Ab // left - x == right + c => left == right + (c+x) // left == (right - x) + c => left == right + (c-x) private predicate sub_eq( - ValueNumber cmp, Operand left, Operand right, int k, boolean areEqual, AbstractValue value + CompareInstruction cmp, Operand left, Operand right, int k, boolean areEqual, AbstractValue value ) { exists(SubInstruction lhs, int c, int x | compares_eq(cmp, lhs.getAUse(), right, c, areEqual, value) and @@ -1357,7 +1250,7 @@ private predicate sub_eq( // op - x == c => op == (c+x) private predicate unary_sub_eq( - ValueNumber test, Operand op, int k, boolean areEqual, boolean inNonZeroCase, AbstractValue value + Instruction test, Operand op, int k, boolean areEqual, boolean inNonZeroCase, AbstractValue value ) { inNonZeroCase = false and exists(SubInstruction sub, int c, int x | @@ -1379,7 +1272,7 @@ private predicate unary_sub_eq( // left + x == right + c => left == right + (c-x) // left == (right + x) + c => left == right + (c+x) private predicate add_eq( - ValueNumber cmp, Operand left, Operand right, int k, boolean areEqual, AbstractValue value + CompareInstruction cmp, Operand left, Operand right, int k, boolean areEqual, AbstractValue value ) { exists(AddInstruction lhs, int c, int x | compares_eq(cmp, lhs.getAUse(), right, c, areEqual, value) and @@ -1424,7 +1317,7 @@ private predicate add_eq( // left + x == right + c => left == right + (c-x) private predicate unary_add_eq( - ValueNumber test, Operand left, int k, boolean areEqual, boolean inNonZeroCase, + Instruction test, Operand left, int k, boolean areEqual, boolean inNonZeroCase, AbstractValue value ) { inNonZeroCase = false and @@ -1458,4 +1351,6 @@ private class IntegerOrPointerConstantInstruction extends ConstantInstruction { } /** The int value of integer constant expression. */ -private int int_value(IntegerOrPointerConstantInstruction i) { result = i.getValue().toInt() } +private int int_value(Instruction i) { + result = i.(IntegerOrPointerConstantInstruction).getValue().toInt() +} diff --git a/cpp/ql/lib/semmle/code/cpp/dataflow/DataFlow.qll b/cpp/ql/lib/semmle/code/cpp/dataflow/DataFlow.qll index 505b2e190e5..a478da5193e 100644 --- a/cpp/ql/lib/semmle/code/cpp/dataflow/DataFlow.qll +++ b/cpp/ql/lib/semmle/code/cpp/dataflow/DataFlow.qll @@ -29,5 +29,5 @@ deprecated module DataFlow { private import semmle.code.cpp.dataflow.internal.DataFlowImplSpecific private import codeql.dataflow.DataFlow import DataFlowMake - import semmle.code.cpp.dataflow.internal.DataFlowImpl1 + import Public } diff --git a/cpp/ql/lib/semmle/code/cpp/dataflow/DataFlow2.qll b/cpp/ql/lib/semmle/code/cpp/dataflow/DataFlow2.qll deleted file mode 100644 index 19ffa16b76c..00000000000 --- a/cpp/ql/lib/semmle/code/cpp/dataflow/DataFlow2.qll +++ /dev/null @@ -1,22 +0,0 @@ -/** - * Provides a `DataFlow2` module, which is a copy of the `DataFlow` module. Use - * this class when data-flow configurations must depend on each other. Two - * classes extending `DataFlow::Configuration` should never depend on each - * other, but one of them should instead depend on a - * `DataFlow2::Configuration`, a `DataFlow3::Configuration`, or a - * `DataFlow4::Configuration`. - * - * See `semmle.code.cpp.dataflow.DataFlow` for the full documentation. - */ - -import cpp - -/** - * DEPRECATED: Use `semmle.code.cpp.dataflow.new.DataFlow2` instead. - * - * Provides classes for performing local (intra-procedural) and - * global (inter-procedural) data flow analyses. - */ -deprecated module DataFlow2 { - import semmle.code.cpp.dataflow.internal.DataFlowImpl2 -} diff --git a/cpp/ql/lib/semmle/code/cpp/dataflow/DataFlow3.qll b/cpp/ql/lib/semmle/code/cpp/dataflow/DataFlow3.qll deleted file mode 100644 index 554b2e155b4..00000000000 --- a/cpp/ql/lib/semmle/code/cpp/dataflow/DataFlow3.qll +++ /dev/null @@ -1,22 +0,0 @@ -/** - * Provides a `DataFlow3` module, which is a copy of the `DataFlow` module. Use - * this class when data-flow configurations must depend on each other. Two - * classes extending `DataFlow::Configuration` should never depend on each - * other, but one of them should instead depend on a - * `DataFlow2::Configuration`, a `DataFlow3::Configuration`, or a - * `DataFlow4::Configuration`. - * - * See `semmle.code.cpp.dataflow.DataFlow` for the full documentation. - */ - -import cpp - -/** - * DEPRECATED: Use `semmle.code.cpp.dataflow.new.DataFlow3` instead. - * - * Provides classes for performing local (intra-procedural) and - * global (inter-procedural) data flow analyses. - */ -deprecated module DataFlow3 { - import semmle.code.cpp.dataflow.internal.DataFlowImpl3 -} diff --git a/cpp/ql/lib/semmle/code/cpp/dataflow/DataFlow4.qll b/cpp/ql/lib/semmle/code/cpp/dataflow/DataFlow4.qll deleted file mode 100644 index fdd4e8ab7ae..00000000000 --- a/cpp/ql/lib/semmle/code/cpp/dataflow/DataFlow4.qll +++ /dev/null @@ -1,22 +0,0 @@ -/** - * Provides a `DataFlow4` module, which is a copy of the `DataFlow` module. Use - * this class when data-flow configurations must depend on each other. Two - * classes extending `DataFlow::Configuration` should never depend on each - * other, but one of them should instead depend on a - * `DataFlow2::Configuration`, a `DataFlow3::Configuration`, or a - * `DataFlow4::Configuration`. - * - * See `semmle.code.cpp.dataflow.DataFlow` for the full documentation. - */ - -import cpp - -/** - * DEPRECATED: Use `semmle.code.cpp.dataflow.new.DataFlow4` instead. - * - * Provides classes for performing local (intra-procedural) and - * global (inter-procedural) data flow analyses. - */ -deprecated module DataFlow4 { - import semmle.code.cpp.dataflow.internal.DataFlowImpl4 -} diff --git a/cpp/ql/lib/semmle/code/cpp/dataflow/RecursionPrevention.qll b/cpp/ql/lib/semmle/code/cpp/dataflow/RecursionPrevention.qll deleted file mode 100644 index 2d8b52f8622..00000000000 --- a/cpp/ql/lib/semmle/code/cpp/dataflow/RecursionPrevention.qll +++ /dev/null @@ -1,39 +0,0 @@ -/** - * DEPRECATED: Recursion through `DataFlow::Configuration` is impossible in - * any supported tooling. There is no need for this module because it's - * impossible to accidentally depend on recursion through - * `DataFlow::Configuration` in current releases. - * - * When this module is imported, recursive use of `DataFlow::Configuration` is - * disallowed. Importing this module will guarantee the absence of such - * recursion, which is unsupported and will be unconditionally disallowed in a - * future release. - * - * Recursive use of `DataFlow{2..4}::Configuration` is always disallowed, so no - * import is needed for those. - */ - -import cpp -private import semmle.code.cpp.dataflow.DataFlow - -/** - * This class exists to prevent mutual recursion between the user-overridden - * member predicates of `Configuration` and the rest of the data-flow library. - * Good performance cannot be guaranteed in the presence of such recursion, so - * it should be replaced by using more than one copy of the data flow library. - * Four copies are available: `DataFlow` through `DataFlow4`. - */ -abstract private class ConfigurationRecursionPrevention extends DataFlow::Configuration { - bindingset[this] - ConfigurationRecursionPrevention() { any() } - - override predicate hasFlow(DataFlow::Node source, DataFlow::Node sink) { - strictcount(DataFlow::Node n | this.isSource(n)) < 0 - or - strictcount(DataFlow::Node n | this.isSink(n)) < 0 - or - strictcount(DataFlow::Node n1, DataFlow::Node n2 | this.isAdditionalFlowStep(n1, n2)) < 0 - or - super.hasFlow(source, sink) - } -} diff --git a/cpp/ql/lib/semmle/code/cpp/dataflow/TaintTracking.qll b/cpp/ql/lib/semmle/code/cpp/dataflow/TaintTracking.qll index 1f93e2a74df..36af8d9660b 100644 --- a/cpp/ql/lib/semmle/code/cpp/dataflow/TaintTracking.qll +++ b/cpp/ql/lib/semmle/code/cpp/dataflow/TaintTracking.qll @@ -16,7 +16,6 @@ */ import semmle.code.cpp.dataflow.DataFlow -import semmle.code.cpp.dataflow.DataFlow2 /** * DEPRECATED: Use `semmle.code.cpp.dataflow.new.TaintTracking` instead. @@ -25,10 +24,9 @@ import semmle.code.cpp.dataflow.DataFlow2 * global (inter-procedural) taint-tracking analyses. */ deprecated module TaintTracking { - import semmle.code.cpp.dataflow.internal.tainttracking1.TaintTrackingParameter::Public + import semmle.code.cpp.dataflow.internal.TaintTrackingUtil private import semmle.code.cpp.dataflow.internal.DataFlowImplSpecific private import semmle.code.cpp.dataflow.internal.TaintTrackingImplSpecific private import codeql.dataflow.TaintTracking import TaintFlowMake - import semmle.code.cpp.dataflow.internal.tainttracking1.TaintTrackingImpl } diff --git a/cpp/ql/lib/semmle/code/cpp/dataflow/TaintTracking2.qll b/cpp/ql/lib/semmle/code/cpp/dataflow/TaintTracking2.qll deleted file mode 100644 index dce00316cbb..00000000000 --- a/cpp/ql/lib/semmle/code/cpp/dataflow/TaintTracking2.qll +++ /dev/null @@ -1,22 +0,0 @@ -/** - * Provides a `TaintTracking2` module, which is a copy of the `TaintTracking` - * module. Use this class when data-flow configurations or taint-tracking - * configurations must depend on each other. Two classes extending - * `DataFlow::Configuration` should never depend on each other, but one of them - * should instead depend on a `DataFlow2::Configuration`, a - * `DataFlow3::Configuration`, or a `DataFlow4::Configuration`. The - * `TaintTracking::Configuration` class extends `DataFlow::Configuration`, and - * `TaintTracking2::Configuration` extends `DataFlow2::Configuration`. - * - * See `semmle.code.cpp.dataflow.TaintTracking` for the full documentation. - */ - -/** - * DEPRECATED: Use `semmle.code.cpp.dataflow.new.TaintTracking2` instead. - * - * Provides classes for performing local (intra-procedural) and - * global (inter-procedural) taint-tracking analyses. - */ -deprecated module TaintTracking2 { - import semmle.code.cpp.dataflow.internal.tainttracking2.TaintTrackingImpl -} diff --git a/cpp/ql/lib/semmle/code/cpp/dataflow/internal/DataFlowImpl1.qll b/cpp/ql/lib/semmle/code/cpp/dataflow/internal/DataFlowImpl1.qll deleted file mode 100644 index 17def0c431d..00000000000 --- a/cpp/ql/lib/semmle/code/cpp/dataflow/internal/DataFlowImpl1.qll +++ /dev/null @@ -1,361 +0,0 @@ -/** - * DEPRECATED: Use `Global` and `GlobalWithState` instead. - * - * Provides a `Configuration` class backwards-compatible interface to the data - * flow library. - */ - -private import DataFlowImplCommon -private import DataFlowImplSpecific::Private -import DataFlowImplSpecific::Public -private import DataFlowImpl -import DataFlowImplCommonPublic -deprecated import FlowStateString -private import codeql.util.Unit - -/** - * DEPRECATED: Use `Global` and `GlobalWithState` instead. - * - * A configuration of interprocedural data flow analysis. This defines - * sources, sinks, and any other configurable aspect of the analysis. Each - * use of the global data flow library must define its own unique extension - * of this abstract class. To create a configuration, extend this class with - * a subclass whose characteristic predicate is a unique singleton string. - * For example, write - * - * ```ql - * class MyAnalysisConfiguration extends DataFlow::Configuration { - * MyAnalysisConfiguration() { this = "MyAnalysisConfiguration" } - * // Override `isSource` and `isSink`. - * // Optionally override `isBarrier`. - * // Optionally override `isAdditionalFlowStep`. - * } - * ``` - * Conceptually, this defines a graph where the nodes are `DataFlow::Node`s and - * the edges are those data-flow steps that preserve the value of the node - * along with any additional edges defined by `isAdditionalFlowStep`. - * Specifying nodes in `isBarrier` will remove those nodes from the graph, and - * specifying nodes in `isBarrierIn` and/or `isBarrierOut` will remove in-going - * and/or out-going edges from those nodes, respectively. - * - * Then, to query whether there is flow between some `source` and `sink`, - * write - * - * ```ql - * exists(MyAnalysisConfiguration cfg | cfg.hasFlow(source, sink)) - * ``` - * - * Multiple configurations can coexist, but two classes extending - * `DataFlow::Configuration` should never depend on each other. One of them - * should instead depend on a `DataFlow2::Configuration`, a - * `DataFlow3::Configuration`, or a `DataFlow4::Configuration`. - */ -abstract deprecated class Configuration extends string { - bindingset[this] - Configuration() { any() } - - /** - * Holds if `source` is a relevant data flow source. - */ - predicate isSource(Node source) { none() } - - /** - * Holds if `source` is a relevant data flow source with the given initial - * `state`. - */ - predicate isSource(Node source, FlowState state) { none() } - - /** - * Holds if `sink` is a relevant data flow sink. - */ - predicate isSink(Node sink) { none() } - - /** - * Holds if `sink` is a relevant data flow sink accepting `state`. - */ - predicate isSink(Node sink, FlowState state) { none() } - - /** - * Holds if data flow through `node` is prohibited. This completely removes - * `node` from the data flow graph. - */ - predicate isBarrier(Node node) { none() } - - /** - * Holds if data flow through `node` is prohibited when the flow state is - * `state`. - */ - predicate isBarrier(Node node, FlowState state) { none() } - - /** Holds if data flow into `node` is prohibited. */ - predicate isBarrierIn(Node node) { none() } - - /** Holds if data flow out of `node` is prohibited. */ - predicate isBarrierOut(Node node) { none() } - - /** - * Holds if data may flow from `node1` to `node2` in addition to the normal data-flow steps. - */ - predicate isAdditionalFlowStep(Node node1, Node node2) { none() } - - /** - * Holds if data may flow from `node1` to `node2` in addition to the normal data-flow steps. - * This step is only applicable in `state1` and updates the flow state to `state2`. - */ - predicate isAdditionalFlowStep(Node node1, FlowState state1, Node node2, FlowState state2) { - none() - } - - /** - * Holds if an arbitrary number of implicit read steps of content `c` may be - * taken at `node`. - */ - predicate allowImplicitRead(Node node, ContentSet c) { none() } - - /** - * Gets the virtual dispatch branching limit when calculating field flow. - * This can be overridden to a smaller value to improve performance (a - * value of 0 disables field flow), or a larger value to get more results. - */ - int fieldFlowBranchLimit() { result = 2 } - - /** - * Gets a data flow configuration feature to add restrictions to the set of - * valid flow paths. - * - * - `FeatureHasSourceCallContext`: - * Assume that sources have some existing call context to disallow - * conflicting return-flow directly following the source. - * - `FeatureHasSinkCallContext`: - * Assume that sinks have some existing call context to disallow - * conflicting argument-to-parameter flow directly preceding the sink. - * - `FeatureEqualSourceSinkCallContext`: - * Implies both of the above and additionally ensures that the entire flow - * path preserves the call context. - * - * These features are generally not relevant for typical end-to-end data flow - * queries, but should only be used for constructing paths that need to - * somehow be pluggable in another path context. - */ - FlowFeature getAFeature() { none() } - - /** Holds if sources should be grouped in the result of `hasFlowPath`. */ - predicate sourceGrouping(Node source, string sourceGroup) { none() } - - /** Holds if sinks should be grouped in the result of `hasFlowPath`. */ - predicate sinkGrouping(Node sink, string sinkGroup) { none() } - - /** - * Holds if data may flow from `source` to `sink` for this configuration. - */ - predicate hasFlow(Node source, Node sink) { hasFlow(source, sink, this) } - - /** - * Holds if data may flow from `source` to `sink` for this configuration. - * - * The corresponding paths are generated from the end-points and the graph - * included in the module `PathGraph`. - */ - predicate hasFlowPath(PathNode source, PathNode sink) { hasFlowPath(source, sink, this) } - - /** - * Holds if data may flow from some source to `sink` for this configuration. - */ - predicate hasFlowTo(Node sink) { hasFlowTo(sink, this) } - - /** - * Holds if data may flow from some source to `sink` for this configuration. - */ - predicate hasFlowToExpr(DataFlowExpr sink) { this.hasFlowTo(exprNode(sink)) } - - /** - * Holds if hidden nodes should be included in the data flow graph. - * - * This feature should only be used for debugging or when the data flow graph - * is not visualized (for example in a `path-problem` query). - */ - predicate includeHiddenNodes() { none() } -} - -/** - * This class exists to prevent mutual recursion between the user-overridden - * member predicates of `Configuration` and the rest of the data-flow library. - * Good performance cannot be guaranteed in the presence of such recursion, so - * it should be replaced by using more than one copy of the data flow library. - */ -abstract deprecated private class ConfigurationRecursionPrevention extends Configuration { - bindingset[this] - ConfigurationRecursionPrevention() { any() } - - override predicate hasFlow(Node source, Node sink) { - strictcount(Node n | this.isSource(n)) < 0 - or - strictcount(Node n | this.isSource(n, _)) < 0 - or - strictcount(Node n | this.isSink(n)) < 0 - or - strictcount(Node n | this.isSink(n, _)) < 0 - or - strictcount(Node n1, Node n2 | this.isAdditionalFlowStep(n1, n2)) < 0 - or - strictcount(Node n1, Node n2 | this.isAdditionalFlowStep(n1, _, n2, _)) < 0 - or - super.hasFlow(source, sink) - } -} - -deprecated private FlowState relevantState(Configuration config) { - config.isSource(_, result) or - config.isSink(_, result) or - config.isBarrier(_, result) or - config.isAdditionalFlowStep(_, result, _, _) or - config.isAdditionalFlowStep(_, _, _, result) -} - -private newtype TConfigState = - deprecated TMkConfigState(Configuration config, FlowState state) { - state = relevantState(config) or state instanceof FlowStateEmpty - } - -deprecated private Configuration getConfig(TConfigState state) { state = TMkConfigState(result, _) } - -deprecated private FlowState getState(TConfigState state) { state = TMkConfigState(_, result) } - -deprecated private predicate singleConfiguration() { 1 = strictcount(Configuration c) } - -deprecated private module Config implements FullStateConfigSig { - class FlowState = TConfigState; - - predicate isSource(Node source, FlowState state) { - getConfig(state).isSource(source, getState(state)) - or - getConfig(state).isSource(source) and getState(state) instanceof FlowStateEmpty - } - - predicate isSink(Node sink) { none() } - - predicate isSink(Node sink, FlowState state) { - getConfig(state).isSink(sink, getState(state)) - or - getConfig(state).isSink(sink) and getState(state) instanceof FlowStateEmpty - } - - predicate isBarrier(Node node) { none() } - - predicate isBarrier(Node node, FlowState state) { - getConfig(state).isBarrier(node, getState(state)) or - getConfig(state).isBarrier(node) - } - - predicate isBarrierIn(Node node) { any(Configuration config).isBarrierIn(node) } - - predicate isBarrierOut(Node node) { any(Configuration config).isBarrierOut(node) } - - predicate isBarrierIn(Node node, FlowState state) { none() } - - predicate isBarrierOut(Node node, FlowState state) { none() } - - predicate isAdditionalFlowStep(Node node1, Node node2, string model) { - singleConfiguration() and - any(Configuration config).isAdditionalFlowStep(node1, node2) and - model = "" - } - - predicate isAdditionalFlowStep( - Node node1, FlowState state1, Node node2, FlowState state2, string model - ) { - getConfig(state1).isAdditionalFlowStep(node1, getState(state1), node2, getState(state2)) and - getConfig(state2) = getConfig(state1) and - model = "" - or - not singleConfiguration() and - getConfig(state1).isAdditionalFlowStep(node1, node2) and - state2 = state1 and - model = "" - } - - predicate allowImplicitRead(Node node, ContentSet c) { - any(Configuration config).allowImplicitRead(node, c) - } - - predicate neverSkip(Node node) { none() } - - int fieldFlowBranchLimit() { result = min(any(Configuration config).fieldFlowBranchLimit()) } - - int accessPathLimit() { result = 5 } - - FlowFeature getAFeature() { result = any(Configuration config).getAFeature() } - - predicate includeHiddenNodes() { any(Configuration config).includeHiddenNodes() } - - predicate observeDiffInformedIncrementalMode() { none() } -} - -deprecated private import Impl as I - -/** - * A `Node` augmented with a call context (except for sinks), an access path, and a configuration. - * Only those `PathNode`s that are reachable from a source, and which can reach a sink, are generated. - */ -deprecated class PathNode instanceof I::PathNode { - /** Gets a textual representation of this element. */ - final string toString() { result = super.toString() } - - /** - * Gets a textual representation of this element, including a textual - * representation of the call context. - */ - final string toStringWithContext() { result = super.toStringWithContext() } - - /** - * Holds if this element is at the specified location. - * The location spans column `startcolumn` of line `startline` to - * column `endcolumn` of line `endline` in file `filepath`. - * For more information, see - * [Locations](https://codeql.github.com/docs/writing-codeql-queries/providing-locations-in-codeql-queries/). - */ - final predicate hasLocationInfo( - string filepath, int startline, int startcolumn, int endline, int endcolumn - ) { - super.hasLocationInfo(filepath, startline, startcolumn, endline, endcolumn) - } - - /** Gets the underlying `Node`. */ - final Node getNode() { result = super.getNode() } - - /** Gets the `FlowState` of this node. */ - deprecated final FlowState getState() { result = getState(super.getState()) } - - /** Gets the associated configuration. */ - deprecated final Configuration getConfiguration() { result = getConfig(super.getState()) } - - /** Gets a successor of this node, if any. */ - final PathNode getASuccessor() { result = super.getASuccessor() } - - /** Holds if this node is a source. */ - final predicate isSource() { super.isSource() } - - /** Holds if this node is a grouping of source nodes. */ - final predicate isSourceGroup(string group) { super.isSourceGroup(group) } - - /** Holds if this node is a grouping of sink nodes. */ - final predicate isSinkGroup(string group) { super.isSinkGroup(group) } -} - -deprecated module PathGraph = I::PathGraph; - -deprecated private predicate hasFlow(Node source, Node sink, Configuration config) { - exists(PathNode source0, PathNode sink0 | - hasFlowPath(source0, sink0, config) and - source0.getNode() = source and - sink0.getNode() = sink - ) -} - -deprecated private predicate hasFlowPath(PathNode source, PathNode sink, Configuration config) { - I::flowPath(source, sink) and source.getConfiguration() = config -} - -deprecated private predicate hasFlowTo(Node sink, Configuration config) { hasFlow(_, sink, config) } - -deprecated predicate flowsTo = hasFlow/3; diff --git a/cpp/ql/lib/semmle/code/cpp/dataflow/internal/DataFlowImpl2.qll b/cpp/ql/lib/semmle/code/cpp/dataflow/internal/DataFlowImpl2.qll deleted file mode 100644 index 17def0c431d..00000000000 --- a/cpp/ql/lib/semmle/code/cpp/dataflow/internal/DataFlowImpl2.qll +++ /dev/null @@ -1,361 +0,0 @@ -/** - * DEPRECATED: Use `Global` and `GlobalWithState` instead. - * - * Provides a `Configuration` class backwards-compatible interface to the data - * flow library. - */ - -private import DataFlowImplCommon -private import DataFlowImplSpecific::Private -import DataFlowImplSpecific::Public -private import DataFlowImpl -import DataFlowImplCommonPublic -deprecated import FlowStateString -private import codeql.util.Unit - -/** - * DEPRECATED: Use `Global` and `GlobalWithState` instead. - * - * A configuration of interprocedural data flow analysis. This defines - * sources, sinks, and any other configurable aspect of the analysis. Each - * use of the global data flow library must define its own unique extension - * of this abstract class. To create a configuration, extend this class with - * a subclass whose characteristic predicate is a unique singleton string. - * For example, write - * - * ```ql - * class MyAnalysisConfiguration extends DataFlow::Configuration { - * MyAnalysisConfiguration() { this = "MyAnalysisConfiguration" } - * // Override `isSource` and `isSink`. - * // Optionally override `isBarrier`. - * // Optionally override `isAdditionalFlowStep`. - * } - * ``` - * Conceptually, this defines a graph where the nodes are `DataFlow::Node`s and - * the edges are those data-flow steps that preserve the value of the node - * along with any additional edges defined by `isAdditionalFlowStep`. - * Specifying nodes in `isBarrier` will remove those nodes from the graph, and - * specifying nodes in `isBarrierIn` and/or `isBarrierOut` will remove in-going - * and/or out-going edges from those nodes, respectively. - * - * Then, to query whether there is flow between some `source` and `sink`, - * write - * - * ```ql - * exists(MyAnalysisConfiguration cfg | cfg.hasFlow(source, sink)) - * ``` - * - * Multiple configurations can coexist, but two classes extending - * `DataFlow::Configuration` should never depend on each other. One of them - * should instead depend on a `DataFlow2::Configuration`, a - * `DataFlow3::Configuration`, or a `DataFlow4::Configuration`. - */ -abstract deprecated class Configuration extends string { - bindingset[this] - Configuration() { any() } - - /** - * Holds if `source` is a relevant data flow source. - */ - predicate isSource(Node source) { none() } - - /** - * Holds if `source` is a relevant data flow source with the given initial - * `state`. - */ - predicate isSource(Node source, FlowState state) { none() } - - /** - * Holds if `sink` is a relevant data flow sink. - */ - predicate isSink(Node sink) { none() } - - /** - * Holds if `sink` is a relevant data flow sink accepting `state`. - */ - predicate isSink(Node sink, FlowState state) { none() } - - /** - * Holds if data flow through `node` is prohibited. This completely removes - * `node` from the data flow graph. - */ - predicate isBarrier(Node node) { none() } - - /** - * Holds if data flow through `node` is prohibited when the flow state is - * `state`. - */ - predicate isBarrier(Node node, FlowState state) { none() } - - /** Holds if data flow into `node` is prohibited. */ - predicate isBarrierIn(Node node) { none() } - - /** Holds if data flow out of `node` is prohibited. */ - predicate isBarrierOut(Node node) { none() } - - /** - * Holds if data may flow from `node1` to `node2` in addition to the normal data-flow steps. - */ - predicate isAdditionalFlowStep(Node node1, Node node2) { none() } - - /** - * Holds if data may flow from `node1` to `node2` in addition to the normal data-flow steps. - * This step is only applicable in `state1` and updates the flow state to `state2`. - */ - predicate isAdditionalFlowStep(Node node1, FlowState state1, Node node2, FlowState state2) { - none() - } - - /** - * Holds if an arbitrary number of implicit read steps of content `c` may be - * taken at `node`. - */ - predicate allowImplicitRead(Node node, ContentSet c) { none() } - - /** - * Gets the virtual dispatch branching limit when calculating field flow. - * This can be overridden to a smaller value to improve performance (a - * value of 0 disables field flow), or a larger value to get more results. - */ - int fieldFlowBranchLimit() { result = 2 } - - /** - * Gets a data flow configuration feature to add restrictions to the set of - * valid flow paths. - * - * - `FeatureHasSourceCallContext`: - * Assume that sources have some existing call context to disallow - * conflicting return-flow directly following the source. - * - `FeatureHasSinkCallContext`: - * Assume that sinks have some existing call context to disallow - * conflicting argument-to-parameter flow directly preceding the sink. - * - `FeatureEqualSourceSinkCallContext`: - * Implies both of the above and additionally ensures that the entire flow - * path preserves the call context. - * - * These features are generally not relevant for typical end-to-end data flow - * queries, but should only be used for constructing paths that need to - * somehow be pluggable in another path context. - */ - FlowFeature getAFeature() { none() } - - /** Holds if sources should be grouped in the result of `hasFlowPath`. */ - predicate sourceGrouping(Node source, string sourceGroup) { none() } - - /** Holds if sinks should be grouped in the result of `hasFlowPath`. */ - predicate sinkGrouping(Node sink, string sinkGroup) { none() } - - /** - * Holds if data may flow from `source` to `sink` for this configuration. - */ - predicate hasFlow(Node source, Node sink) { hasFlow(source, sink, this) } - - /** - * Holds if data may flow from `source` to `sink` for this configuration. - * - * The corresponding paths are generated from the end-points and the graph - * included in the module `PathGraph`. - */ - predicate hasFlowPath(PathNode source, PathNode sink) { hasFlowPath(source, sink, this) } - - /** - * Holds if data may flow from some source to `sink` for this configuration. - */ - predicate hasFlowTo(Node sink) { hasFlowTo(sink, this) } - - /** - * Holds if data may flow from some source to `sink` for this configuration. - */ - predicate hasFlowToExpr(DataFlowExpr sink) { this.hasFlowTo(exprNode(sink)) } - - /** - * Holds if hidden nodes should be included in the data flow graph. - * - * This feature should only be used for debugging or when the data flow graph - * is not visualized (for example in a `path-problem` query). - */ - predicate includeHiddenNodes() { none() } -} - -/** - * This class exists to prevent mutual recursion between the user-overridden - * member predicates of `Configuration` and the rest of the data-flow library. - * Good performance cannot be guaranteed in the presence of such recursion, so - * it should be replaced by using more than one copy of the data flow library. - */ -abstract deprecated private class ConfigurationRecursionPrevention extends Configuration { - bindingset[this] - ConfigurationRecursionPrevention() { any() } - - override predicate hasFlow(Node source, Node sink) { - strictcount(Node n | this.isSource(n)) < 0 - or - strictcount(Node n | this.isSource(n, _)) < 0 - or - strictcount(Node n | this.isSink(n)) < 0 - or - strictcount(Node n | this.isSink(n, _)) < 0 - or - strictcount(Node n1, Node n2 | this.isAdditionalFlowStep(n1, n2)) < 0 - or - strictcount(Node n1, Node n2 | this.isAdditionalFlowStep(n1, _, n2, _)) < 0 - or - super.hasFlow(source, sink) - } -} - -deprecated private FlowState relevantState(Configuration config) { - config.isSource(_, result) or - config.isSink(_, result) or - config.isBarrier(_, result) or - config.isAdditionalFlowStep(_, result, _, _) or - config.isAdditionalFlowStep(_, _, _, result) -} - -private newtype TConfigState = - deprecated TMkConfigState(Configuration config, FlowState state) { - state = relevantState(config) or state instanceof FlowStateEmpty - } - -deprecated private Configuration getConfig(TConfigState state) { state = TMkConfigState(result, _) } - -deprecated private FlowState getState(TConfigState state) { state = TMkConfigState(_, result) } - -deprecated private predicate singleConfiguration() { 1 = strictcount(Configuration c) } - -deprecated private module Config implements FullStateConfigSig { - class FlowState = TConfigState; - - predicate isSource(Node source, FlowState state) { - getConfig(state).isSource(source, getState(state)) - or - getConfig(state).isSource(source) and getState(state) instanceof FlowStateEmpty - } - - predicate isSink(Node sink) { none() } - - predicate isSink(Node sink, FlowState state) { - getConfig(state).isSink(sink, getState(state)) - or - getConfig(state).isSink(sink) and getState(state) instanceof FlowStateEmpty - } - - predicate isBarrier(Node node) { none() } - - predicate isBarrier(Node node, FlowState state) { - getConfig(state).isBarrier(node, getState(state)) or - getConfig(state).isBarrier(node) - } - - predicate isBarrierIn(Node node) { any(Configuration config).isBarrierIn(node) } - - predicate isBarrierOut(Node node) { any(Configuration config).isBarrierOut(node) } - - predicate isBarrierIn(Node node, FlowState state) { none() } - - predicate isBarrierOut(Node node, FlowState state) { none() } - - predicate isAdditionalFlowStep(Node node1, Node node2, string model) { - singleConfiguration() and - any(Configuration config).isAdditionalFlowStep(node1, node2) and - model = "" - } - - predicate isAdditionalFlowStep( - Node node1, FlowState state1, Node node2, FlowState state2, string model - ) { - getConfig(state1).isAdditionalFlowStep(node1, getState(state1), node2, getState(state2)) and - getConfig(state2) = getConfig(state1) and - model = "" - or - not singleConfiguration() and - getConfig(state1).isAdditionalFlowStep(node1, node2) and - state2 = state1 and - model = "" - } - - predicate allowImplicitRead(Node node, ContentSet c) { - any(Configuration config).allowImplicitRead(node, c) - } - - predicate neverSkip(Node node) { none() } - - int fieldFlowBranchLimit() { result = min(any(Configuration config).fieldFlowBranchLimit()) } - - int accessPathLimit() { result = 5 } - - FlowFeature getAFeature() { result = any(Configuration config).getAFeature() } - - predicate includeHiddenNodes() { any(Configuration config).includeHiddenNodes() } - - predicate observeDiffInformedIncrementalMode() { none() } -} - -deprecated private import Impl as I - -/** - * A `Node` augmented with a call context (except for sinks), an access path, and a configuration. - * Only those `PathNode`s that are reachable from a source, and which can reach a sink, are generated. - */ -deprecated class PathNode instanceof I::PathNode { - /** Gets a textual representation of this element. */ - final string toString() { result = super.toString() } - - /** - * Gets a textual representation of this element, including a textual - * representation of the call context. - */ - final string toStringWithContext() { result = super.toStringWithContext() } - - /** - * Holds if this element is at the specified location. - * The location spans column `startcolumn` of line `startline` to - * column `endcolumn` of line `endline` in file `filepath`. - * For more information, see - * [Locations](https://codeql.github.com/docs/writing-codeql-queries/providing-locations-in-codeql-queries/). - */ - final predicate hasLocationInfo( - string filepath, int startline, int startcolumn, int endline, int endcolumn - ) { - super.hasLocationInfo(filepath, startline, startcolumn, endline, endcolumn) - } - - /** Gets the underlying `Node`. */ - final Node getNode() { result = super.getNode() } - - /** Gets the `FlowState` of this node. */ - deprecated final FlowState getState() { result = getState(super.getState()) } - - /** Gets the associated configuration. */ - deprecated final Configuration getConfiguration() { result = getConfig(super.getState()) } - - /** Gets a successor of this node, if any. */ - final PathNode getASuccessor() { result = super.getASuccessor() } - - /** Holds if this node is a source. */ - final predicate isSource() { super.isSource() } - - /** Holds if this node is a grouping of source nodes. */ - final predicate isSourceGroup(string group) { super.isSourceGroup(group) } - - /** Holds if this node is a grouping of sink nodes. */ - final predicate isSinkGroup(string group) { super.isSinkGroup(group) } -} - -deprecated module PathGraph = I::PathGraph; - -deprecated private predicate hasFlow(Node source, Node sink, Configuration config) { - exists(PathNode source0, PathNode sink0 | - hasFlowPath(source0, sink0, config) and - source0.getNode() = source and - sink0.getNode() = sink - ) -} - -deprecated private predicate hasFlowPath(PathNode source, PathNode sink, Configuration config) { - I::flowPath(source, sink) and source.getConfiguration() = config -} - -deprecated private predicate hasFlowTo(Node sink, Configuration config) { hasFlow(_, sink, config) } - -deprecated predicate flowsTo = hasFlow/3; diff --git a/cpp/ql/lib/semmle/code/cpp/dataflow/internal/DataFlowImpl3.qll b/cpp/ql/lib/semmle/code/cpp/dataflow/internal/DataFlowImpl3.qll deleted file mode 100644 index 17def0c431d..00000000000 --- a/cpp/ql/lib/semmle/code/cpp/dataflow/internal/DataFlowImpl3.qll +++ /dev/null @@ -1,361 +0,0 @@ -/** - * DEPRECATED: Use `Global` and `GlobalWithState` instead. - * - * Provides a `Configuration` class backwards-compatible interface to the data - * flow library. - */ - -private import DataFlowImplCommon -private import DataFlowImplSpecific::Private -import DataFlowImplSpecific::Public -private import DataFlowImpl -import DataFlowImplCommonPublic -deprecated import FlowStateString -private import codeql.util.Unit - -/** - * DEPRECATED: Use `Global` and `GlobalWithState` instead. - * - * A configuration of interprocedural data flow analysis. This defines - * sources, sinks, and any other configurable aspect of the analysis. Each - * use of the global data flow library must define its own unique extension - * of this abstract class. To create a configuration, extend this class with - * a subclass whose characteristic predicate is a unique singleton string. - * For example, write - * - * ```ql - * class MyAnalysisConfiguration extends DataFlow::Configuration { - * MyAnalysisConfiguration() { this = "MyAnalysisConfiguration" } - * // Override `isSource` and `isSink`. - * // Optionally override `isBarrier`. - * // Optionally override `isAdditionalFlowStep`. - * } - * ``` - * Conceptually, this defines a graph where the nodes are `DataFlow::Node`s and - * the edges are those data-flow steps that preserve the value of the node - * along with any additional edges defined by `isAdditionalFlowStep`. - * Specifying nodes in `isBarrier` will remove those nodes from the graph, and - * specifying nodes in `isBarrierIn` and/or `isBarrierOut` will remove in-going - * and/or out-going edges from those nodes, respectively. - * - * Then, to query whether there is flow between some `source` and `sink`, - * write - * - * ```ql - * exists(MyAnalysisConfiguration cfg | cfg.hasFlow(source, sink)) - * ``` - * - * Multiple configurations can coexist, but two classes extending - * `DataFlow::Configuration` should never depend on each other. One of them - * should instead depend on a `DataFlow2::Configuration`, a - * `DataFlow3::Configuration`, or a `DataFlow4::Configuration`. - */ -abstract deprecated class Configuration extends string { - bindingset[this] - Configuration() { any() } - - /** - * Holds if `source` is a relevant data flow source. - */ - predicate isSource(Node source) { none() } - - /** - * Holds if `source` is a relevant data flow source with the given initial - * `state`. - */ - predicate isSource(Node source, FlowState state) { none() } - - /** - * Holds if `sink` is a relevant data flow sink. - */ - predicate isSink(Node sink) { none() } - - /** - * Holds if `sink` is a relevant data flow sink accepting `state`. - */ - predicate isSink(Node sink, FlowState state) { none() } - - /** - * Holds if data flow through `node` is prohibited. This completely removes - * `node` from the data flow graph. - */ - predicate isBarrier(Node node) { none() } - - /** - * Holds if data flow through `node` is prohibited when the flow state is - * `state`. - */ - predicate isBarrier(Node node, FlowState state) { none() } - - /** Holds if data flow into `node` is prohibited. */ - predicate isBarrierIn(Node node) { none() } - - /** Holds if data flow out of `node` is prohibited. */ - predicate isBarrierOut(Node node) { none() } - - /** - * Holds if data may flow from `node1` to `node2` in addition to the normal data-flow steps. - */ - predicate isAdditionalFlowStep(Node node1, Node node2) { none() } - - /** - * Holds if data may flow from `node1` to `node2` in addition to the normal data-flow steps. - * This step is only applicable in `state1` and updates the flow state to `state2`. - */ - predicate isAdditionalFlowStep(Node node1, FlowState state1, Node node2, FlowState state2) { - none() - } - - /** - * Holds if an arbitrary number of implicit read steps of content `c` may be - * taken at `node`. - */ - predicate allowImplicitRead(Node node, ContentSet c) { none() } - - /** - * Gets the virtual dispatch branching limit when calculating field flow. - * This can be overridden to a smaller value to improve performance (a - * value of 0 disables field flow), or a larger value to get more results. - */ - int fieldFlowBranchLimit() { result = 2 } - - /** - * Gets a data flow configuration feature to add restrictions to the set of - * valid flow paths. - * - * - `FeatureHasSourceCallContext`: - * Assume that sources have some existing call context to disallow - * conflicting return-flow directly following the source. - * - `FeatureHasSinkCallContext`: - * Assume that sinks have some existing call context to disallow - * conflicting argument-to-parameter flow directly preceding the sink. - * - `FeatureEqualSourceSinkCallContext`: - * Implies both of the above and additionally ensures that the entire flow - * path preserves the call context. - * - * These features are generally not relevant for typical end-to-end data flow - * queries, but should only be used for constructing paths that need to - * somehow be pluggable in another path context. - */ - FlowFeature getAFeature() { none() } - - /** Holds if sources should be grouped in the result of `hasFlowPath`. */ - predicate sourceGrouping(Node source, string sourceGroup) { none() } - - /** Holds if sinks should be grouped in the result of `hasFlowPath`. */ - predicate sinkGrouping(Node sink, string sinkGroup) { none() } - - /** - * Holds if data may flow from `source` to `sink` for this configuration. - */ - predicate hasFlow(Node source, Node sink) { hasFlow(source, sink, this) } - - /** - * Holds if data may flow from `source` to `sink` for this configuration. - * - * The corresponding paths are generated from the end-points and the graph - * included in the module `PathGraph`. - */ - predicate hasFlowPath(PathNode source, PathNode sink) { hasFlowPath(source, sink, this) } - - /** - * Holds if data may flow from some source to `sink` for this configuration. - */ - predicate hasFlowTo(Node sink) { hasFlowTo(sink, this) } - - /** - * Holds if data may flow from some source to `sink` for this configuration. - */ - predicate hasFlowToExpr(DataFlowExpr sink) { this.hasFlowTo(exprNode(sink)) } - - /** - * Holds if hidden nodes should be included in the data flow graph. - * - * This feature should only be used for debugging or when the data flow graph - * is not visualized (for example in a `path-problem` query). - */ - predicate includeHiddenNodes() { none() } -} - -/** - * This class exists to prevent mutual recursion between the user-overridden - * member predicates of `Configuration` and the rest of the data-flow library. - * Good performance cannot be guaranteed in the presence of such recursion, so - * it should be replaced by using more than one copy of the data flow library. - */ -abstract deprecated private class ConfigurationRecursionPrevention extends Configuration { - bindingset[this] - ConfigurationRecursionPrevention() { any() } - - override predicate hasFlow(Node source, Node sink) { - strictcount(Node n | this.isSource(n)) < 0 - or - strictcount(Node n | this.isSource(n, _)) < 0 - or - strictcount(Node n | this.isSink(n)) < 0 - or - strictcount(Node n | this.isSink(n, _)) < 0 - or - strictcount(Node n1, Node n2 | this.isAdditionalFlowStep(n1, n2)) < 0 - or - strictcount(Node n1, Node n2 | this.isAdditionalFlowStep(n1, _, n2, _)) < 0 - or - super.hasFlow(source, sink) - } -} - -deprecated private FlowState relevantState(Configuration config) { - config.isSource(_, result) or - config.isSink(_, result) or - config.isBarrier(_, result) or - config.isAdditionalFlowStep(_, result, _, _) or - config.isAdditionalFlowStep(_, _, _, result) -} - -private newtype TConfigState = - deprecated TMkConfigState(Configuration config, FlowState state) { - state = relevantState(config) or state instanceof FlowStateEmpty - } - -deprecated private Configuration getConfig(TConfigState state) { state = TMkConfigState(result, _) } - -deprecated private FlowState getState(TConfigState state) { state = TMkConfigState(_, result) } - -deprecated private predicate singleConfiguration() { 1 = strictcount(Configuration c) } - -deprecated private module Config implements FullStateConfigSig { - class FlowState = TConfigState; - - predicate isSource(Node source, FlowState state) { - getConfig(state).isSource(source, getState(state)) - or - getConfig(state).isSource(source) and getState(state) instanceof FlowStateEmpty - } - - predicate isSink(Node sink) { none() } - - predicate isSink(Node sink, FlowState state) { - getConfig(state).isSink(sink, getState(state)) - or - getConfig(state).isSink(sink) and getState(state) instanceof FlowStateEmpty - } - - predicate isBarrier(Node node) { none() } - - predicate isBarrier(Node node, FlowState state) { - getConfig(state).isBarrier(node, getState(state)) or - getConfig(state).isBarrier(node) - } - - predicate isBarrierIn(Node node) { any(Configuration config).isBarrierIn(node) } - - predicate isBarrierOut(Node node) { any(Configuration config).isBarrierOut(node) } - - predicate isBarrierIn(Node node, FlowState state) { none() } - - predicate isBarrierOut(Node node, FlowState state) { none() } - - predicate isAdditionalFlowStep(Node node1, Node node2, string model) { - singleConfiguration() and - any(Configuration config).isAdditionalFlowStep(node1, node2) and - model = "" - } - - predicate isAdditionalFlowStep( - Node node1, FlowState state1, Node node2, FlowState state2, string model - ) { - getConfig(state1).isAdditionalFlowStep(node1, getState(state1), node2, getState(state2)) and - getConfig(state2) = getConfig(state1) and - model = "" - or - not singleConfiguration() and - getConfig(state1).isAdditionalFlowStep(node1, node2) and - state2 = state1 and - model = "" - } - - predicate allowImplicitRead(Node node, ContentSet c) { - any(Configuration config).allowImplicitRead(node, c) - } - - predicate neverSkip(Node node) { none() } - - int fieldFlowBranchLimit() { result = min(any(Configuration config).fieldFlowBranchLimit()) } - - int accessPathLimit() { result = 5 } - - FlowFeature getAFeature() { result = any(Configuration config).getAFeature() } - - predicate includeHiddenNodes() { any(Configuration config).includeHiddenNodes() } - - predicate observeDiffInformedIncrementalMode() { none() } -} - -deprecated private import Impl as I - -/** - * A `Node` augmented with a call context (except for sinks), an access path, and a configuration. - * Only those `PathNode`s that are reachable from a source, and which can reach a sink, are generated. - */ -deprecated class PathNode instanceof I::PathNode { - /** Gets a textual representation of this element. */ - final string toString() { result = super.toString() } - - /** - * Gets a textual representation of this element, including a textual - * representation of the call context. - */ - final string toStringWithContext() { result = super.toStringWithContext() } - - /** - * Holds if this element is at the specified location. - * The location spans column `startcolumn` of line `startline` to - * column `endcolumn` of line `endline` in file `filepath`. - * For more information, see - * [Locations](https://codeql.github.com/docs/writing-codeql-queries/providing-locations-in-codeql-queries/). - */ - final predicate hasLocationInfo( - string filepath, int startline, int startcolumn, int endline, int endcolumn - ) { - super.hasLocationInfo(filepath, startline, startcolumn, endline, endcolumn) - } - - /** Gets the underlying `Node`. */ - final Node getNode() { result = super.getNode() } - - /** Gets the `FlowState` of this node. */ - deprecated final FlowState getState() { result = getState(super.getState()) } - - /** Gets the associated configuration. */ - deprecated final Configuration getConfiguration() { result = getConfig(super.getState()) } - - /** Gets a successor of this node, if any. */ - final PathNode getASuccessor() { result = super.getASuccessor() } - - /** Holds if this node is a source. */ - final predicate isSource() { super.isSource() } - - /** Holds if this node is a grouping of source nodes. */ - final predicate isSourceGroup(string group) { super.isSourceGroup(group) } - - /** Holds if this node is a grouping of sink nodes. */ - final predicate isSinkGroup(string group) { super.isSinkGroup(group) } -} - -deprecated module PathGraph = I::PathGraph; - -deprecated private predicate hasFlow(Node source, Node sink, Configuration config) { - exists(PathNode source0, PathNode sink0 | - hasFlowPath(source0, sink0, config) and - source0.getNode() = source and - sink0.getNode() = sink - ) -} - -deprecated private predicate hasFlowPath(PathNode source, PathNode sink, Configuration config) { - I::flowPath(source, sink) and source.getConfiguration() = config -} - -deprecated private predicate hasFlowTo(Node sink, Configuration config) { hasFlow(_, sink, config) } - -deprecated predicate flowsTo = hasFlow/3; diff --git a/cpp/ql/lib/semmle/code/cpp/dataflow/internal/DataFlowImpl4.qll b/cpp/ql/lib/semmle/code/cpp/dataflow/internal/DataFlowImpl4.qll deleted file mode 100644 index 17def0c431d..00000000000 --- a/cpp/ql/lib/semmle/code/cpp/dataflow/internal/DataFlowImpl4.qll +++ /dev/null @@ -1,361 +0,0 @@ -/** - * DEPRECATED: Use `Global` and `GlobalWithState` instead. - * - * Provides a `Configuration` class backwards-compatible interface to the data - * flow library. - */ - -private import DataFlowImplCommon -private import DataFlowImplSpecific::Private -import DataFlowImplSpecific::Public -private import DataFlowImpl -import DataFlowImplCommonPublic -deprecated import FlowStateString -private import codeql.util.Unit - -/** - * DEPRECATED: Use `Global` and `GlobalWithState` instead. - * - * A configuration of interprocedural data flow analysis. This defines - * sources, sinks, and any other configurable aspect of the analysis. Each - * use of the global data flow library must define its own unique extension - * of this abstract class. To create a configuration, extend this class with - * a subclass whose characteristic predicate is a unique singleton string. - * For example, write - * - * ```ql - * class MyAnalysisConfiguration extends DataFlow::Configuration { - * MyAnalysisConfiguration() { this = "MyAnalysisConfiguration" } - * // Override `isSource` and `isSink`. - * // Optionally override `isBarrier`. - * // Optionally override `isAdditionalFlowStep`. - * } - * ``` - * Conceptually, this defines a graph where the nodes are `DataFlow::Node`s and - * the edges are those data-flow steps that preserve the value of the node - * along with any additional edges defined by `isAdditionalFlowStep`. - * Specifying nodes in `isBarrier` will remove those nodes from the graph, and - * specifying nodes in `isBarrierIn` and/or `isBarrierOut` will remove in-going - * and/or out-going edges from those nodes, respectively. - * - * Then, to query whether there is flow between some `source` and `sink`, - * write - * - * ```ql - * exists(MyAnalysisConfiguration cfg | cfg.hasFlow(source, sink)) - * ``` - * - * Multiple configurations can coexist, but two classes extending - * `DataFlow::Configuration` should never depend on each other. One of them - * should instead depend on a `DataFlow2::Configuration`, a - * `DataFlow3::Configuration`, or a `DataFlow4::Configuration`. - */ -abstract deprecated class Configuration extends string { - bindingset[this] - Configuration() { any() } - - /** - * Holds if `source` is a relevant data flow source. - */ - predicate isSource(Node source) { none() } - - /** - * Holds if `source` is a relevant data flow source with the given initial - * `state`. - */ - predicate isSource(Node source, FlowState state) { none() } - - /** - * Holds if `sink` is a relevant data flow sink. - */ - predicate isSink(Node sink) { none() } - - /** - * Holds if `sink` is a relevant data flow sink accepting `state`. - */ - predicate isSink(Node sink, FlowState state) { none() } - - /** - * Holds if data flow through `node` is prohibited. This completely removes - * `node` from the data flow graph. - */ - predicate isBarrier(Node node) { none() } - - /** - * Holds if data flow through `node` is prohibited when the flow state is - * `state`. - */ - predicate isBarrier(Node node, FlowState state) { none() } - - /** Holds if data flow into `node` is prohibited. */ - predicate isBarrierIn(Node node) { none() } - - /** Holds if data flow out of `node` is prohibited. */ - predicate isBarrierOut(Node node) { none() } - - /** - * Holds if data may flow from `node1` to `node2` in addition to the normal data-flow steps. - */ - predicate isAdditionalFlowStep(Node node1, Node node2) { none() } - - /** - * Holds if data may flow from `node1` to `node2` in addition to the normal data-flow steps. - * This step is only applicable in `state1` and updates the flow state to `state2`. - */ - predicate isAdditionalFlowStep(Node node1, FlowState state1, Node node2, FlowState state2) { - none() - } - - /** - * Holds if an arbitrary number of implicit read steps of content `c` may be - * taken at `node`. - */ - predicate allowImplicitRead(Node node, ContentSet c) { none() } - - /** - * Gets the virtual dispatch branching limit when calculating field flow. - * This can be overridden to a smaller value to improve performance (a - * value of 0 disables field flow), or a larger value to get more results. - */ - int fieldFlowBranchLimit() { result = 2 } - - /** - * Gets a data flow configuration feature to add restrictions to the set of - * valid flow paths. - * - * - `FeatureHasSourceCallContext`: - * Assume that sources have some existing call context to disallow - * conflicting return-flow directly following the source. - * - `FeatureHasSinkCallContext`: - * Assume that sinks have some existing call context to disallow - * conflicting argument-to-parameter flow directly preceding the sink. - * - `FeatureEqualSourceSinkCallContext`: - * Implies both of the above and additionally ensures that the entire flow - * path preserves the call context. - * - * These features are generally not relevant for typical end-to-end data flow - * queries, but should only be used for constructing paths that need to - * somehow be pluggable in another path context. - */ - FlowFeature getAFeature() { none() } - - /** Holds if sources should be grouped in the result of `hasFlowPath`. */ - predicate sourceGrouping(Node source, string sourceGroup) { none() } - - /** Holds if sinks should be grouped in the result of `hasFlowPath`. */ - predicate sinkGrouping(Node sink, string sinkGroup) { none() } - - /** - * Holds if data may flow from `source` to `sink` for this configuration. - */ - predicate hasFlow(Node source, Node sink) { hasFlow(source, sink, this) } - - /** - * Holds if data may flow from `source` to `sink` for this configuration. - * - * The corresponding paths are generated from the end-points and the graph - * included in the module `PathGraph`. - */ - predicate hasFlowPath(PathNode source, PathNode sink) { hasFlowPath(source, sink, this) } - - /** - * Holds if data may flow from some source to `sink` for this configuration. - */ - predicate hasFlowTo(Node sink) { hasFlowTo(sink, this) } - - /** - * Holds if data may flow from some source to `sink` for this configuration. - */ - predicate hasFlowToExpr(DataFlowExpr sink) { this.hasFlowTo(exprNode(sink)) } - - /** - * Holds if hidden nodes should be included in the data flow graph. - * - * This feature should only be used for debugging or when the data flow graph - * is not visualized (for example in a `path-problem` query). - */ - predicate includeHiddenNodes() { none() } -} - -/** - * This class exists to prevent mutual recursion between the user-overridden - * member predicates of `Configuration` and the rest of the data-flow library. - * Good performance cannot be guaranteed in the presence of such recursion, so - * it should be replaced by using more than one copy of the data flow library. - */ -abstract deprecated private class ConfigurationRecursionPrevention extends Configuration { - bindingset[this] - ConfigurationRecursionPrevention() { any() } - - override predicate hasFlow(Node source, Node sink) { - strictcount(Node n | this.isSource(n)) < 0 - or - strictcount(Node n | this.isSource(n, _)) < 0 - or - strictcount(Node n | this.isSink(n)) < 0 - or - strictcount(Node n | this.isSink(n, _)) < 0 - or - strictcount(Node n1, Node n2 | this.isAdditionalFlowStep(n1, n2)) < 0 - or - strictcount(Node n1, Node n2 | this.isAdditionalFlowStep(n1, _, n2, _)) < 0 - or - super.hasFlow(source, sink) - } -} - -deprecated private FlowState relevantState(Configuration config) { - config.isSource(_, result) or - config.isSink(_, result) or - config.isBarrier(_, result) or - config.isAdditionalFlowStep(_, result, _, _) or - config.isAdditionalFlowStep(_, _, _, result) -} - -private newtype TConfigState = - deprecated TMkConfigState(Configuration config, FlowState state) { - state = relevantState(config) or state instanceof FlowStateEmpty - } - -deprecated private Configuration getConfig(TConfigState state) { state = TMkConfigState(result, _) } - -deprecated private FlowState getState(TConfigState state) { state = TMkConfigState(_, result) } - -deprecated private predicate singleConfiguration() { 1 = strictcount(Configuration c) } - -deprecated private module Config implements FullStateConfigSig { - class FlowState = TConfigState; - - predicate isSource(Node source, FlowState state) { - getConfig(state).isSource(source, getState(state)) - or - getConfig(state).isSource(source) and getState(state) instanceof FlowStateEmpty - } - - predicate isSink(Node sink) { none() } - - predicate isSink(Node sink, FlowState state) { - getConfig(state).isSink(sink, getState(state)) - or - getConfig(state).isSink(sink) and getState(state) instanceof FlowStateEmpty - } - - predicate isBarrier(Node node) { none() } - - predicate isBarrier(Node node, FlowState state) { - getConfig(state).isBarrier(node, getState(state)) or - getConfig(state).isBarrier(node) - } - - predicate isBarrierIn(Node node) { any(Configuration config).isBarrierIn(node) } - - predicate isBarrierOut(Node node) { any(Configuration config).isBarrierOut(node) } - - predicate isBarrierIn(Node node, FlowState state) { none() } - - predicate isBarrierOut(Node node, FlowState state) { none() } - - predicate isAdditionalFlowStep(Node node1, Node node2, string model) { - singleConfiguration() and - any(Configuration config).isAdditionalFlowStep(node1, node2) and - model = "" - } - - predicate isAdditionalFlowStep( - Node node1, FlowState state1, Node node2, FlowState state2, string model - ) { - getConfig(state1).isAdditionalFlowStep(node1, getState(state1), node2, getState(state2)) and - getConfig(state2) = getConfig(state1) and - model = "" - or - not singleConfiguration() and - getConfig(state1).isAdditionalFlowStep(node1, node2) and - state2 = state1 and - model = "" - } - - predicate allowImplicitRead(Node node, ContentSet c) { - any(Configuration config).allowImplicitRead(node, c) - } - - predicate neverSkip(Node node) { none() } - - int fieldFlowBranchLimit() { result = min(any(Configuration config).fieldFlowBranchLimit()) } - - int accessPathLimit() { result = 5 } - - FlowFeature getAFeature() { result = any(Configuration config).getAFeature() } - - predicate includeHiddenNodes() { any(Configuration config).includeHiddenNodes() } - - predicate observeDiffInformedIncrementalMode() { none() } -} - -deprecated private import Impl as I - -/** - * A `Node` augmented with a call context (except for sinks), an access path, and a configuration. - * Only those `PathNode`s that are reachable from a source, and which can reach a sink, are generated. - */ -deprecated class PathNode instanceof I::PathNode { - /** Gets a textual representation of this element. */ - final string toString() { result = super.toString() } - - /** - * Gets a textual representation of this element, including a textual - * representation of the call context. - */ - final string toStringWithContext() { result = super.toStringWithContext() } - - /** - * Holds if this element is at the specified location. - * The location spans column `startcolumn` of line `startline` to - * column `endcolumn` of line `endline` in file `filepath`. - * For more information, see - * [Locations](https://codeql.github.com/docs/writing-codeql-queries/providing-locations-in-codeql-queries/). - */ - final predicate hasLocationInfo( - string filepath, int startline, int startcolumn, int endline, int endcolumn - ) { - super.hasLocationInfo(filepath, startline, startcolumn, endline, endcolumn) - } - - /** Gets the underlying `Node`. */ - final Node getNode() { result = super.getNode() } - - /** Gets the `FlowState` of this node. */ - deprecated final FlowState getState() { result = getState(super.getState()) } - - /** Gets the associated configuration. */ - deprecated final Configuration getConfiguration() { result = getConfig(super.getState()) } - - /** Gets a successor of this node, if any. */ - final PathNode getASuccessor() { result = super.getASuccessor() } - - /** Holds if this node is a source. */ - final predicate isSource() { super.isSource() } - - /** Holds if this node is a grouping of source nodes. */ - final predicate isSourceGroup(string group) { super.isSourceGroup(group) } - - /** Holds if this node is a grouping of sink nodes. */ - final predicate isSinkGroup(string group) { super.isSinkGroup(group) } -} - -deprecated module PathGraph = I::PathGraph; - -deprecated private predicate hasFlow(Node source, Node sink, Configuration config) { - exists(PathNode source0, PathNode sink0 | - hasFlowPath(source0, sink0, config) and - source0.getNode() = source and - sink0.getNode() = sink - ) -} - -deprecated private predicate hasFlowPath(PathNode source, PathNode sink, Configuration config) { - I::flowPath(source, sink) and source.getConfiguration() = config -} - -deprecated private predicate hasFlowTo(Node sink, Configuration config) { hasFlow(_, sink, config) } - -deprecated predicate flowsTo = hasFlow/3; diff --git a/cpp/ql/lib/semmle/code/cpp/dataflow/internal/DataFlowImplLocal.qll b/cpp/ql/lib/semmle/code/cpp/dataflow/internal/DataFlowImplLocal.qll deleted file mode 100644 index 17def0c431d..00000000000 --- a/cpp/ql/lib/semmle/code/cpp/dataflow/internal/DataFlowImplLocal.qll +++ /dev/null @@ -1,361 +0,0 @@ -/** - * DEPRECATED: Use `Global` and `GlobalWithState` instead. - * - * Provides a `Configuration` class backwards-compatible interface to the data - * flow library. - */ - -private import DataFlowImplCommon -private import DataFlowImplSpecific::Private -import DataFlowImplSpecific::Public -private import DataFlowImpl -import DataFlowImplCommonPublic -deprecated import FlowStateString -private import codeql.util.Unit - -/** - * DEPRECATED: Use `Global` and `GlobalWithState` instead. - * - * A configuration of interprocedural data flow analysis. This defines - * sources, sinks, and any other configurable aspect of the analysis. Each - * use of the global data flow library must define its own unique extension - * of this abstract class. To create a configuration, extend this class with - * a subclass whose characteristic predicate is a unique singleton string. - * For example, write - * - * ```ql - * class MyAnalysisConfiguration extends DataFlow::Configuration { - * MyAnalysisConfiguration() { this = "MyAnalysisConfiguration" } - * // Override `isSource` and `isSink`. - * // Optionally override `isBarrier`. - * // Optionally override `isAdditionalFlowStep`. - * } - * ``` - * Conceptually, this defines a graph where the nodes are `DataFlow::Node`s and - * the edges are those data-flow steps that preserve the value of the node - * along with any additional edges defined by `isAdditionalFlowStep`. - * Specifying nodes in `isBarrier` will remove those nodes from the graph, and - * specifying nodes in `isBarrierIn` and/or `isBarrierOut` will remove in-going - * and/or out-going edges from those nodes, respectively. - * - * Then, to query whether there is flow between some `source` and `sink`, - * write - * - * ```ql - * exists(MyAnalysisConfiguration cfg | cfg.hasFlow(source, sink)) - * ``` - * - * Multiple configurations can coexist, but two classes extending - * `DataFlow::Configuration` should never depend on each other. One of them - * should instead depend on a `DataFlow2::Configuration`, a - * `DataFlow3::Configuration`, or a `DataFlow4::Configuration`. - */ -abstract deprecated class Configuration extends string { - bindingset[this] - Configuration() { any() } - - /** - * Holds if `source` is a relevant data flow source. - */ - predicate isSource(Node source) { none() } - - /** - * Holds if `source` is a relevant data flow source with the given initial - * `state`. - */ - predicate isSource(Node source, FlowState state) { none() } - - /** - * Holds if `sink` is a relevant data flow sink. - */ - predicate isSink(Node sink) { none() } - - /** - * Holds if `sink` is a relevant data flow sink accepting `state`. - */ - predicate isSink(Node sink, FlowState state) { none() } - - /** - * Holds if data flow through `node` is prohibited. This completely removes - * `node` from the data flow graph. - */ - predicate isBarrier(Node node) { none() } - - /** - * Holds if data flow through `node` is prohibited when the flow state is - * `state`. - */ - predicate isBarrier(Node node, FlowState state) { none() } - - /** Holds if data flow into `node` is prohibited. */ - predicate isBarrierIn(Node node) { none() } - - /** Holds if data flow out of `node` is prohibited. */ - predicate isBarrierOut(Node node) { none() } - - /** - * Holds if data may flow from `node1` to `node2` in addition to the normal data-flow steps. - */ - predicate isAdditionalFlowStep(Node node1, Node node2) { none() } - - /** - * Holds if data may flow from `node1` to `node2` in addition to the normal data-flow steps. - * This step is only applicable in `state1` and updates the flow state to `state2`. - */ - predicate isAdditionalFlowStep(Node node1, FlowState state1, Node node2, FlowState state2) { - none() - } - - /** - * Holds if an arbitrary number of implicit read steps of content `c` may be - * taken at `node`. - */ - predicate allowImplicitRead(Node node, ContentSet c) { none() } - - /** - * Gets the virtual dispatch branching limit when calculating field flow. - * This can be overridden to a smaller value to improve performance (a - * value of 0 disables field flow), or a larger value to get more results. - */ - int fieldFlowBranchLimit() { result = 2 } - - /** - * Gets a data flow configuration feature to add restrictions to the set of - * valid flow paths. - * - * - `FeatureHasSourceCallContext`: - * Assume that sources have some existing call context to disallow - * conflicting return-flow directly following the source. - * - `FeatureHasSinkCallContext`: - * Assume that sinks have some existing call context to disallow - * conflicting argument-to-parameter flow directly preceding the sink. - * - `FeatureEqualSourceSinkCallContext`: - * Implies both of the above and additionally ensures that the entire flow - * path preserves the call context. - * - * These features are generally not relevant for typical end-to-end data flow - * queries, but should only be used for constructing paths that need to - * somehow be pluggable in another path context. - */ - FlowFeature getAFeature() { none() } - - /** Holds if sources should be grouped in the result of `hasFlowPath`. */ - predicate sourceGrouping(Node source, string sourceGroup) { none() } - - /** Holds if sinks should be grouped in the result of `hasFlowPath`. */ - predicate sinkGrouping(Node sink, string sinkGroup) { none() } - - /** - * Holds if data may flow from `source` to `sink` for this configuration. - */ - predicate hasFlow(Node source, Node sink) { hasFlow(source, sink, this) } - - /** - * Holds if data may flow from `source` to `sink` for this configuration. - * - * The corresponding paths are generated from the end-points and the graph - * included in the module `PathGraph`. - */ - predicate hasFlowPath(PathNode source, PathNode sink) { hasFlowPath(source, sink, this) } - - /** - * Holds if data may flow from some source to `sink` for this configuration. - */ - predicate hasFlowTo(Node sink) { hasFlowTo(sink, this) } - - /** - * Holds if data may flow from some source to `sink` for this configuration. - */ - predicate hasFlowToExpr(DataFlowExpr sink) { this.hasFlowTo(exprNode(sink)) } - - /** - * Holds if hidden nodes should be included in the data flow graph. - * - * This feature should only be used for debugging or when the data flow graph - * is not visualized (for example in a `path-problem` query). - */ - predicate includeHiddenNodes() { none() } -} - -/** - * This class exists to prevent mutual recursion between the user-overridden - * member predicates of `Configuration` and the rest of the data-flow library. - * Good performance cannot be guaranteed in the presence of such recursion, so - * it should be replaced by using more than one copy of the data flow library. - */ -abstract deprecated private class ConfigurationRecursionPrevention extends Configuration { - bindingset[this] - ConfigurationRecursionPrevention() { any() } - - override predicate hasFlow(Node source, Node sink) { - strictcount(Node n | this.isSource(n)) < 0 - or - strictcount(Node n | this.isSource(n, _)) < 0 - or - strictcount(Node n | this.isSink(n)) < 0 - or - strictcount(Node n | this.isSink(n, _)) < 0 - or - strictcount(Node n1, Node n2 | this.isAdditionalFlowStep(n1, n2)) < 0 - or - strictcount(Node n1, Node n2 | this.isAdditionalFlowStep(n1, _, n2, _)) < 0 - or - super.hasFlow(source, sink) - } -} - -deprecated private FlowState relevantState(Configuration config) { - config.isSource(_, result) or - config.isSink(_, result) or - config.isBarrier(_, result) or - config.isAdditionalFlowStep(_, result, _, _) or - config.isAdditionalFlowStep(_, _, _, result) -} - -private newtype TConfigState = - deprecated TMkConfigState(Configuration config, FlowState state) { - state = relevantState(config) or state instanceof FlowStateEmpty - } - -deprecated private Configuration getConfig(TConfigState state) { state = TMkConfigState(result, _) } - -deprecated private FlowState getState(TConfigState state) { state = TMkConfigState(_, result) } - -deprecated private predicate singleConfiguration() { 1 = strictcount(Configuration c) } - -deprecated private module Config implements FullStateConfigSig { - class FlowState = TConfigState; - - predicate isSource(Node source, FlowState state) { - getConfig(state).isSource(source, getState(state)) - or - getConfig(state).isSource(source) and getState(state) instanceof FlowStateEmpty - } - - predicate isSink(Node sink) { none() } - - predicate isSink(Node sink, FlowState state) { - getConfig(state).isSink(sink, getState(state)) - or - getConfig(state).isSink(sink) and getState(state) instanceof FlowStateEmpty - } - - predicate isBarrier(Node node) { none() } - - predicate isBarrier(Node node, FlowState state) { - getConfig(state).isBarrier(node, getState(state)) or - getConfig(state).isBarrier(node) - } - - predicate isBarrierIn(Node node) { any(Configuration config).isBarrierIn(node) } - - predicate isBarrierOut(Node node) { any(Configuration config).isBarrierOut(node) } - - predicate isBarrierIn(Node node, FlowState state) { none() } - - predicate isBarrierOut(Node node, FlowState state) { none() } - - predicate isAdditionalFlowStep(Node node1, Node node2, string model) { - singleConfiguration() and - any(Configuration config).isAdditionalFlowStep(node1, node2) and - model = "" - } - - predicate isAdditionalFlowStep( - Node node1, FlowState state1, Node node2, FlowState state2, string model - ) { - getConfig(state1).isAdditionalFlowStep(node1, getState(state1), node2, getState(state2)) and - getConfig(state2) = getConfig(state1) and - model = "" - or - not singleConfiguration() and - getConfig(state1).isAdditionalFlowStep(node1, node2) and - state2 = state1 and - model = "" - } - - predicate allowImplicitRead(Node node, ContentSet c) { - any(Configuration config).allowImplicitRead(node, c) - } - - predicate neverSkip(Node node) { none() } - - int fieldFlowBranchLimit() { result = min(any(Configuration config).fieldFlowBranchLimit()) } - - int accessPathLimit() { result = 5 } - - FlowFeature getAFeature() { result = any(Configuration config).getAFeature() } - - predicate includeHiddenNodes() { any(Configuration config).includeHiddenNodes() } - - predicate observeDiffInformedIncrementalMode() { none() } -} - -deprecated private import Impl as I - -/** - * A `Node` augmented with a call context (except for sinks), an access path, and a configuration. - * Only those `PathNode`s that are reachable from a source, and which can reach a sink, are generated. - */ -deprecated class PathNode instanceof I::PathNode { - /** Gets a textual representation of this element. */ - final string toString() { result = super.toString() } - - /** - * Gets a textual representation of this element, including a textual - * representation of the call context. - */ - final string toStringWithContext() { result = super.toStringWithContext() } - - /** - * Holds if this element is at the specified location. - * The location spans column `startcolumn` of line `startline` to - * column `endcolumn` of line `endline` in file `filepath`. - * For more information, see - * [Locations](https://codeql.github.com/docs/writing-codeql-queries/providing-locations-in-codeql-queries/). - */ - final predicate hasLocationInfo( - string filepath, int startline, int startcolumn, int endline, int endcolumn - ) { - super.hasLocationInfo(filepath, startline, startcolumn, endline, endcolumn) - } - - /** Gets the underlying `Node`. */ - final Node getNode() { result = super.getNode() } - - /** Gets the `FlowState` of this node. */ - deprecated final FlowState getState() { result = getState(super.getState()) } - - /** Gets the associated configuration. */ - deprecated final Configuration getConfiguration() { result = getConfig(super.getState()) } - - /** Gets a successor of this node, if any. */ - final PathNode getASuccessor() { result = super.getASuccessor() } - - /** Holds if this node is a source. */ - final predicate isSource() { super.isSource() } - - /** Holds if this node is a grouping of source nodes. */ - final predicate isSourceGroup(string group) { super.isSourceGroup(group) } - - /** Holds if this node is a grouping of sink nodes. */ - final predicate isSinkGroup(string group) { super.isSinkGroup(group) } -} - -deprecated module PathGraph = I::PathGraph; - -deprecated private predicate hasFlow(Node source, Node sink, Configuration config) { - exists(PathNode source0, PathNode sink0 | - hasFlowPath(source0, sink0, config) and - source0.getNode() = source and - sink0.getNode() = sink - ) -} - -deprecated private predicate hasFlowPath(PathNode source, PathNode sink, Configuration config) { - I::flowPath(source, sink) and source.getConfiguration() = config -} - -deprecated private predicate hasFlowTo(Node sink, Configuration config) { hasFlow(_, sink, config) } - -deprecated predicate flowsTo = hasFlow/3; diff --git a/cpp/ql/lib/semmle/code/cpp/dataflow/internal/DataFlowUtil.qll b/cpp/ql/lib/semmle/code/cpp/dataflow/internal/DataFlowUtil.qll index b4f325e01df..4a8ea4ebd43 100644 --- a/cpp/ql/lib/semmle/code/cpp/dataflow/internal/DataFlowUtil.qll +++ b/cpp/ql/lib/semmle/code/cpp/dataflow/internal/DataFlowUtil.qll @@ -729,41 +729,39 @@ private predicate exprToDefinitionByReferenceStep(Expr exprIn, Expr argOut) { private module FieldFlow { private import DataFlowImplCommon - private import DataFlowImplLocal private import DataFlowPrivate + private import semmle.code.cpp.dataflow.DataFlow /** - * A configuration for finding local-only flow through fields. This uses the - * `Configuration` class in the dedicated `DataFlowImplLocal` copy of the - * shared library that's not user-exposed directly. + * A configuration for finding local-only flow through fields. * * To keep the flow local to a single function, we put barriers on parameters * and return statements. Sources and sinks are the values that go into and * out of fields, respectively. */ - private class FieldConfiguration extends Configuration { - FieldConfiguration() { this = "FieldConfiguration" } - - override predicate isSource(Node source) { + private module FieldConfig implements DataFlow::ConfigSig { + predicate isSource(Node source) { storeStep(source, _, _) or // Also mark `foo(a.b);` as a source when `a.b` may be overwritten by `foo`. readStep(_, _, any(Node node | node.asExpr() = source.asDefiningArgument())) } - override predicate isSink(Node sink) { readStep(_, _, sink) } + predicate isSink(Node sink) { readStep(_, _, sink) } - override predicate isBarrier(Node node) { node instanceof ParameterNode } + predicate isBarrier(Node node) { node instanceof ParameterNode } - override predicate isBarrierOut(Node node) { + predicate isBarrierOut(Node node) { node.asExpr().getParent() instanceof ReturnStmt or node.asExpr().getParent() instanceof ThrowExpr } } + private module Flow = DataFlow::Global; + predicate fieldFlow(Node node1, Node node2) { - exists(FieldConfiguration cfg | cfg.hasFlow(node1, node2)) and + Flow::flow(node1, node2) and // This configuration should not be able to cross function boundaries, but // we double-check here just to be sure. getNodeEnclosingCallable(node1) = getNodeEnclosingCallable(node2) diff --git a/cpp/ql/lib/semmle/code/cpp/dataflow/internal/tainttracking1/TaintTrackingImpl.qll b/cpp/ql/lib/semmle/code/cpp/dataflow/internal/tainttracking1/TaintTrackingImpl.qll deleted file mode 100644 index 75e7856fd26..00000000000 --- a/cpp/ql/lib/semmle/code/cpp/dataflow/internal/tainttracking1/TaintTrackingImpl.qll +++ /dev/null @@ -1,168 +0,0 @@ -/** - * DEPRECATED: Use `Global` and `GlobalWithState` instead. - * - * Provides an implementation of global (interprocedural) taint tracking. - * This file re-exports the local (intraprocedural) taint-tracking analysis - * from `TaintTrackingParameter::Public` and adds a global analysis, mainly - * exposed through the `Configuration` class. For some languages, this file - * exists in several identical copies, allowing queries to use multiple - * `Configuration` classes that depend on each other without introducing - * mutual recursion among those configurations. - */ - -import TaintTrackingParameter::Public -private import TaintTrackingParameter::Private - -/** - * DEPRECATED: Use `Global` and `GlobalWithState` instead. - * - * A configuration of interprocedural taint tracking analysis. This defines - * sources, sinks, and any other configurable aspect of the analysis. Each - * use of the taint tracking library must define its own unique extension of - * this abstract class. - * - * A taint-tracking configuration is a special data flow configuration - * (`DataFlow::Configuration`) that allows for flow through nodes that do not - * necessarily preserve values but are still relevant from a taint tracking - * perspective. (For example, string concatenation, where one of the operands - * is tainted.) - * - * To create a configuration, extend this class with a subclass whose - * characteristic predicate is a unique singleton string. For example, write - * - * ```ql - * class MyAnalysisConfiguration extends TaintTracking::Configuration { - * MyAnalysisConfiguration() { this = "MyAnalysisConfiguration" } - * // Override `isSource` and `isSink`. - * // Optionally override `isSanitizer`. - * // Optionally override `isSanitizerIn`. - * // Optionally override `isSanitizerOut`. - * // Optionally override `isSanitizerGuard`. - * // Optionally override `isAdditionalTaintStep`. - * } - * ``` - * - * Then, to query whether there is flow between some `source` and `sink`, - * write - * - * ```ql - * exists(MyAnalysisConfiguration cfg | cfg.hasFlow(source, sink)) - * ``` - * - * Multiple configurations can coexist, but it is unsupported to depend on - * another `TaintTracking::Configuration` or a `DataFlow::Configuration` in the - * overridden predicates that define sources, sinks, or additional steps. - * Instead, the dependency should go to a `TaintTracking2::Configuration` or a - * `DataFlow2::Configuration`, `DataFlow3::Configuration`, etc. - */ -abstract deprecated class Configuration extends DataFlow::Configuration { - bindingset[this] - Configuration() { any() } - - /** - * Holds if `source` is a relevant taint source. - * - * The smaller this predicate is, the faster `hasFlow()` will converge. - */ - // overridden to provide taint-tracking specific qldoc - override predicate isSource(DataFlow::Node source) { none() } - - /** - * Holds if `source` is a relevant taint source with the given initial - * `state`. - * - * The smaller this predicate is, the faster `hasFlow()` will converge. - */ - // overridden to provide taint-tracking specific qldoc - override predicate isSource(DataFlow::Node source, DataFlow::FlowState state) { none() } - - /** - * Holds if `sink` is a relevant taint sink - * - * The smaller this predicate is, the faster `hasFlow()` will converge. - */ - // overridden to provide taint-tracking specific qldoc - override predicate isSink(DataFlow::Node sink) { none() } - - /** - * Holds if `sink` is a relevant taint sink accepting `state`. - * - * The smaller this predicate is, the faster `hasFlow()` will converge. - */ - // overridden to provide taint-tracking specific qldoc - override predicate isSink(DataFlow::Node sink, DataFlow::FlowState state) { none() } - - /** Holds if the node `node` is a taint sanitizer. */ - predicate isSanitizer(DataFlow::Node node) { none() } - - final override predicate isBarrier(DataFlow::Node node) { - this.isSanitizer(node) or - defaultTaintSanitizer(node) - } - - /** - * Holds if the node `node` is a taint sanitizer when the flow state is - * `state`. - */ - predicate isSanitizer(DataFlow::Node node, DataFlow::FlowState state) { none() } - - final override predicate isBarrier(DataFlow::Node node, DataFlow::FlowState state) { - this.isSanitizer(node, state) - } - - /** Holds if taint propagation into `node` is prohibited. */ - predicate isSanitizerIn(DataFlow::Node node) { none() } - - final override predicate isBarrierIn(DataFlow::Node node) { this.isSanitizerIn(node) } - - /** Holds if taint propagation out of `node` is prohibited. */ - predicate isSanitizerOut(DataFlow::Node node) { none() } - - final override predicate isBarrierOut(DataFlow::Node node) { this.isSanitizerOut(node) } - - /** - * Holds if taint may propagate from `node1` to `node2` in addition to the normal data-flow and taint steps. - */ - predicate isAdditionalTaintStep(DataFlow::Node node1, DataFlow::Node node2) { none() } - - final override predicate isAdditionalFlowStep(DataFlow::Node node1, DataFlow::Node node2) { - this.isAdditionalTaintStep(node1, node2) or - defaultAdditionalTaintStep(node1, node2, _) - } - - /** - * Holds if taint may propagate from `node1` to `node2` in addition to the normal data-flow and taint steps. - * This step is only applicable in `state1` and updates the flow state to `state2`. - */ - predicate isAdditionalTaintStep( - DataFlow::Node node1, DataFlow::FlowState state1, DataFlow::Node node2, - DataFlow::FlowState state2 - ) { - none() - } - - final override predicate isAdditionalFlowStep( - DataFlow::Node node1, DataFlow::FlowState state1, DataFlow::Node node2, - DataFlow::FlowState state2 - ) { - this.isAdditionalTaintStep(node1, state1, node2, state2) - } - - override predicate allowImplicitRead(DataFlow::Node node, DataFlow::ContentSet c) { - ( - this.isSink(node) or - this.isSink(node, _) or - this.isAdditionalTaintStep(node, _) or - this.isAdditionalTaintStep(node, _, _, _) - ) and - defaultImplicitTaintRead(node, c) - } - - /** - * Holds if taint may flow from `source` to `sink` for this configuration. - */ - // overridden to provide taint-tracking specific qldoc - override predicate hasFlow(DataFlow::Node source, DataFlow::Node sink) { - super.hasFlow(source, sink) - } -} diff --git a/cpp/ql/lib/semmle/code/cpp/dataflow/internal/tainttracking1/TaintTrackingParameter.qll b/cpp/ql/lib/semmle/code/cpp/dataflow/internal/tainttracking1/TaintTrackingParameter.qll deleted file mode 100644 index f9346e28434..00000000000 --- a/cpp/ql/lib/semmle/code/cpp/dataflow/internal/tainttracking1/TaintTrackingParameter.qll +++ /dev/null @@ -1,10 +0,0 @@ -/** - * DEPRECATED: Use `Global` and `GlobalWithState` instead. - */ - -import semmle.code.cpp.dataflow.internal.TaintTrackingUtil as Public - -module Private { - import semmle.code.cpp.dataflow.DataFlow::DataFlow as DataFlow - import semmle.code.cpp.dataflow.internal.DataFlowImpl as DataFlowInternal -} diff --git a/cpp/ql/lib/semmle/code/cpp/dataflow/internal/tainttracking2/TaintTrackingImpl.qll b/cpp/ql/lib/semmle/code/cpp/dataflow/internal/tainttracking2/TaintTrackingImpl.qll deleted file mode 100644 index 75e7856fd26..00000000000 --- a/cpp/ql/lib/semmle/code/cpp/dataflow/internal/tainttracking2/TaintTrackingImpl.qll +++ /dev/null @@ -1,168 +0,0 @@ -/** - * DEPRECATED: Use `Global` and `GlobalWithState` instead. - * - * Provides an implementation of global (interprocedural) taint tracking. - * This file re-exports the local (intraprocedural) taint-tracking analysis - * from `TaintTrackingParameter::Public` and adds a global analysis, mainly - * exposed through the `Configuration` class. For some languages, this file - * exists in several identical copies, allowing queries to use multiple - * `Configuration` classes that depend on each other without introducing - * mutual recursion among those configurations. - */ - -import TaintTrackingParameter::Public -private import TaintTrackingParameter::Private - -/** - * DEPRECATED: Use `Global` and `GlobalWithState` instead. - * - * A configuration of interprocedural taint tracking analysis. This defines - * sources, sinks, and any other configurable aspect of the analysis. Each - * use of the taint tracking library must define its own unique extension of - * this abstract class. - * - * A taint-tracking configuration is a special data flow configuration - * (`DataFlow::Configuration`) that allows for flow through nodes that do not - * necessarily preserve values but are still relevant from a taint tracking - * perspective. (For example, string concatenation, where one of the operands - * is tainted.) - * - * To create a configuration, extend this class with a subclass whose - * characteristic predicate is a unique singleton string. For example, write - * - * ```ql - * class MyAnalysisConfiguration extends TaintTracking::Configuration { - * MyAnalysisConfiguration() { this = "MyAnalysisConfiguration" } - * // Override `isSource` and `isSink`. - * // Optionally override `isSanitizer`. - * // Optionally override `isSanitizerIn`. - * // Optionally override `isSanitizerOut`. - * // Optionally override `isSanitizerGuard`. - * // Optionally override `isAdditionalTaintStep`. - * } - * ``` - * - * Then, to query whether there is flow between some `source` and `sink`, - * write - * - * ```ql - * exists(MyAnalysisConfiguration cfg | cfg.hasFlow(source, sink)) - * ``` - * - * Multiple configurations can coexist, but it is unsupported to depend on - * another `TaintTracking::Configuration` or a `DataFlow::Configuration` in the - * overridden predicates that define sources, sinks, or additional steps. - * Instead, the dependency should go to a `TaintTracking2::Configuration` or a - * `DataFlow2::Configuration`, `DataFlow3::Configuration`, etc. - */ -abstract deprecated class Configuration extends DataFlow::Configuration { - bindingset[this] - Configuration() { any() } - - /** - * Holds if `source` is a relevant taint source. - * - * The smaller this predicate is, the faster `hasFlow()` will converge. - */ - // overridden to provide taint-tracking specific qldoc - override predicate isSource(DataFlow::Node source) { none() } - - /** - * Holds if `source` is a relevant taint source with the given initial - * `state`. - * - * The smaller this predicate is, the faster `hasFlow()` will converge. - */ - // overridden to provide taint-tracking specific qldoc - override predicate isSource(DataFlow::Node source, DataFlow::FlowState state) { none() } - - /** - * Holds if `sink` is a relevant taint sink - * - * The smaller this predicate is, the faster `hasFlow()` will converge. - */ - // overridden to provide taint-tracking specific qldoc - override predicate isSink(DataFlow::Node sink) { none() } - - /** - * Holds if `sink` is a relevant taint sink accepting `state`. - * - * The smaller this predicate is, the faster `hasFlow()` will converge. - */ - // overridden to provide taint-tracking specific qldoc - override predicate isSink(DataFlow::Node sink, DataFlow::FlowState state) { none() } - - /** Holds if the node `node` is a taint sanitizer. */ - predicate isSanitizer(DataFlow::Node node) { none() } - - final override predicate isBarrier(DataFlow::Node node) { - this.isSanitizer(node) or - defaultTaintSanitizer(node) - } - - /** - * Holds if the node `node` is a taint sanitizer when the flow state is - * `state`. - */ - predicate isSanitizer(DataFlow::Node node, DataFlow::FlowState state) { none() } - - final override predicate isBarrier(DataFlow::Node node, DataFlow::FlowState state) { - this.isSanitizer(node, state) - } - - /** Holds if taint propagation into `node` is prohibited. */ - predicate isSanitizerIn(DataFlow::Node node) { none() } - - final override predicate isBarrierIn(DataFlow::Node node) { this.isSanitizerIn(node) } - - /** Holds if taint propagation out of `node` is prohibited. */ - predicate isSanitizerOut(DataFlow::Node node) { none() } - - final override predicate isBarrierOut(DataFlow::Node node) { this.isSanitizerOut(node) } - - /** - * Holds if taint may propagate from `node1` to `node2` in addition to the normal data-flow and taint steps. - */ - predicate isAdditionalTaintStep(DataFlow::Node node1, DataFlow::Node node2) { none() } - - final override predicate isAdditionalFlowStep(DataFlow::Node node1, DataFlow::Node node2) { - this.isAdditionalTaintStep(node1, node2) or - defaultAdditionalTaintStep(node1, node2, _) - } - - /** - * Holds if taint may propagate from `node1` to `node2` in addition to the normal data-flow and taint steps. - * This step is only applicable in `state1` and updates the flow state to `state2`. - */ - predicate isAdditionalTaintStep( - DataFlow::Node node1, DataFlow::FlowState state1, DataFlow::Node node2, - DataFlow::FlowState state2 - ) { - none() - } - - final override predicate isAdditionalFlowStep( - DataFlow::Node node1, DataFlow::FlowState state1, DataFlow::Node node2, - DataFlow::FlowState state2 - ) { - this.isAdditionalTaintStep(node1, state1, node2, state2) - } - - override predicate allowImplicitRead(DataFlow::Node node, DataFlow::ContentSet c) { - ( - this.isSink(node) or - this.isSink(node, _) or - this.isAdditionalTaintStep(node, _) or - this.isAdditionalTaintStep(node, _, _, _) - ) and - defaultImplicitTaintRead(node, c) - } - - /** - * Holds if taint may flow from `source` to `sink` for this configuration. - */ - // overridden to provide taint-tracking specific qldoc - override predicate hasFlow(DataFlow::Node source, DataFlow::Node sink) { - super.hasFlow(source, sink) - } -} diff --git a/cpp/ql/lib/semmle/code/cpp/dataflow/internal/tainttracking2/TaintTrackingParameter.qll b/cpp/ql/lib/semmle/code/cpp/dataflow/internal/tainttracking2/TaintTrackingParameter.qll deleted file mode 100644 index e935b8d4d08..00000000000 --- a/cpp/ql/lib/semmle/code/cpp/dataflow/internal/tainttracking2/TaintTrackingParameter.qll +++ /dev/null @@ -1,9 +0,0 @@ -/** - * DEPRECATED: Use `Global` and `GlobalWithState` instead. - */ - -import semmle.code.cpp.dataflow.internal.TaintTrackingUtil as Public - -module Private { - import semmle.code.cpp.dataflow.DataFlow2::DataFlow2 as DataFlow -} diff --git a/cpp/ql/lib/semmle/code/cpp/dataflow/new/DataFlow.qll b/cpp/ql/lib/semmle/code/cpp/dataflow/new/DataFlow.qll index bcbebd0de1e..2067dc8aac0 100644 --- a/cpp/ql/lib/semmle/code/cpp/dataflow/new/DataFlow.qll +++ b/cpp/ql/lib/semmle/code/cpp/dataflow/new/DataFlow.qll @@ -29,5 +29,5 @@ module DataFlow { private import semmle.code.cpp.ir.dataflow.internal.DataFlowImplSpecific private import codeql.dataflow.DataFlow import DataFlowMake - import semmle.code.cpp.ir.dataflow.internal.DataFlowImpl1 + import Public } diff --git a/cpp/ql/lib/semmle/code/cpp/dataflow/new/DataFlow2.qll b/cpp/ql/lib/semmle/code/cpp/dataflow/new/DataFlow2.qll deleted file mode 100644 index 35c5a34a656..00000000000 --- a/cpp/ql/lib/semmle/code/cpp/dataflow/new/DataFlow2.qll +++ /dev/null @@ -1,20 +0,0 @@ -/** - * Provides a `DataFlow2` module, which is a copy of the `DataFlow` module. Use - * this class when data-flow configurations must depend on each other. Two - * classes extending `DataFlow::Configuration` should never depend on each - * other, but one of them should instead depend on a - * `DataFlow2::Configuration`, a `DataFlow3::Configuration`, or a - * `DataFlow4::Configuration`. - * - * See `semmle.code.cpp.dataflow.new.DataFlow` for the full documentation. - */ - -import cpp - -/** - * Provides classes for performing local (intra-procedural) and - * global (inter-procedural) data flow analyses. - */ -module DataFlow2 { - import semmle.code.cpp.ir.dataflow.internal.DataFlowImpl2 -} diff --git a/cpp/ql/lib/semmle/code/cpp/dataflow/new/DataFlow3.qll b/cpp/ql/lib/semmle/code/cpp/dataflow/new/DataFlow3.qll deleted file mode 100644 index e2e402835f2..00000000000 --- a/cpp/ql/lib/semmle/code/cpp/dataflow/new/DataFlow3.qll +++ /dev/null @@ -1,20 +0,0 @@ -/** - * Provides a `DataFlow3` module, which is a copy of the `DataFlow` module. Use - * this class when data-flow configurations must depend on each other. Two - * classes extending `DataFlow::Configuration` should never depend on each - * other, but one of them should instead depend on a - * `DataFlow2::Configuration`, a `DataFlow3::Configuration`, or a - * `DataFlow4::Configuration`. - * - * See `semmle.code.cpp.dataflow.new.DataFlow` for the full documentation. - */ - -import cpp - -/** - * Provides classes for performing local (intra-procedural) and - * global (inter-procedural) data flow analyses. - */ -module DataFlow3 { - import semmle.code.cpp.ir.dataflow.internal.DataFlowImpl3 -} diff --git a/cpp/ql/lib/semmle/code/cpp/dataflow/new/DataFlow4.qll b/cpp/ql/lib/semmle/code/cpp/dataflow/new/DataFlow4.qll deleted file mode 100644 index f9209abe1e1..00000000000 --- a/cpp/ql/lib/semmle/code/cpp/dataflow/new/DataFlow4.qll +++ /dev/null @@ -1,20 +0,0 @@ -/** - * Provides a `DataFlow4` module, which is a copy of the `DataFlow` module. Use - * this class when data-flow configurations must depend on each other. Two - * classes extending `DataFlow::Configuration` should never depend on each - * other, but one of them should instead depend on a - * `DataFlow2::Configuration`, a `DataFlow3::Configuration`, or a - * `DataFlow4::Configuration`. - * - * See `semmle.code.cpp.dataflow.new.DataFlow` for the full documentation. - */ - -import cpp - -/** - * Provides classes for performing local (intra-procedural) and - * global (inter-procedural) data flow analyses. - */ -module DataFlow4 { - import semmle.code.cpp.ir.dataflow.internal.DataFlowImpl4 -} diff --git a/cpp/ql/lib/semmle/code/cpp/dataflow/new/TaintTracking.qll b/cpp/ql/lib/semmle/code/cpp/dataflow/new/TaintTracking.qll index d28a389203f..ecc927ecad7 100644 --- a/cpp/ql/lib/semmle/code/cpp/dataflow/new/TaintTracking.qll +++ b/cpp/ql/lib/semmle/code/cpp/dataflow/new/TaintTracking.qll @@ -16,18 +16,16 @@ */ import semmle.code.cpp.dataflow.new.DataFlow -import semmle.code.cpp.dataflow.new.DataFlow2 /** * Provides classes for performing local (intra-procedural) and * global (inter-procedural) taint-tracking analyses. */ module TaintTracking { - import semmle.code.cpp.ir.dataflow.internal.tainttracking1.TaintTrackingParameter::Public + import semmle.code.cpp.ir.dataflow.internal.TaintTrackingUtil private import semmle.code.cpp.ir.dataflow.internal.DataFlowImplSpecific private import semmle.code.cpp.ir.dataflow.internal.TaintTrackingImplSpecific private import codeql.dataflow.TaintTracking private import semmle.code.cpp.Location import TaintFlowMake - import semmle.code.cpp.ir.dataflow.internal.tainttracking1.TaintTrackingImpl } diff --git a/cpp/ql/lib/semmle/code/cpp/dataflow/new/TaintTracking2.qll b/cpp/ql/lib/semmle/code/cpp/dataflow/new/TaintTracking2.qll deleted file mode 100644 index 2da049cefaf..00000000000 --- a/cpp/ql/lib/semmle/code/cpp/dataflow/new/TaintTracking2.qll +++ /dev/null @@ -1,20 +0,0 @@ -/** - * Provides a `TaintTracking2` module, which is a copy of the `TaintTracking` - * module. Use this class when data-flow configurations or taint-tracking - * configurations must depend on each other. Two classes extending - * `DataFlow::Configuration` should never depend on each other, but one of them - * should instead depend on a `DataFlow2::Configuration`, a - * `DataFlow3::Configuration`, or a `DataFlow4::Configuration`. The - * `TaintTracking::Configuration` class extends `DataFlow::Configuration`, and - * `TaintTracking2::Configuration` extends `DataFlow2::Configuration`. - * - * See `semmle.code.cpp.dataflow.new.TaintTracking` for the full documentation. - */ - -/** - * Provides classes for performing local (intra-procedural) and - * global (inter-procedural) taint-tracking analyses. - */ -module TaintTracking2 { - import semmle.code.cpp.ir.dataflow.internal.tainttracking2.TaintTrackingImpl -} diff --git a/cpp/ql/lib/semmle/code/cpp/dataflow/new/TaintTracking3.qll b/cpp/ql/lib/semmle/code/cpp/dataflow/new/TaintTracking3.qll deleted file mode 100644 index 113175d8369..00000000000 --- a/cpp/ql/lib/semmle/code/cpp/dataflow/new/TaintTracking3.qll +++ /dev/null @@ -1,20 +0,0 @@ -/** - * Provides a `TaintTracking3` module, which is a copy of the `TaintTracking` - * module. Use this class when data-flow configurations or taint-tracking - * configurations must depend on each other. Two classes extending - * `DataFlow::Configuration` should never depend on each other, but one of them - * should instead depend on a `DataFlow2::Configuration`, a - * `DataFlow3::Configuration`, or a `DataFlow4::Configuration`. The - * `TaintTracking::Configuration` class extends `DataFlow::Configuration`, and - * `TaintTracking2::Configuration` extends `DataFlow2::Configuration`. - * - * See `semmle.code.cpp.dataflow.new.TaintTracking` for the full documentation. - */ - -/** - * Provides classes for performing local (intra-procedural) and - * global (inter-procedural) taint-tracking analyses. - */ -module TaintTracking3 { - import semmle.code.cpp.ir.dataflow.internal.tainttracking3.TaintTrackingImpl -} diff --git a/cpp/ql/lib/semmle/code/cpp/ir/dataflow/DataFlow.qll b/cpp/ql/lib/semmle/code/cpp/ir/dataflow/DataFlow.qll index 671d82c74ef..ecd474d64b2 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/dataflow/DataFlow.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/dataflow/DataFlow.qll @@ -25,5 +25,5 @@ module DataFlow { private import semmle.code.cpp.ir.dataflow.internal.DataFlowImplSpecific private import codeql.dataflow.DataFlow import DataFlowMake - import semmle.code.cpp.ir.dataflow.internal.DataFlowImpl1 + import Public } diff --git a/cpp/ql/lib/semmle/code/cpp/ir/dataflow/DataFlow2.qll b/cpp/ql/lib/semmle/code/cpp/ir/dataflow/DataFlow2.qll deleted file mode 100644 index 95eb979192d..00000000000 --- a/cpp/ql/lib/semmle/code/cpp/ir/dataflow/DataFlow2.qll +++ /dev/null @@ -1,16 +0,0 @@ -/** - * Provides a `DataFlow2` module, which is a copy of the `DataFlow` module. Use - * this class when data-flow configurations must depend on each other. Two - * classes extending `DataFlow::Configuration` should never depend on each - * other, but one of them should instead depend on a - * `DataFlow2::Configuration`, a `DataFlow3::Configuration`, or a - * `DataFlow4::Configuration`. - * - * See `semmle.code.cpp.ir.dataflow.DataFlow` for the full documentation. - */ - -import cpp - -module DataFlow2 { - import semmle.code.cpp.ir.dataflow.internal.DataFlowImpl2 -} diff --git a/cpp/ql/lib/semmle/code/cpp/ir/dataflow/DataFlow3.qll b/cpp/ql/lib/semmle/code/cpp/ir/dataflow/DataFlow3.qll deleted file mode 100644 index 42529f78e5b..00000000000 --- a/cpp/ql/lib/semmle/code/cpp/ir/dataflow/DataFlow3.qll +++ /dev/null @@ -1,16 +0,0 @@ -/** - * Provides a `DataFlow3` module, which is a copy of the `DataFlow` module. Use - * this class when data-flow configurations must depend on each other. Two - * classes extending `DataFlow::Configuration` should never depend on each - * other, but one of them should instead depend on a - * `DataFlow2::Configuration`, a `DataFlow3::Configuration`, or a - * `DataFlow4::Configuration`. - * - * See `semmle.code.cpp.ir.dataflow.DataFlow` for the full documentation. - */ - -import cpp - -module DataFlow3 { - import semmle.code.cpp.ir.dataflow.internal.DataFlowImpl3 -} diff --git a/cpp/ql/lib/semmle/code/cpp/ir/dataflow/DataFlow4.qll b/cpp/ql/lib/semmle/code/cpp/ir/dataflow/DataFlow4.qll deleted file mode 100644 index 6cd49e39e71..00000000000 --- a/cpp/ql/lib/semmle/code/cpp/ir/dataflow/DataFlow4.qll +++ /dev/null @@ -1,16 +0,0 @@ -/** - * Provides a `DataFlow4` module, which is a copy of the `DataFlow` module. Use - * this class when data-flow configurations must depend on each other. Two - * classes extending `DataFlow::Configuration` should never depend on each - * other, but one of them should instead depend on a - * `DataFlow2::Configuration`, a `DataFlow3::Configuration`, or a - * `DataFlow4::Configuration`. - * - * See `semmle.code.cpp.ir.dataflow.DataFlow` for the full documentation. - */ - -import cpp - -module DataFlow4 { - import semmle.code.cpp.ir.dataflow.internal.DataFlowImpl4 -} diff --git a/cpp/ql/lib/semmle/code/cpp/ir/dataflow/TaintTracking.qll b/cpp/ql/lib/semmle/code/cpp/ir/dataflow/TaintTracking.qll index 9ca1315ec3e..69bb1978cf6 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/dataflow/TaintTracking.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/dataflow/TaintTracking.qll @@ -16,13 +16,11 @@ */ import semmle.code.cpp.ir.dataflow.DataFlow -import semmle.code.cpp.ir.dataflow.DataFlow2 module TaintTracking { - import semmle.code.cpp.ir.dataflow.internal.tainttracking1.TaintTrackingParameter::Public + import semmle.code.cpp.ir.dataflow.internal.TaintTrackingUtil private import semmle.code.cpp.ir.dataflow.internal.DataFlowImplSpecific private import semmle.code.cpp.ir.dataflow.internal.TaintTrackingImplSpecific private import codeql.dataflow.TaintTracking import TaintFlowMake - import semmle.code.cpp.ir.dataflow.internal.tainttracking1.TaintTrackingImpl } diff --git a/cpp/ql/lib/semmle/code/cpp/ir/dataflow/TaintTracking2.qll b/cpp/ql/lib/semmle/code/cpp/ir/dataflow/TaintTracking2.qll deleted file mode 100644 index 3ef03a3bd2c..00000000000 --- a/cpp/ql/lib/semmle/code/cpp/ir/dataflow/TaintTracking2.qll +++ /dev/null @@ -1,15 +0,0 @@ -/** - * Provides a `TaintTracking2` module, which is a copy of the `TaintTracking` - * module. Use this class when data-flow configurations or taint-tracking - * configurations must depend on each other. Two classes extending - * `DataFlow::Configuration` should never depend on each other, but one of them - * should instead depend on a `DataFlow2::Configuration`, a - * `DataFlow3::Configuration`, or a `DataFlow4::Configuration`. The - * `TaintTracking::Configuration` class extends `DataFlow::Configuration`, and - * `TaintTracking2::Configuration` extends `DataFlow2::Configuration`. - * - * See `semmle.code.cpp.ir.dataflow.TaintTracking` for the full documentation. - */ -module TaintTracking2 { - import semmle.code.cpp.ir.dataflow.internal.tainttracking2.TaintTrackingImpl -} diff --git a/cpp/ql/lib/semmle/code/cpp/ir/dataflow/TaintTracking3.qll b/cpp/ql/lib/semmle/code/cpp/ir/dataflow/TaintTracking3.qll deleted file mode 100644 index 98e1caebf38..00000000000 --- a/cpp/ql/lib/semmle/code/cpp/ir/dataflow/TaintTracking3.qll +++ /dev/null @@ -1,15 +0,0 @@ -/** - * Provides a `TaintTracking3` module, which is a copy of the `TaintTracking` - * module. Use this class when data-flow configurations or taint-tracking - * configurations must depend on each other. Two classes extending - * `DataFlow::Configuration` should never depend on each other, but one of them - * should instead depend on a `DataFlow2::Configuration`, a - * `DataFlow3::Configuration`, or a `DataFlow4::Configuration`. The - * `TaintTracking::Configuration` class extends `DataFlow::Configuration`, and - * `TaintTracking2::Configuration` extends `DataFlow2::Configuration`. - * - * See `semmle.code.cpp.ir.dataflow.TaintTracking` for the full documentation. - */ -module TaintTracking3 { - import semmle.code.cpp.ir.dataflow.internal.tainttracking3.TaintTrackingImpl -} diff --git a/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowImpl1.qll b/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowImpl1.qll deleted file mode 100644 index 17def0c431d..00000000000 --- a/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowImpl1.qll +++ /dev/null @@ -1,361 +0,0 @@ -/** - * DEPRECATED: Use `Global` and `GlobalWithState` instead. - * - * Provides a `Configuration` class backwards-compatible interface to the data - * flow library. - */ - -private import DataFlowImplCommon -private import DataFlowImplSpecific::Private -import DataFlowImplSpecific::Public -private import DataFlowImpl -import DataFlowImplCommonPublic -deprecated import FlowStateString -private import codeql.util.Unit - -/** - * DEPRECATED: Use `Global` and `GlobalWithState` instead. - * - * A configuration of interprocedural data flow analysis. This defines - * sources, sinks, and any other configurable aspect of the analysis. Each - * use of the global data flow library must define its own unique extension - * of this abstract class. To create a configuration, extend this class with - * a subclass whose characteristic predicate is a unique singleton string. - * For example, write - * - * ```ql - * class MyAnalysisConfiguration extends DataFlow::Configuration { - * MyAnalysisConfiguration() { this = "MyAnalysisConfiguration" } - * // Override `isSource` and `isSink`. - * // Optionally override `isBarrier`. - * // Optionally override `isAdditionalFlowStep`. - * } - * ``` - * Conceptually, this defines a graph where the nodes are `DataFlow::Node`s and - * the edges are those data-flow steps that preserve the value of the node - * along with any additional edges defined by `isAdditionalFlowStep`. - * Specifying nodes in `isBarrier` will remove those nodes from the graph, and - * specifying nodes in `isBarrierIn` and/or `isBarrierOut` will remove in-going - * and/or out-going edges from those nodes, respectively. - * - * Then, to query whether there is flow between some `source` and `sink`, - * write - * - * ```ql - * exists(MyAnalysisConfiguration cfg | cfg.hasFlow(source, sink)) - * ``` - * - * Multiple configurations can coexist, but two classes extending - * `DataFlow::Configuration` should never depend on each other. One of them - * should instead depend on a `DataFlow2::Configuration`, a - * `DataFlow3::Configuration`, or a `DataFlow4::Configuration`. - */ -abstract deprecated class Configuration extends string { - bindingset[this] - Configuration() { any() } - - /** - * Holds if `source` is a relevant data flow source. - */ - predicate isSource(Node source) { none() } - - /** - * Holds if `source` is a relevant data flow source with the given initial - * `state`. - */ - predicate isSource(Node source, FlowState state) { none() } - - /** - * Holds if `sink` is a relevant data flow sink. - */ - predicate isSink(Node sink) { none() } - - /** - * Holds if `sink` is a relevant data flow sink accepting `state`. - */ - predicate isSink(Node sink, FlowState state) { none() } - - /** - * Holds if data flow through `node` is prohibited. This completely removes - * `node` from the data flow graph. - */ - predicate isBarrier(Node node) { none() } - - /** - * Holds if data flow through `node` is prohibited when the flow state is - * `state`. - */ - predicate isBarrier(Node node, FlowState state) { none() } - - /** Holds if data flow into `node` is prohibited. */ - predicate isBarrierIn(Node node) { none() } - - /** Holds if data flow out of `node` is prohibited. */ - predicate isBarrierOut(Node node) { none() } - - /** - * Holds if data may flow from `node1` to `node2` in addition to the normal data-flow steps. - */ - predicate isAdditionalFlowStep(Node node1, Node node2) { none() } - - /** - * Holds if data may flow from `node1` to `node2` in addition to the normal data-flow steps. - * This step is only applicable in `state1` and updates the flow state to `state2`. - */ - predicate isAdditionalFlowStep(Node node1, FlowState state1, Node node2, FlowState state2) { - none() - } - - /** - * Holds if an arbitrary number of implicit read steps of content `c` may be - * taken at `node`. - */ - predicate allowImplicitRead(Node node, ContentSet c) { none() } - - /** - * Gets the virtual dispatch branching limit when calculating field flow. - * This can be overridden to a smaller value to improve performance (a - * value of 0 disables field flow), or a larger value to get more results. - */ - int fieldFlowBranchLimit() { result = 2 } - - /** - * Gets a data flow configuration feature to add restrictions to the set of - * valid flow paths. - * - * - `FeatureHasSourceCallContext`: - * Assume that sources have some existing call context to disallow - * conflicting return-flow directly following the source. - * - `FeatureHasSinkCallContext`: - * Assume that sinks have some existing call context to disallow - * conflicting argument-to-parameter flow directly preceding the sink. - * - `FeatureEqualSourceSinkCallContext`: - * Implies both of the above and additionally ensures that the entire flow - * path preserves the call context. - * - * These features are generally not relevant for typical end-to-end data flow - * queries, but should only be used for constructing paths that need to - * somehow be pluggable in another path context. - */ - FlowFeature getAFeature() { none() } - - /** Holds if sources should be grouped in the result of `hasFlowPath`. */ - predicate sourceGrouping(Node source, string sourceGroup) { none() } - - /** Holds if sinks should be grouped in the result of `hasFlowPath`. */ - predicate sinkGrouping(Node sink, string sinkGroup) { none() } - - /** - * Holds if data may flow from `source` to `sink` for this configuration. - */ - predicate hasFlow(Node source, Node sink) { hasFlow(source, sink, this) } - - /** - * Holds if data may flow from `source` to `sink` for this configuration. - * - * The corresponding paths are generated from the end-points and the graph - * included in the module `PathGraph`. - */ - predicate hasFlowPath(PathNode source, PathNode sink) { hasFlowPath(source, sink, this) } - - /** - * Holds if data may flow from some source to `sink` for this configuration. - */ - predicate hasFlowTo(Node sink) { hasFlowTo(sink, this) } - - /** - * Holds if data may flow from some source to `sink` for this configuration. - */ - predicate hasFlowToExpr(DataFlowExpr sink) { this.hasFlowTo(exprNode(sink)) } - - /** - * Holds if hidden nodes should be included in the data flow graph. - * - * This feature should only be used for debugging or when the data flow graph - * is not visualized (for example in a `path-problem` query). - */ - predicate includeHiddenNodes() { none() } -} - -/** - * This class exists to prevent mutual recursion between the user-overridden - * member predicates of `Configuration` and the rest of the data-flow library. - * Good performance cannot be guaranteed in the presence of such recursion, so - * it should be replaced by using more than one copy of the data flow library. - */ -abstract deprecated private class ConfigurationRecursionPrevention extends Configuration { - bindingset[this] - ConfigurationRecursionPrevention() { any() } - - override predicate hasFlow(Node source, Node sink) { - strictcount(Node n | this.isSource(n)) < 0 - or - strictcount(Node n | this.isSource(n, _)) < 0 - or - strictcount(Node n | this.isSink(n)) < 0 - or - strictcount(Node n | this.isSink(n, _)) < 0 - or - strictcount(Node n1, Node n2 | this.isAdditionalFlowStep(n1, n2)) < 0 - or - strictcount(Node n1, Node n2 | this.isAdditionalFlowStep(n1, _, n2, _)) < 0 - or - super.hasFlow(source, sink) - } -} - -deprecated private FlowState relevantState(Configuration config) { - config.isSource(_, result) or - config.isSink(_, result) or - config.isBarrier(_, result) or - config.isAdditionalFlowStep(_, result, _, _) or - config.isAdditionalFlowStep(_, _, _, result) -} - -private newtype TConfigState = - deprecated TMkConfigState(Configuration config, FlowState state) { - state = relevantState(config) or state instanceof FlowStateEmpty - } - -deprecated private Configuration getConfig(TConfigState state) { state = TMkConfigState(result, _) } - -deprecated private FlowState getState(TConfigState state) { state = TMkConfigState(_, result) } - -deprecated private predicate singleConfiguration() { 1 = strictcount(Configuration c) } - -deprecated private module Config implements FullStateConfigSig { - class FlowState = TConfigState; - - predicate isSource(Node source, FlowState state) { - getConfig(state).isSource(source, getState(state)) - or - getConfig(state).isSource(source) and getState(state) instanceof FlowStateEmpty - } - - predicate isSink(Node sink) { none() } - - predicate isSink(Node sink, FlowState state) { - getConfig(state).isSink(sink, getState(state)) - or - getConfig(state).isSink(sink) and getState(state) instanceof FlowStateEmpty - } - - predicate isBarrier(Node node) { none() } - - predicate isBarrier(Node node, FlowState state) { - getConfig(state).isBarrier(node, getState(state)) or - getConfig(state).isBarrier(node) - } - - predicate isBarrierIn(Node node) { any(Configuration config).isBarrierIn(node) } - - predicate isBarrierOut(Node node) { any(Configuration config).isBarrierOut(node) } - - predicate isBarrierIn(Node node, FlowState state) { none() } - - predicate isBarrierOut(Node node, FlowState state) { none() } - - predicate isAdditionalFlowStep(Node node1, Node node2, string model) { - singleConfiguration() and - any(Configuration config).isAdditionalFlowStep(node1, node2) and - model = "" - } - - predicate isAdditionalFlowStep( - Node node1, FlowState state1, Node node2, FlowState state2, string model - ) { - getConfig(state1).isAdditionalFlowStep(node1, getState(state1), node2, getState(state2)) and - getConfig(state2) = getConfig(state1) and - model = "" - or - not singleConfiguration() and - getConfig(state1).isAdditionalFlowStep(node1, node2) and - state2 = state1 and - model = "" - } - - predicate allowImplicitRead(Node node, ContentSet c) { - any(Configuration config).allowImplicitRead(node, c) - } - - predicate neverSkip(Node node) { none() } - - int fieldFlowBranchLimit() { result = min(any(Configuration config).fieldFlowBranchLimit()) } - - int accessPathLimit() { result = 5 } - - FlowFeature getAFeature() { result = any(Configuration config).getAFeature() } - - predicate includeHiddenNodes() { any(Configuration config).includeHiddenNodes() } - - predicate observeDiffInformedIncrementalMode() { none() } -} - -deprecated private import Impl as I - -/** - * A `Node` augmented with a call context (except for sinks), an access path, and a configuration. - * Only those `PathNode`s that are reachable from a source, and which can reach a sink, are generated. - */ -deprecated class PathNode instanceof I::PathNode { - /** Gets a textual representation of this element. */ - final string toString() { result = super.toString() } - - /** - * Gets a textual representation of this element, including a textual - * representation of the call context. - */ - final string toStringWithContext() { result = super.toStringWithContext() } - - /** - * Holds if this element is at the specified location. - * The location spans column `startcolumn` of line `startline` to - * column `endcolumn` of line `endline` in file `filepath`. - * For more information, see - * [Locations](https://codeql.github.com/docs/writing-codeql-queries/providing-locations-in-codeql-queries/). - */ - final predicate hasLocationInfo( - string filepath, int startline, int startcolumn, int endline, int endcolumn - ) { - super.hasLocationInfo(filepath, startline, startcolumn, endline, endcolumn) - } - - /** Gets the underlying `Node`. */ - final Node getNode() { result = super.getNode() } - - /** Gets the `FlowState` of this node. */ - deprecated final FlowState getState() { result = getState(super.getState()) } - - /** Gets the associated configuration. */ - deprecated final Configuration getConfiguration() { result = getConfig(super.getState()) } - - /** Gets a successor of this node, if any. */ - final PathNode getASuccessor() { result = super.getASuccessor() } - - /** Holds if this node is a source. */ - final predicate isSource() { super.isSource() } - - /** Holds if this node is a grouping of source nodes. */ - final predicate isSourceGroup(string group) { super.isSourceGroup(group) } - - /** Holds if this node is a grouping of sink nodes. */ - final predicate isSinkGroup(string group) { super.isSinkGroup(group) } -} - -deprecated module PathGraph = I::PathGraph; - -deprecated private predicate hasFlow(Node source, Node sink, Configuration config) { - exists(PathNode source0, PathNode sink0 | - hasFlowPath(source0, sink0, config) and - source0.getNode() = source and - sink0.getNode() = sink - ) -} - -deprecated private predicate hasFlowPath(PathNode source, PathNode sink, Configuration config) { - I::flowPath(source, sink) and source.getConfiguration() = config -} - -deprecated private predicate hasFlowTo(Node sink, Configuration config) { hasFlow(_, sink, config) } - -deprecated predicate flowsTo = hasFlow/3; diff --git a/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowImpl2.qll b/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowImpl2.qll deleted file mode 100644 index 17def0c431d..00000000000 --- a/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowImpl2.qll +++ /dev/null @@ -1,361 +0,0 @@ -/** - * DEPRECATED: Use `Global` and `GlobalWithState` instead. - * - * Provides a `Configuration` class backwards-compatible interface to the data - * flow library. - */ - -private import DataFlowImplCommon -private import DataFlowImplSpecific::Private -import DataFlowImplSpecific::Public -private import DataFlowImpl -import DataFlowImplCommonPublic -deprecated import FlowStateString -private import codeql.util.Unit - -/** - * DEPRECATED: Use `Global` and `GlobalWithState` instead. - * - * A configuration of interprocedural data flow analysis. This defines - * sources, sinks, and any other configurable aspect of the analysis. Each - * use of the global data flow library must define its own unique extension - * of this abstract class. To create a configuration, extend this class with - * a subclass whose characteristic predicate is a unique singleton string. - * For example, write - * - * ```ql - * class MyAnalysisConfiguration extends DataFlow::Configuration { - * MyAnalysisConfiguration() { this = "MyAnalysisConfiguration" } - * // Override `isSource` and `isSink`. - * // Optionally override `isBarrier`. - * // Optionally override `isAdditionalFlowStep`. - * } - * ``` - * Conceptually, this defines a graph where the nodes are `DataFlow::Node`s and - * the edges are those data-flow steps that preserve the value of the node - * along with any additional edges defined by `isAdditionalFlowStep`. - * Specifying nodes in `isBarrier` will remove those nodes from the graph, and - * specifying nodes in `isBarrierIn` and/or `isBarrierOut` will remove in-going - * and/or out-going edges from those nodes, respectively. - * - * Then, to query whether there is flow between some `source` and `sink`, - * write - * - * ```ql - * exists(MyAnalysisConfiguration cfg | cfg.hasFlow(source, sink)) - * ``` - * - * Multiple configurations can coexist, but two classes extending - * `DataFlow::Configuration` should never depend on each other. One of them - * should instead depend on a `DataFlow2::Configuration`, a - * `DataFlow3::Configuration`, or a `DataFlow4::Configuration`. - */ -abstract deprecated class Configuration extends string { - bindingset[this] - Configuration() { any() } - - /** - * Holds if `source` is a relevant data flow source. - */ - predicate isSource(Node source) { none() } - - /** - * Holds if `source` is a relevant data flow source with the given initial - * `state`. - */ - predicate isSource(Node source, FlowState state) { none() } - - /** - * Holds if `sink` is a relevant data flow sink. - */ - predicate isSink(Node sink) { none() } - - /** - * Holds if `sink` is a relevant data flow sink accepting `state`. - */ - predicate isSink(Node sink, FlowState state) { none() } - - /** - * Holds if data flow through `node` is prohibited. This completely removes - * `node` from the data flow graph. - */ - predicate isBarrier(Node node) { none() } - - /** - * Holds if data flow through `node` is prohibited when the flow state is - * `state`. - */ - predicate isBarrier(Node node, FlowState state) { none() } - - /** Holds if data flow into `node` is prohibited. */ - predicate isBarrierIn(Node node) { none() } - - /** Holds if data flow out of `node` is prohibited. */ - predicate isBarrierOut(Node node) { none() } - - /** - * Holds if data may flow from `node1` to `node2` in addition to the normal data-flow steps. - */ - predicate isAdditionalFlowStep(Node node1, Node node2) { none() } - - /** - * Holds if data may flow from `node1` to `node2` in addition to the normal data-flow steps. - * This step is only applicable in `state1` and updates the flow state to `state2`. - */ - predicate isAdditionalFlowStep(Node node1, FlowState state1, Node node2, FlowState state2) { - none() - } - - /** - * Holds if an arbitrary number of implicit read steps of content `c` may be - * taken at `node`. - */ - predicate allowImplicitRead(Node node, ContentSet c) { none() } - - /** - * Gets the virtual dispatch branching limit when calculating field flow. - * This can be overridden to a smaller value to improve performance (a - * value of 0 disables field flow), or a larger value to get more results. - */ - int fieldFlowBranchLimit() { result = 2 } - - /** - * Gets a data flow configuration feature to add restrictions to the set of - * valid flow paths. - * - * - `FeatureHasSourceCallContext`: - * Assume that sources have some existing call context to disallow - * conflicting return-flow directly following the source. - * - `FeatureHasSinkCallContext`: - * Assume that sinks have some existing call context to disallow - * conflicting argument-to-parameter flow directly preceding the sink. - * - `FeatureEqualSourceSinkCallContext`: - * Implies both of the above and additionally ensures that the entire flow - * path preserves the call context. - * - * These features are generally not relevant for typical end-to-end data flow - * queries, but should only be used for constructing paths that need to - * somehow be pluggable in another path context. - */ - FlowFeature getAFeature() { none() } - - /** Holds if sources should be grouped in the result of `hasFlowPath`. */ - predicate sourceGrouping(Node source, string sourceGroup) { none() } - - /** Holds if sinks should be grouped in the result of `hasFlowPath`. */ - predicate sinkGrouping(Node sink, string sinkGroup) { none() } - - /** - * Holds if data may flow from `source` to `sink` for this configuration. - */ - predicate hasFlow(Node source, Node sink) { hasFlow(source, sink, this) } - - /** - * Holds if data may flow from `source` to `sink` for this configuration. - * - * The corresponding paths are generated from the end-points and the graph - * included in the module `PathGraph`. - */ - predicate hasFlowPath(PathNode source, PathNode sink) { hasFlowPath(source, sink, this) } - - /** - * Holds if data may flow from some source to `sink` for this configuration. - */ - predicate hasFlowTo(Node sink) { hasFlowTo(sink, this) } - - /** - * Holds if data may flow from some source to `sink` for this configuration. - */ - predicate hasFlowToExpr(DataFlowExpr sink) { this.hasFlowTo(exprNode(sink)) } - - /** - * Holds if hidden nodes should be included in the data flow graph. - * - * This feature should only be used for debugging or when the data flow graph - * is not visualized (for example in a `path-problem` query). - */ - predicate includeHiddenNodes() { none() } -} - -/** - * This class exists to prevent mutual recursion between the user-overridden - * member predicates of `Configuration` and the rest of the data-flow library. - * Good performance cannot be guaranteed in the presence of such recursion, so - * it should be replaced by using more than one copy of the data flow library. - */ -abstract deprecated private class ConfigurationRecursionPrevention extends Configuration { - bindingset[this] - ConfigurationRecursionPrevention() { any() } - - override predicate hasFlow(Node source, Node sink) { - strictcount(Node n | this.isSource(n)) < 0 - or - strictcount(Node n | this.isSource(n, _)) < 0 - or - strictcount(Node n | this.isSink(n)) < 0 - or - strictcount(Node n | this.isSink(n, _)) < 0 - or - strictcount(Node n1, Node n2 | this.isAdditionalFlowStep(n1, n2)) < 0 - or - strictcount(Node n1, Node n2 | this.isAdditionalFlowStep(n1, _, n2, _)) < 0 - or - super.hasFlow(source, sink) - } -} - -deprecated private FlowState relevantState(Configuration config) { - config.isSource(_, result) or - config.isSink(_, result) or - config.isBarrier(_, result) or - config.isAdditionalFlowStep(_, result, _, _) or - config.isAdditionalFlowStep(_, _, _, result) -} - -private newtype TConfigState = - deprecated TMkConfigState(Configuration config, FlowState state) { - state = relevantState(config) or state instanceof FlowStateEmpty - } - -deprecated private Configuration getConfig(TConfigState state) { state = TMkConfigState(result, _) } - -deprecated private FlowState getState(TConfigState state) { state = TMkConfigState(_, result) } - -deprecated private predicate singleConfiguration() { 1 = strictcount(Configuration c) } - -deprecated private module Config implements FullStateConfigSig { - class FlowState = TConfigState; - - predicate isSource(Node source, FlowState state) { - getConfig(state).isSource(source, getState(state)) - or - getConfig(state).isSource(source) and getState(state) instanceof FlowStateEmpty - } - - predicate isSink(Node sink) { none() } - - predicate isSink(Node sink, FlowState state) { - getConfig(state).isSink(sink, getState(state)) - or - getConfig(state).isSink(sink) and getState(state) instanceof FlowStateEmpty - } - - predicate isBarrier(Node node) { none() } - - predicate isBarrier(Node node, FlowState state) { - getConfig(state).isBarrier(node, getState(state)) or - getConfig(state).isBarrier(node) - } - - predicate isBarrierIn(Node node) { any(Configuration config).isBarrierIn(node) } - - predicate isBarrierOut(Node node) { any(Configuration config).isBarrierOut(node) } - - predicate isBarrierIn(Node node, FlowState state) { none() } - - predicate isBarrierOut(Node node, FlowState state) { none() } - - predicate isAdditionalFlowStep(Node node1, Node node2, string model) { - singleConfiguration() and - any(Configuration config).isAdditionalFlowStep(node1, node2) and - model = "" - } - - predicate isAdditionalFlowStep( - Node node1, FlowState state1, Node node2, FlowState state2, string model - ) { - getConfig(state1).isAdditionalFlowStep(node1, getState(state1), node2, getState(state2)) and - getConfig(state2) = getConfig(state1) and - model = "" - or - not singleConfiguration() and - getConfig(state1).isAdditionalFlowStep(node1, node2) and - state2 = state1 and - model = "" - } - - predicate allowImplicitRead(Node node, ContentSet c) { - any(Configuration config).allowImplicitRead(node, c) - } - - predicate neverSkip(Node node) { none() } - - int fieldFlowBranchLimit() { result = min(any(Configuration config).fieldFlowBranchLimit()) } - - int accessPathLimit() { result = 5 } - - FlowFeature getAFeature() { result = any(Configuration config).getAFeature() } - - predicate includeHiddenNodes() { any(Configuration config).includeHiddenNodes() } - - predicate observeDiffInformedIncrementalMode() { none() } -} - -deprecated private import Impl as I - -/** - * A `Node` augmented with a call context (except for sinks), an access path, and a configuration. - * Only those `PathNode`s that are reachable from a source, and which can reach a sink, are generated. - */ -deprecated class PathNode instanceof I::PathNode { - /** Gets a textual representation of this element. */ - final string toString() { result = super.toString() } - - /** - * Gets a textual representation of this element, including a textual - * representation of the call context. - */ - final string toStringWithContext() { result = super.toStringWithContext() } - - /** - * Holds if this element is at the specified location. - * The location spans column `startcolumn` of line `startline` to - * column `endcolumn` of line `endline` in file `filepath`. - * For more information, see - * [Locations](https://codeql.github.com/docs/writing-codeql-queries/providing-locations-in-codeql-queries/). - */ - final predicate hasLocationInfo( - string filepath, int startline, int startcolumn, int endline, int endcolumn - ) { - super.hasLocationInfo(filepath, startline, startcolumn, endline, endcolumn) - } - - /** Gets the underlying `Node`. */ - final Node getNode() { result = super.getNode() } - - /** Gets the `FlowState` of this node. */ - deprecated final FlowState getState() { result = getState(super.getState()) } - - /** Gets the associated configuration. */ - deprecated final Configuration getConfiguration() { result = getConfig(super.getState()) } - - /** Gets a successor of this node, if any. */ - final PathNode getASuccessor() { result = super.getASuccessor() } - - /** Holds if this node is a source. */ - final predicate isSource() { super.isSource() } - - /** Holds if this node is a grouping of source nodes. */ - final predicate isSourceGroup(string group) { super.isSourceGroup(group) } - - /** Holds if this node is a grouping of sink nodes. */ - final predicate isSinkGroup(string group) { super.isSinkGroup(group) } -} - -deprecated module PathGraph = I::PathGraph; - -deprecated private predicate hasFlow(Node source, Node sink, Configuration config) { - exists(PathNode source0, PathNode sink0 | - hasFlowPath(source0, sink0, config) and - source0.getNode() = source and - sink0.getNode() = sink - ) -} - -deprecated private predicate hasFlowPath(PathNode source, PathNode sink, Configuration config) { - I::flowPath(source, sink) and source.getConfiguration() = config -} - -deprecated private predicate hasFlowTo(Node sink, Configuration config) { hasFlow(_, sink, config) } - -deprecated predicate flowsTo = hasFlow/3; diff --git a/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowImpl3.qll b/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowImpl3.qll deleted file mode 100644 index 17def0c431d..00000000000 --- a/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowImpl3.qll +++ /dev/null @@ -1,361 +0,0 @@ -/** - * DEPRECATED: Use `Global` and `GlobalWithState` instead. - * - * Provides a `Configuration` class backwards-compatible interface to the data - * flow library. - */ - -private import DataFlowImplCommon -private import DataFlowImplSpecific::Private -import DataFlowImplSpecific::Public -private import DataFlowImpl -import DataFlowImplCommonPublic -deprecated import FlowStateString -private import codeql.util.Unit - -/** - * DEPRECATED: Use `Global` and `GlobalWithState` instead. - * - * A configuration of interprocedural data flow analysis. This defines - * sources, sinks, and any other configurable aspect of the analysis. Each - * use of the global data flow library must define its own unique extension - * of this abstract class. To create a configuration, extend this class with - * a subclass whose characteristic predicate is a unique singleton string. - * For example, write - * - * ```ql - * class MyAnalysisConfiguration extends DataFlow::Configuration { - * MyAnalysisConfiguration() { this = "MyAnalysisConfiguration" } - * // Override `isSource` and `isSink`. - * // Optionally override `isBarrier`. - * // Optionally override `isAdditionalFlowStep`. - * } - * ``` - * Conceptually, this defines a graph where the nodes are `DataFlow::Node`s and - * the edges are those data-flow steps that preserve the value of the node - * along with any additional edges defined by `isAdditionalFlowStep`. - * Specifying nodes in `isBarrier` will remove those nodes from the graph, and - * specifying nodes in `isBarrierIn` and/or `isBarrierOut` will remove in-going - * and/or out-going edges from those nodes, respectively. - * - * Then, to query whether there is flow between some `source` and `sink`, - * write - * - * ```ql - * exists(MyAnalysisConfiguration cfg | cfg.hasFlow(source, sink)) - * ``` - * - * Multiple configurations can coexist, but two classes extending - * `DataFlow::Configuration` should never depend on each other. One of them - * should instead depend on a `DataFlow2::Configuration`, a - * `DataFlow3::Configuration`, or a `DataFlow4::Configuration`. - */ -abstract deprecated class Configuration extends string { - bindingset[this] - Configuration() { any() } - - /** - * Holds if `source` is a relevant data flow source. - */ - predicate isSource(Node source) { none() } - - /** - * Holds if `source` is a relevant data flow source with the given initial - * `state`. - */ - predicate isSource(Node source, FlowState state) { none() } - - /** - * Holds if `sink` is a relevant data flow sink. - */ - predicate isSink(Node sink) { none() } - - /** - * Holds if `sink` is a relevant data flow sink accepting `state`. - */ - predicate isSink(Node sink, FlowState state) { none() } - - /** - * Holds if data flow through `node` is prohibited. This completely removes - * `node` from the data flow graph. - */ - predicate isBarrier(Node node) { none() } - - /** - * Holds if data flow through `node` is prohibited when the flow state is - * `state`. - */ - predicate isBarrier(Node node, FlowState state) { none() } - - /** Holds if data flow into `node` is prohibited. */ - predicate isBarrierIn(Node node) { none() } - - /** Holds if data flow out of `node` is prohibited. */ - predicate isBarrierOut(Node node) { none() } - - /** - * Holds if data may flow from `node1` to `node2` in addition to the normal data-flow steps. - */ - predicate isAdditionalFlowStep(Node node1, Node node2) { none() } - - /** - * Holds if data may flow from `node1` to `node2` in addition to the normal data-flow steps. - * This step is only applicable in `state1` and updates the flow state to `state2`. - */ - predicate isAdditionalFlowStep(Node node1, FlowState state1, Node node2, FlowState state2) { - none() - } - - /** - * Holds if an arbitrary number of implicit read steps of content `c` may be - * taken at `node`. - */ - predicate allowImplicitRead(Node node, ContentSet c) { none() } - - /** - * Gets the virtual dispatch branching limit when calculating field flow. - * This can be overridden to a smaller value to improve performance (a - * value of 0 disables field flow), or a larger value to get more results. - */ - int fieldFlowBranchLimit() { result = 2 } - - /** - * Gets a data flow configuration feature to add restrictions to the set of - * valid flow paths. - * - * - `FeatureHasSourceCallContext`: - * Assume that sources have some existing call context to disallow - * conflicting return-flow directly following the source. - * - `FeatureHasSinkCallContext`: - * Assume that sinks have some existing call context to disallow - * conflicting argument-to-parameter flow directly preceding the sink. - * - `FeatureEqualSourceSinkCallContext`: - * Implies both of the above and additionally ensures that the entire flow - * path preserves the call context. - * - * These features are generally not relevant for typical end-to-end data flow - * queries, but should only be used for constructing paths that need to - * somehow be pluggable in another path context. - */ - FlowFeature getAFeature() { none() } - - /** Holds if sources should be grouped in the result of `hasFlowPath`. */ - predicate sourceGrouping(Node source, string sourceGroup) { none() } - - /** Holds if sinks should be grouped in the result of `hasFlowPath`. */ - predicate sinkGrouping(Node sink, string sinkGroup) { none() } - - /** - * Holds if data may flow from `source` to `sink` for this configuration. - */ - predicate hasFlow(Node source, Node sink) { hasFlow(source, sink, this) } - - /** - * Holds if data may flow from `source` to `sink` for this configuration. - * - * The corresponding paths are generated from the end-points and the graph - * included in the module `PathGraph`. - */ - predicate hasFlowPath(PathNode source, PathNode sink) { hasFlowPath(source, sink, this) } - - /** - * Holds if data may flow from some source to `sink` for this configuration. - */ - predicate hasFlowTo(Node sink) { hasFlowTo(sink, this) } - - /** - * Holds if data may flow from some source to `sink` for this configuration. - */ - predicate hasFlowToExpr(DataFlowExpr sink) { this.hasFlowTo(exprNode(sink)) } - - /** - * Holds if hidden nodes should be included in the data flow graph. - * - * This feature should only be used for debugging or when the data flow graph - * is not visualized (for example in a `path-problem` query). - */ - predicate includeHiddenNodes() { none() } -} - -/** - * This class exists to prevent mutual recursion between the user-overridden - * member predicates of `Configuration` and the rest of the data-flow library. - * Good performance cannot be guaranteed in the presence of such recursion, so - * it should be replaced by using more than one copy of the data flow library. - */ -abstract deprecated private class ConfigurationRecursionPrevention extends Configuration { - bindingset[this] - ConfigurationRecursionPrevention() { any() } - - override predicate hasFlow(Node source, Node sink) { - strictcount(Node n | this.isSource(n)) < 0 - or - strictcount(Node n | this.isSource(n, _)) < 0 - or - strictcount(Node n | this.isSink(n)) < 0 - or - strictcount(Node n | this.isSink(n, _)) < 0 - or - strictcount(Node n1, Node n2 | this.isAdditionalFlowStep(n1, n2)) < 0 - or - strictcount(Node n1, Node n2 | this.isAdditionalFlowStep(n1, _, n2, _)) < 0 - or - super.hasFlow(source, sink) - } -} - -deprecated private FlowState relevantState(Configuration config) { - config.isSource(_, result) or - config.isSink(_, result) or - config.isBarrier(_, result) or - config.isAdditionalFlowStep(_, result, _, _) or - config.isAdditionalFlowStep(_, _, _, result) -} - -private newtype TConfigState = - deprecated TMkConfigState(Configuration config, FlowState state) { - state = relevantState(config) or state instanceof FlowStateEmpty - } - -deprecated private Configuration getConfig(TConfigState state) { state = TMkConfigState(result, _) } - -deprecated private FlowState getState(TConfigState state) { state = TMkConfigState(_, result) } - -deprecated private predicate singleConfiguration() { 1 = strictcount(Configuration c) } - -deprecated private module Config implements FullStateConfigSig { - class FlowState = TConfigState; - - predicate isSource(Node source, FlowState state) { - getConfig(state).isSource(source, getState(state)) - or - getConfig(state).isSource(source) and getState(state) instanceof FlowStateEmpty - } - - predicate isSink(Node sink) { none() } - - predicate isSink(Node sink, FlowState state) { - getConfig(state).isSink(sink, getState(state)) - or - getConfig(state).isSink(sink) and getState(state) instanceof FlowStateEmpty - } - - predicate isBarrier(Node node) { none() } - - predicate isBarrier(Node node, FlowState state) { - getConfig(state).isBarrier(node, getState(state)) or - getConfig(state).isBarrier(node) - } - - predicate isBarrierIn(Node node) { any(Configuration config).isBarrierIn(node) } - - predicate isBarrierOut(Node node) { any(Configuration config).isBarrierOut(node) } - - predicate isBarrierIn(Node node, FlowState state) { none() } - - predicate isBarrierOut(Node node, FlowState state) { none() } - - predicate isAdditionalFlowStep(Node node1, Node node2, string model) { - singleConfiguration() and - any(Configuration config).isAdditionalFlowStep(node1, node2) and - model = "" - } - - predicate isAdditionalFlowStep( - Node node1, FlowState state1, Node node2, FlowState state2, string model - ) { - getConfig(state1).isAdditionalFlowStep(node1, getState(state1), node2, getState(state2)) and - getConfig(state2) = getConfig(state1) and - model = "" - or - not singleConfiguration() and - getConfig(state1).isAdditionalFlowStep(node1, node2) and - state2 = state1 and - model = "" - } - - predicate allowImplicitRead(Node node, ContentSet c) { - any(Configuration config).allowImplicitRead(node, c) - } - - predicate neverSkip(Node node) { none() } - - int fieldFlowBranchLimit() { result = min(any(Configuration config).fieldFlowBranchLimit()) } - - int accessPathLimit() { result = 5 } - - FlowFeature getAFeature() { result = any(Configuration config).getAFeature() } - - predicate includeHiddenNodes() { any(Configuration config).includeHiddenNodes() } - - predicate observeDiffInformedIncrementalMode() { none() } -} - -deprecated private import Impl as I - -/** - * A `Node` augmented with a call context (except for sinks), an access path, and a configuration. - * Only those `PathNode`s that are reachable from a source, and which can reach a sink, are generated. - */ -deprecated class PathNode instanceof I::PathNode { - /** Gets a textual representation of this element. */ - final string toString() { result = super.toString() } - - /** - * Gets a textual representation of this element, including a textual - * representation of the call context. - */ - final string toStringWithContext() { result = super.toStringWithContext() } - - /** - * Holds if this element is at the specified location. - * The location spans column `startcolumn` of line `startline` to - * column `endcolumn` of line `endline` in file `filepath`. - * For more information, see - * [Locations](https://codeql.github.com/docs/writing-codeql-queries/providing-locations-in-codeql-queries/). - */ - final predicate hasLocationInfo( - string filepath, int startline, int startcolumn, int endline, int endcolumn - ) { - super.hasLocationInfo(filepath, startline, startcolumn, endline, endcolumn) - } - - /** Gets the underlying `Node`. */ - final Node getNode() { result = super.getNode() } - - /** Gets the `FlowState` of this node. */ - deprecated final FlowState getState() { result = getState(super.getState()) } - - /** Gets the associated configuration. */ - deprecated final Configuration getConfiguration() { result = getConfig(super.getState()) } - - /** Gets a successor of this node, if any. */ - final PathNode getASuccessor() { result = super.getASuccessor() } - - /** Holds if this node is a source. */ - final predicate isSource() { super.isSource() } - - /** Holds if this node is a grouping of source nodes. */ - final predicate isSourceGroup(string group) { super.isSourceGroup(group) } - - /** Holds if this node is a grouping of sink nodes. */ - final predicate isSinkGroup(string group) { super.isSinkGroup(group) } -} - -deprecated module PathGraph = I::PathGraph; - -deprecated private predicate hasFlow(Node source, Node sink, Configuration config) { - exists(PathNode source0, PathNode sink0 | - hasFlowPath(source0, sink0, config) and - source0.getNode() = source and - sink0.getNode() = sink - ) -} - -deprecated private predicate hasFlowPath(PathNode source, PathNode sink, Configuration config) { - I::flowPath(source, sink) and source.getConfiguration() = config -} - -deprecated private predicate hasFlowTo(Node sink, Configuration config) { hasFlow(_, sink, config) } - -deprecated predicate flowsTo = hasFlow/3; diff --git a/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowImpl4.qll b/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowImpl4.qll deleted file mode 100644 index 17def0c431d..00000000000 --- a/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowImpl4.qll +++ /dev/null @@ -1,361 +0,0 @@ -/** - * DEPRECATED: Use `Global` and `GlobalWithState` instead. - * - * Provides a `Configuration` class backwards-compatible interface to the data - * flow library. - */ - -private import DataFlowImplCommon -private import DataFlowImplSpecific::Private -import DataFlowImplSpecific::Public -private import DataFlowImpl -import DataFlowImplCommonPublic -deprecated import FlowStateString -private import codeql.util.Unit - -/** - * DEPRECATED: Use `Global` and `GlobalWithState` instead. - * - * A configuration of interprocedural data flow analysis. This defines - * sources, sinks, and any other configurable aspect of the analysis. Each - * use of the global data flow library must define its own unique extension - * of this abstract class. To create a configuration, extend this class with - * a subclass whose characteristic predicate is a unique singleton string. - * For example, write - * - * ```ql - * class MyAnalysisConfiguration extends DataFlow::Configuration { - * MyAnalysisConfiguration() { this = "MyAnalysisConfiguration" } - * // Override `isSource` and `isSink`. - * // Optionally override `isBarrier`. - * // Optionally override `isAdditionalFlowStep`. - * } - * ``` - * Conceptually, this defines a graph where the nodes are `DataFlow::Node`s and - * the edges are those data-flow steps that preserve the value of the node - * along with any additional edges defined by `isAdditionalFlowStep`. - * Specifying nodes in `isBarrier` will remove those nodes from the graph, and - * specifying nodes in `isBarrierIn` and/or `isBarrierOut` will remove in-going - * and/or out-going edges from those nodes, respectively. - * - * Then, to query whether there is flow between some `source` and `sink`, - * write - * - * ```ql - * exists(MyAnalysisConfiguration cfg | cfg.hasFlow(source, sink)) - * ``` - * - * Multiple configurations can coexist, but two classes extending - * `DataFlow::Configuration` should never depend on each other. One of them - * should instead depend on a `DataFlow2::Configuration`, a - * `DataFlow3::Configuration`, or a `DataFlow4::Configuration`. - */ -abstract deprecated class Configuration extends string { - bindingset[this] - Configuration() { any() } - - /** - * Holds if `source` is a relevant data flow source. - */ - predicate isSource(Node source) { none() } - - /** - * Holds if `source` is a relevant data flow source with the given initial - * `state`. - */ - predicate isSource(Node source, FlowState state) { none() } - - /** - * Holds if `sink` is a relevant data flow sink. - */ - predicate isSink(Node sink) { none() } - - /** - * Holds if `sink` is a relevant data flow sink accepting `state`. - */ - predicate isSink(Node sink, FlowState state) { none() } - - /** - * Holds if data flow through `node` is prohibited. This completely removes - * `node` from the data flow graph. - */ - predicate isBarrier(Node node) { none() } - - /** - * Holds if data flow through `node` is prohibited when the flow state is - * `state`. - */ - predicate isBarrier(Node node, FlowState state) { none() } - - /** Holds if data flow into `node` is prohibited. */ - predicate isBarrierIn(Node node) { none() } - - /** Holds if data flow out of `node` is prohibited. */ - predicate isBarrierOut(Node node) { none() } - - /** - * Holds if data may flow from `node1` to `node2` in addition to the normal data-flow steps. - */ - predicate isAdditionalFlowStep(Node node1, Node node2) { none() } - - /** - * Holds if data may flow from `node1` to `node2` in addition to the normal data-flow steps. - * This step is only applicable in `state1` and updates the flow state to `state2`. - */ - predicate isAdditionalFlowStep(Node node1, FlowState state1, Node node2, FlowState state2) { - none() - } - - /** - * Holds if an arbitrary number of implicit read steps of content `c` may be - * taken at `node`. - */ - predicate allowImplicitRead(Node node, ContentSet c) { none() } - - /** - * Gets the virtual dispatch branching limit when calculating field flow. - * This can be overridden to a smaller value to improve performance (a - * value of 0 disables field flow), or a larger value to get more results. - */ - int fieldFlowBranchLimit() { result = 2 } - - /** - * Gets a data flow configuration feature to add restrictions to the set of - * valid flow paths. - * - * - `FeatureHasSourceCallContext`: - * Assume that sources have some existing call context to disallow - * conflicting return-flow directly following the source. - * - `FeatureHasSinkCallContext`: - * Assume that sinks have some existing call context to disallow - * conflicting argument-to-parameter flow directly preceding the sink. - * - `FeatureEqualSourceSinkCallContext`: - * Implies both of the above and additionally ensures that the entire flow - * path preserves the call context. - * - * These features are generally not relevant for typical end-to-end data flow - * queries, but should only be used for constructing paths that need to - * somehow be pluggable in another path context. - */ - FlowFeature getAFeature() { none() } - - /** Holds if sources should be grouped in the result of `hasFlowPath`. */ - predicate sourceGrouping(Node source, string sourceGroup) { none() } - - /** Holds if sinks should be grouped in the result of `hasFlowPath`. */ - predicate sinkGrouping(Node sink, string sinkGroup) { none() } - - /** - * Holds if data may flow from `source` to `sink` for this configuration. - */ - predicate hasFlow(Node source, Node sink) { hasFlow(source, sink, this) } - - /** - * Holds if data may flow from `source` to `sink` for this configuration. - * - * The corresponding paths are generated from the end-points and the graph - * included in the module `PathGraph`. - */ - predicate hasFlowPath(PathNode source, PathNode sink) { hasFlowPath(source, sink, this) } - - /** - * Holds if data may flow from some source to `sink` for this configuration. - */ - predicate hasFlowTo(Node sink) { hasFlowTo(sink, this) } - - /** - * Holds if data may flow from some source to `sink` for this configuration. - */ - predicate hasFlowToExpr(DataFlowExpr sink) { this.hasFlowTo(exprNode(sink)) } - - /** - * Holds if hidden nodes should be included in the data flow graph. - * - * This feature should only be used for debugging or when the data flow graph - * is not visualized (for example in a `path-problem` query). - */ - predicate includeHiddenNodes() { none() } -} - -/** - * This class exists to prevent mutual recursion between the user-overridden - * member predicates of `Configuration` and the rest of the data-flow library. - * Good performance cannot be guaranteed in the presence of such recursion, so - * it should be replaced by using more than one copy of the data flow library. - */ -abstract deprecated private class ConfigurationRecursionPrevention extends Configuration { - bindingset[this] - ConfigurationRecursionPrevention() { any() } - - override predicate hasFlow(Node source, Node sink) { - strictcount(Node n | this.isSource(n)) < 0 - or - strictcount(Node n | this.isSource(n, _)) < 0 - or - strictcount(Node n | this.isSink(n)) < 0 - or - strictcount(Node n | this.isSink(n, _)) < 0 - or - strictcount(Node n1, Node n2 | this.isAdditionalFlowStep(n1, n2)) < 0 - or - strictcount(Node n1, Node n2 | this.isAdditionalFlowStep(n1, _, n2, _)) < 0 - or - super.hasFlow(source, sink) - } -} - -deprecated private FlowState relevantState(Configuration config) { - config.isSource(_, result) or - config.isSink(_, result) or - config.isBarrier(_, result) or - config.isAdditionalFlowStep(_, result, _, _) or - config.isAdditionalFlowStep(_, _, _, result) -} - -private newtype TConfigState = - deprecated TMkConfigState(Configuration config, FlowState state) { - state = relevantState(config) or state instanceof FlowStateEmpty - } - -deprecated private Configuration getConfig(TConfigState state) { state = TMkConfigState(result, _) } - -deprecated private FlowState getState(TConfigState state) { state = TMkConfigState(_, result) } - -deprecated private predicate singleConfiguration() { 1 = strictcount(Configuration c) } - -deprecated private module Config implements FullStateConfigSig { - class FlowState = TConfigState; - - predicate isSource(Node source, FlowState state) { - getConfig(state).isSource(source, getState(state)) - or - getConfig(state).isSource(source) and getState(state) instanceof FlowStateEmpty - } - - predicate isSink(Node sink) { none() } - - predicate isSink(Node sink, FlowState state) { - getConfig(state).isSink(sink, getState(state)) - or - getConfig(state).isSink(sink) and getState(state) instanceof FlowStateEmpty - } - - predicate isBarrier(Node node) { none() } - - predicate isBarrier(Node node, FlowState state) { - getConfig(state).isBarrier(node, getState(state)) or - getConfig(state).isBarrier(node) - } - - predicate isBarrierIn(Node node) { any(Configuration config).isBarrierIn(node) } - - predicate isBarrierOut(Node node) { any(Configuration config).isBarrierOut(node) } - - predicate isBarrierIn(Node node, FlowState state) { none() } - - predicate isBarrierOut(Node node, FlowState state) { none() } - - predicate isAdditionalFlowStep(Node node1, Node node2, string model) { - singleConfiguration() and - any(Configuration config).isAdditionalFlowStep(node1, node2) and - model = "" - } - - predicate isAdditionalFlowStep( - Node node1, FlowState state1, Node node2, FlowState state2, string model - ) { - getConfig(state1).isAdditionalFlowStep(node1, getState(state1), node2, getState(state2)) and - getConfig(state2) = getConfig(state1) and - model = "" - or - not singleConfiguration() and - getConfig(state1).isAdditionalFlowStep(node1, node2) and - state2 = state1 and - model = "" - } - - predicate allowImplicitRead(Node node, ContentSet c) { - any(Configuration config).allowImplicitRead(node, c) - } - - predicate neverSkip(Node node) { none() } - - int fieldFlowBranchLimit() { result = min(any(Configuration config).fieldFlowBranchLimit()) } - - int accessPathLimit() { result = 5 } - - FlowFeature getAFeature() { result = any(Configuration config).getAFeature() } - - predicate includeHiddenNodes() { any(Configuration config).includeHiddenNodes() } - - predicate observeDiffInformedIncrementalMode() { none() } -} - -deprecated private import Impl as I - -/** - * A `Node` augmented with a call context (except for sinks), an access path, and a configuration. - * Only those `PathNode`s that are reachable from a source, and which can reach a sink, are generated. - */ -deprecated class PathNode instanceof I::PathNode { - /** Gets a textual representation of this element. */ - final string toString() { result = super.toString() } - - /** - * Gets a textual representation of this element, including a textual - * representation of the call context. - */ - final string toStringWithContext() { result = super.toStringWithContext() } - - /** - * Holds if this element is at the specified location. - * The location spans column `startcolumn` of line `startline` to - * column `endcolumn` of line `endline` in file `filepath`. - * For more information, see - * [Locations](https://codeql.github.com/docs/writing-codeql-queries/providing-locations-in-codeql-queries/). - */ - final predicate hasLocationInfo( - string filepath, int startline, int startcolumn, int endline, int endcolumn - ) { - super.hasLocationInfo(filepath, startline, startcolumn, endline, endcolumn) - } - - /** Gets the underlying `Node`. */ - final Node getNode() { result = super.getNode() } - - /** Gets the `FlowState` of this node. */ - deprecated final FlowState getState() { result = getState(super.getState()) } - - /** Gets the associated configuration. */ - deprecated final Configuration getConfiguration() { result = getConfig(super.getState()) } - - /** Gets a successor of this node, if any. */ - final PathNode getASuccessor() { result = super.getASuccessor() } - - /** Holds if this node is a source. */ - final predicate isSource() { super.isSource() } - - /** Holds if this node is a grouping of source nodes. */ - final predicate isSourceGroup(string group) { super.isSourceGroup(group) } - - /** Holds if this node is a grouping of sink nodes. */ - final predicate isSinkGroup(string group) { super.isSinkGroup(group) } -} - -deprecated module PathGraph = I::PathGraph; - -deprecated private predicate hasFlow(Node source, Node sink, Configuration config) { - exists(PathNode source0, PathNode sink0 | - hasFlowPath(source0, sink0, config) and - source0.getNode() = source and - sink0.getNode() = sink - ) -} - -deprecated private predicate hasFlowPath(PathNode source, PathNode sink, Configuration config) { - I::flowPath(source, sink) and source.getConfiguration() = config -} - -deprecated private predicate hasFlowTo(Node sink, Configuration config) { hasFlow(_, sink, config) } - -deprecated predicate flowsTo = hasFlow/3; diff --git a/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/tainttracking1/TaintTrackingImpl.qll b/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/tainttracking1/TaintTrackingImpl.qll deleted file mode 100644 index 75e7856fd26..00000000000 --- a/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/tainttracking1/TaintTrackingImpl.qll +++ /dev/null @@ -1,168 +0,0 @@ -/** - * DEPRECATED: Use `Global` and `GlobalWithState` instead. - * - * Provides an implementation of global (interprocedural) taint tracking. - * This file re-exports the local (intraprocedural) taint-tracking analysis - * from `TaintTrackingParameter::Public` and adds a global analysis, mainly - * exposed through the `Configuration` class. For some languages, this file - * exists in several identical copies, allowing queries to use multiple - * `Configuration` classes that depend on each other without introducing - * mutual recursion among those configurations. - */ - -import TaintTrackingParameter::Public -private import TaintTrackingParameter::Private - -/** - * DEPRECATED: Use `Global` and `GlobalWithState` instead. - * - * A configuration of interprocedural taint tracking analysis. This defines - * sources, sinks, and any other configurable aspect of the analysis. Each - * use of the taint tracking library must define its own unique extension of - * this abstract class. - * - * A taint-tracking configuration is a special data flow configuration - * (`DataFlow::Configuration`) that allows for flow through nodes that do not - * necessarily preserve values but are still relevant from a taint tracking - * perspective. (For example, string concatenation, where one of the operands - * is tainted.) - * - * To create a configuration, extend this class with a subclass whose - * characteristic predicate is a unique singleton string. For example, write - * - * ```ql - * class MyAnalysisConfiguration extends TaintTracking::Configuration { - * MyAnalysisConfiguration() { this = "MyAnalysisConfiguration" } - * // Override `isSource` and `isSink`. - * // Optionally override `isSanitizer`. - * // Optionally override `isSanitizerIn`. - * // Optionally override `isSanitizerOut`. - * // Optionally override `isSanitizerGuard`. - * // Optionally override `isAdditionalTaintStep`. - * } - * ``` - * - * Then, to query whether there is flow between some `source` and `sink`, - * write - * - * ```ql - * exists(MyAnalysisConfiguration cfg | cfg.hasFlow(source, sink)) - * ``` - * - * Multiple configurations can coexist, but it is unsupported to depend on - * another `TaintTracking::Configuration` or a `DataFlow::Configuration` in the - * overridden predicates that define sources, sinks, or additional steps. - * Instead, the dependency should go to a `TaintTracking2::Configuration` or a - * `DataFlow2::Configuration`, `DataFlow3::Configuration`, etc. - */ -abstract deprecated class Configuration extends DataFlow::Configuration { - bindingset[this] - Configuration() { any() } - - /** - * Holds if `source` is a relevant taint source. - * - * The smaller this predicate is, the faster `hasFlow()` will converge. - */ - // overridden to provide taint-tracking specific qldoc - override predicate isSource(DataFlow::Node source) { none() } - - /** - * Holds if `source` is a relevant taint source with the given initial - * `state`. - * - * The smaller this predicate is, the faster `hasFlow()` will converge. - */ - // overridden to provide taint-tracking specific qldoc - override predicate isSource(DataFlow::Node source, DataFlow::FlowState state) { none() } - - /** - * Holds if `sink` is a relevant taint sink - * - * The smaller this predicate is, the faster `hasFlow()` will converge. - */ - // overridden to provide taint-tracking specific qldoc - override predicate isSink(DataFlow::Node sink) { none() } - - /** - * Holds if `sink` is a relevant taint sink accepting `state`. - * - * The smaller this predicate is, the faster `hasFlow()` will converge. - */ - // overridden to provide taint-tracking specific qldoc - override predicate isSink(DataFlow::Node sink, DataFlow::FlowState state) { none() } - - /** Holds if the node `node` is a taint sanitizer. */ - predicate isSanitizer(DataFlow::Node node) { none() } - - final override predicate isBarrier(DataFlow::Node node) { - this.isSanitizer(node) or - defaultTaintSanitizer(node) - } - - /** - * Holds if the node `node` is a taint sanitizer when the flow state is - * `state`. - */ - predicate isSanitizer(DataFlow::Node node, DataFlow::FlowState state) { none() } - - final override predicate isBarrier(DataFlow::Node node, DataFlow::FlowState state) { - this.isSanitizer(node, state) - } - - /** Holds if taint propagation into `node` is prohibited. */ - predicate isSanitizerIn(DataFlow::Node node) { none() } - - final override predicate isBarrierIn(DataFlow::Node node) { this.isSanitizerIn(node) } - - /** Holds if taint propagation out of `node` is prohibited. */ - predicate isSanitizerOut(DataFlow::Node node) { none() } - - final override predicate isBarrierOut(DataFlow::Node node) { this.isSanitizerOut(node) } - - /** - * Holds if taint may propagate from `node1` to `node2` in addition to the normal data-flow and taint steps. - */ - predicate isAdditionalTaintStep(DataFlow::Node node1, DataFlow::Node node2) { none() } - - final override predicate isAdditionalFlowStep(DataFlow::Node node1, DataFlow::Node node2) { - this.isAdditionalTaintStep(node1, node2) or - defaultAdditionalTaintStep(node1, node2, _) - } - - /** - * Holds if taint may propagate from `node1` to `node2` in addition to the normal data-flow and taint steps. - * This step is only applicable in `state1` and updates the flow state to `state2`. - */ - predicate isAdditionalTaintStep( - DataFlow::Node node1, DataFlow::FlowState state1, DataFlow::Node node2, - DataFlow::FlowState state2 - ) { - none() - } - - final override predicate isAdditionalFlowStep( - DataFlow::Node node1, DataFlow::FlowState state1, DataFlow::Node node2, - DataFlow::FlowState state2 - ) { - this.isAdditionalTaintStep(node1, state1, node2, state2) - } - - override predicate allowImplicitRead(DataFlow::Node node, DataFlow::ContentSet c) { - ( - this.isSink(node) or - this.isSink(node, _) or - this.isAdditionalTaintStep(node, _) or - this.isAdditionalTaintStep(node, _, _, _) - ) and - defaultImplicitTaintRead(node, c) - } - - /** - * Holds if taint may flow from `source` to `sink` for this configuration. - */ - // overridden to provide taint-tracking specific qldoc - override predicate hasFlow(DataFlow::Node source, DataFlow::Node sink) { - super.hasFlow(source, sink) - } -} diff --git a/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/tainttracking1/TaintTrackingParameter.qll b/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/tainttracking1/TaintTrackingParameter.qll deleted file mode 100644 index 19e10871a78..00000000000 --- a/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/tainttracking1/TaintTrackingParameter.qll +++ /dev/null @@ -1,6 +0,0 @@ -import semmle.code.cpp.ir.dataflow.internal.TaintTrackingUtil as Public - -module Private { - import semmle.code.cpp.ir.dataflow.DataFlow::DataFlow as DataFlow - import semmle.code.cpp.ir.dataflow.internal.DataFlowImpl as DataFlowInternal -} diff --git a/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/tainttracking2/TaintTrackingImpl.qll b/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/tainttracking2/TaintTrackingImpl.qll deleted file mode 100644 index 75e7856fd26..00000000000 --- a/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/tainttracking2/TaintTrackingImpl.qll +++ /dev/null @@ -1,168 +0,0 @@ -/** - * DEPRECATED: Use `Global` and `GlobalWithState` instead. - * - * Provides an implementation of global (interprocedural) taint tracking. - * This file re-exports the local (intraprocedural) taint-tracking analysis - * from `TaintTrackingParameter::Public` and adds a global analysis, mainly - * exposed through the `Configuration` class. For some languages, this file - * exists in several identical copies, allowing queries to use multiple - * `Configuration` classes that depend on each other without introducing - * mutual recursion among those configurations. - */ - -import TaintTrackingParameter::Public -private import TaintTrackingParameter::Private - -/** - * DEPRECATED: Use `Global` and `GlobalWithState` instead. - * - * A configuration of interprocedural taint tracking analysis. This defines - * sources, sinks, and any other configurable aspect of the analysis. Each - * use of the taint tracking library must define its own unique extension of - * this abstract class. - * - * A taint-tracking configuration is a special data flow configuration - * (`DataFlow::Configuration`) that allows for flow through nodes that do not - * necessarily preserve values but are still relevant from a taint tracking - * perspective. (For example, string concatenation, where one of the operands - * is tainted.) - * - * To create a configuration, extend this class with a subclass whose - * characteristic predicate is a unique singleton string. For example, write - * - * ```ql - * class MyAnalysisConfiguration extends TaintTracking::Configuration { - * MyAnalysisConfiguration() { this = "MyAnalysisConfiguration" } - * // Override `isSource` and `isSink`. - * // Optionally override `isSanitizer`. - * // Optionally override `isSanitizerIn`. - * // Optionally override `isSanitizerOut`. - * // Optionally override `isSanitizerGuard`. - * // Optionally override `isAdditionalTaintStep`. - * } - * ``` - * - * Then, to query whether there is flow between some `source` and `sink`, - * write - * - * ```ql - * exists(MyAnalysisConfiguration cfg | cfg.hasFlow(source, sink)) - * ``` - * - * Multiple configurations can coexist, but it is unsupported to depend on - * another `TaintTracking::Configuration` or a `DataFlow::Configuration` in the - * overridden predicates that define sources, sinks, or additional steps. - * Instead, the dependency should go to a `TaintTracking2::Configuration` or a - * `DataFlow2::Configuration`, `DataFlow3::Configuration`, etc. - */ -abstract deprecated class Configuration extends DataFlow::Configuration { - bindingset[this] - Configuration() { any() } - - /** - * Holds if `source` is a relevant taint source. - * - * The smaller this predicate is, the faster `hasFlow()` will converge. - */ - // overridden to provide taint-tracking specific qldoc - override predicate isSource(DataFlow::Node source) { none() } - - /** - * Holds if `source` is a relevant taint source with the given initial - * `state`. - * - * The smaller this predicate is, the faster `hasFlow()` will converge. - */ - // overridden to provide taint-tracking specific qldoc - override predicate isSource(DataFlow::Node source, DataFlow::FlowState state) { none() } - - /** - * Holds if `sink` is a relevant taint sink - * - * The smaller this predicate is, the faster `hasFlow()` will converge. - */ - // overridden to provide taint-tracking specific qldoc - override predicate isSink(DataFlow::Node sink) { none() } - - /** - * Holds if `sink` is a relevant taint sink accepting `state`. - * - * The smaller this predicate is, the faster `hasFlow()` will converge. - */ - // overridden to provide taint-tracking specific qldoc - override predicate isSink(DataFlow::Node sink, DataFlow::FlowState state) { none() } - - /** Holds if the node `node` is a taint sanitizer. */ - predicate isSanitizer(DataFlow::Node node) { none() } - - final override predicate isBarrier(DataFlow::Node node) { - this.isSanitizer(node) or - defaultTaintSanitizer(node) - } - - /** - * Holds if the node `node` is a taint sanitizer when the flow state is - * `state`. - */ - predicate isSanitizer(DataFlow::Node node, DataFlow::FlowState state) { none() } - - final override predicate isBarrier(DataFlow::Node node, DataFlow::FlowState state) { - this.isSanitizer(node, state) - } - - /** Holds if taint propagation into `node` is prohibited. */ - predicate isSanitizerIn(DataFlow::Node node) { none() } - - final override predicate isBarrierIn(DataFlow::Node node) { this.isSanitizerIn(node) } - - /** Holds if taint propagation out of `node` is prohibited. */ - predicate isSanitizerOut(DataFlow::Node node) { none() } - - final override predicate isBarrierOut(DataFlow::Node node) { this.isSanitizerOut(node) } - - /** - * Holds if taint may propagate from `node1` to `node2` in addition to the normal data-flow and taint steps. - */ - predicate isAdditionalTaintStep(DataFlow::Node node1, DataFlow::Node node2) { none() } - - final override predicate isAdditionalFlowStep(DataFlow::Node node1, DataFlow::Node node2) { - this.isAdditionalTaintStep(node1, node2) or - defaultAdditionalTaintStep(node1, node2, _) - } - - /** - * Holds if taint may propagate from `node1` to `node2` in addition to the normal data-flow and taint steps. - * This step is only applicable in `state1` and updates the flow state to `state2`. - */ - predicate isAdditionalTaintStep( - DataFlow::Node node1, DataFlow::FlowState state1, DataFlow::Node node2, - DataFlow::FlowState state2 - ) { - none() - } - - final override predicate isAdditionalFlowStep( - DataFlow::Node node1, DataFlow::FlowState state1, DataFlow::Node node2, - DataFlow::FlowState state2 - ) { - this.isAdditionalTaintStep(node1, state1, node2, state2) - } - - override predicate allowImplicitRead(DataFlow::Node node, DataFlow::ContentSet c) { - ( - this.isSink(node) or - this.isSink(node, _) or - this.isAdditionalTaintStep(node, _) or - this.isAdditionalTaintStep(node, _, _, _) - ) and - defaultImplicitTaintRead(node, c) - } - - /** - * Holds if taint may flow from `source` to `sink` for this configuration. - */ - // overridden to provide taint-tracking specific qldoc - override predicate hasFlow(DataFlow::Node source, DataFlow::Node sink) { - super.hasFlow(source, sink) - } -} diff --git a/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/tainttracking2/TaintTrackingParameter.qll b/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/tainttracking2/TaintTrackingParameter.qll deleted file mode 100644 index ac0b79d067e..00000000000 --- a/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/tainttracking2/TaintTrackingParameter.qll +++ /dev/null @@ -1,5 +0,0 @@ -import semmle.code.cpp.ir.dataflow.internal.TaintTrackingUtil as Public - -module Private { - import semmle.code.cpp.ir.dataflow.DataFlow2::DataFlow2 as DataFlow -} diff --git a/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/tainttracking3/TaintTrackingImpl.qll b/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/tainttracking3/TaintTrackingImpl.qll deleted file mode 100644 index 75e7856fd26..00000000000 --- a/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/tainttracking3/TaintTrackingImpl.qll +++ /dev/null @@ -1,168 +0,0 @@ -/** - * DEPRECATED: Use `Global` and `GlobalWithState` instead. - * - * Provides an implementation of global (interprocedural) taint tracking. - * This file re-exports the local (intraprocedural) taint-tracking analysis - * from `TaintTrackingParameter::Public` and adds a global analysis, mainly - * exposed through the `Configuration` class. For some languages, this file - * exists in several identical copies, allowing queries to use multiple - * `Configuration` classes that depend on each other without introducing - * mutual recursion among those configurations. - */ - -import TaintTrackingParameter::Public -private import TaintTrackingParameter::Private - -/** - * DEPRECATED: Use `Global` and `GlobalWithState` instead. - * - * A configuration of interprocedural taint tracking analysis. This defines - * sources, sinks, and any other configurable aspect of the analysis. Each - * use of the taint tracking library must define its own unique extension of - * this abstract class. - * - * A taint-tracking configuration is a special data flow configuration - * (`DataFlow::Configuration`) that allows for flow through nodes that do not - * necessarily preserve values but are still relevant from a taint tracking - * perspective. (For example, string concatenation, where one of the operands - * is tainted.) - * - * To create a configuration, extend this class with a subclass whose - * characteristic predicate is a unique singleton string. For example, write - * - * ```ql - * class MyAnalysisConfiguration extends TaintTracking::Configuration { - * MyAnalysisConfiguration() { this = "MyAnalysisConfiguration" } - * // Override `isSource` and `isSink`. - * // Optionally override `isSanitizer`. - * // Optionally override `isSanitizerIn`. - * // Optionally override `isSanitizerOut`. - * // Optionally override `isSanitizerGuard`. - * // Optionally override `isAdditionalTaintStep`. - * } - * ``` - * - * Then, to query whether there is flow between some `source` and `sink`, - * write - * - * ```ql - * exists(MyAnalysisConfiguration cfg | cfg.hasFlow(source, sink)) - * ``` - * - * Multiple configurations can coexist, but it is unsupported to depend on - * another `TaintTracking::Configuration` or a `DataFlow::Configuration` in the - * overridden predicates that define sources, sinks, or additional steps. - * Instead, the dependency should go to a `TaintTracking2::Configuration` or a - * `DataFlow2::Configuration`, `DataFlow3::Configuration`, etc. - */ -abstract deprecated class Configuration extends DataFlow::Configuration { - bindingset[this] - Configuration() { any() } - - /** - * Holds if `source` is a relevant taint source. - * - * The smaller this predicate is, the faster `hasFlow()` will converge. - */ - // overridden to provide taint-tracking specific qldoc - override predicate isSource(DataFlow::Node source) { none() } - - /** - * Holds if `source` is a relevant taint source with the given initial - * `state`. - * - * The smaller this predicate is, the faster `hasFlow()` will converge. - */ - // overridden to provide taint-tracking specific qldoc - override predicate isSource(DataFlow::Node source, DataFlow::FlowState state) { none() } - - /** - * Holds if `sink` is a relevant taint sink - * - * The smaller this predicate is, the faster `hasFlow()` will converge. - */ - // overridden to provide taint-tracking specific qldoc - override predicate isSink(DataFlow::Node sink) { none() } - - /** - * Holds if `sink` is a relevant taint sink accepting `state`. - * - * The smaller this predicate is, the faster `hasFlow()` will converge. - */ - // overridden to provide taint-tracking specific qldoc - override predicate isSink(DataFlow::Node sink, DataFlow::FlowState state) { none() } - - /** Holds if the node `node` is a taint sanitizer. */ - predicate isSanitizer(DataFlow::Node node) { none() } - - final override predicate isBarrier(DataFlow::Node node) { - this.isSanitizer(node) or - defaultTaintSanitizer(node) - } - - /** - * Holds if the node `node` is a taint sanitizer when the flow state is - * `state`. - */ - predicate isSanitizer(DataFlow::Node node, DataFlow::FlowState state) { none() } - - final override predicate isBarrier(DataFlow::Node node, DataFlow::FlowState state) { - this.isSanitizer(node, state) - } - - /** Holds if taint propagation into `node` is prohibited. */ - predicate isSanitizerIn(DataFlow::Node node) { none() } - - final override predicate isBarrierIn(DataFlow::Node node) { this.isSanitizerIn(node) } - - /** Holds if taint propagation out of `node` is prohibited. */ - predicate isSanitizerOut(DataFlow::Node node) { none() } - - final override predicate isBarrierOut(DataFlow::Node node) { this.isSanitizerOut(node) } - - /** - * Holds if taint may propagate from `node1` to `node2` in addition to the normal data-flow and taint steps. - */ - predicate isAdditionalTaintStep(DataFlow::Node node1, DataFlow::Node node2) { none() } - - final override predicate isAdditionalFlowStep(DataFlow::Node node1, DataFlow::Node node2) { - this.isAdditionalTaintStep(node1, node2) or - defaultAdditionalTaintStep(node1, node2, _) - } - - /** - * Holds if taint may propagate from `node1` to `node2` in addition to the normal data-flow and taint steps. - * This step is only applicable in `state1` and updates the flow state to `state2`. - */ - predicate isAdditionalTaintStep( - DataFlow::Node node1, DataFlow::FlowState state1, DataFlow::Node node2, - DataFlow::FlowState state2 - ) { - none() - } - - final override predicate isAdditionalFlowStep( - DataFlow::Node node1, DataFlow::FlowState state1, DataFlow::Node node2, - DataFlow::FlowState state2 - ) { - this.isAdditionalTaintStep(node1, state1, node2, state2) - } - - override predicate allowImplicitRead(DataFlow::Node node, DataFlow::ContentSet c) { - ( - this.isSink(node) or - this.isSink(node, _) or - this.isAdditionalTaintStep(node, _) or - this.isAdditionalTaintStep(node, _, _, _) - ) and - defaultImplicitTaintRead(node, c) - } - - /** - * Holds if taint may flow from `source` to `sink` for this configuration. - */ - // overridden to provide taint-tracking specific qldoc - override predicate hasFlow(DataFlow::Node source, DataFlow::Node sink) { - super.hasFlow(source, sink) - } -} diff --git a/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/tainttracking3/TaintTrackingParameter.qll b/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/tainttracking3/TaintTrackingParameter.qll deleted file mode 100644 index 2a3b69f55cd..00000000000 --- a/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/tainttracking3/TaintTrackingParameter.qll +++ /dev/null @@ -1,5 +0,0 @@ -import semmle.code.cpp.ir.dataflow.internal.TaintTrackingUtil as Public - -module Private { - import semmle.code.cpp.ir.dataflow.DataFlow3::DataFlow3 as DataFlow -} diff --git a/cpp/ql/lib/semmle/code/cpp/ir/implementation/EdgeKind.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/EdgeKind.qll index 81db183fa63..0fd31c9f45e 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/implementation/EdgeKind.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/implementation/EdgeKind.qll @@ -20,16 +20,18 @@ private newtype TEdgeKind = * `Instruction` or `IRBlock` has at most one successor of any single * `EdgeKind`. */ -abstract class EdgeKind extends TEdgeKind { +abstract private class EdgeKindImpl extends TEdgeKind { /** Gets a textual representation of this edge kind. */ abstract string toString(); } +final class EdgeKind = EdgeKindImpl; + /** * A "goto" edge, representing the unconditional successor of an `Instruction` * or `IRBlock`. */ -class GotoEdge extends EdgeKind, TGotoEdge { +class GotoEdge extends EdgeKindImpl, TGotoEdge { final override string toString() { result = "Goto" } } @@ -37,7 +39,7 @@ class GotoEdge extends EdgeKind, TGotoEdge { * A "true" edge, representing the successor of a conditional branch when the * condition is non-zero. */ -class TrueEdge extends EdgeKind, TTrueEdge { +class TrueEdge extends EdgeKindImpl, TTrueEdge { final override string toString() { result = "True" } } @@ -45,7 +47,7 @@ class TrueEdge extends EdgeKind, TTrueEdge { * A "false" edge, representing the successor of a conditional branch when the * condition is zero. */ -class FalseEdge extends EdgeKind, TFalseEdge { +class FalseEdge extends EdgeKindImpl, TFalseEdge { final override string toString() { result = "False" } } @@ -53,7 +55,7 @@ class FalseEdge extends EdgeKind, TFalseEdge { * An "exception" edge, representing the successor of an instruction when that * instruction's evaluation throws an exception. */ -class ExceptionEdge extends EdgeKind, TExceptionEdge { +class ExceptionEdge extends EdgeKindImpl, TExceptionEdge { final override string toString() { result = "Exception" } } @@ -61,7 +63,7 @@ class ExceptionEdge extends EdgeKind, TExceptionEdge { * A "default" edge, representing the successor of a `Switch` instruction when * none of the case values matches the condition value. */ -class DefaultEdge extends EdgeKind, TDefaultEdge { +class DefaultEdge extends EdgeKindImpl, TDefaultEdge { final override string toString() { result = "Default" } } @@ -69,7 +71,7 @@ class DefaultEdge extends EdgeKind, TDefaultEdge { * A "case" edge, representing the successor of a `Switch` instruction when the * the condition value matches a corresponding `case` label. */ -class CaseEdge extends EdgeKind, TCaseEdge { +class CaseEdge extends EdgeKindImpl, TCaseEdge { string minValue; string maxValue; diff --git a/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedCall.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedCall.qll index daa6bdaafcf..2ddc55f91f5 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedCall.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedCall.qll @@ -364,10 +364,14 @@ class TranslatedFunctionCall extends TranslatedCallExpr, TranslatedDirectCall { final override predicate mayThrowException() { expr.getTarget().(ThrowingFunction).mayThrowException(_) + or + expr.getTarget() instanceof AlwaysSehThrowingFunction } final override predicate mustThrowException() { expr.getTarget().(ThrowingFunction).mayThrowException(true) + or + expr.getTarget() instanceof AlwaysSehThrowingFunction } } diff --git a/cpp/ql/lib/semmle/code/cpp/models/implementations/Memcpy.qll b/cpp/ql/lib/semmle/code/cpp/models/implementations/Memcpy.qll index 0bf2dd31fe4..311847e8aec 100644 --- a/cpp/ql/lib/semmle/code/cpp/models/implementations/Memcpy.qll +++ b/cpp/ql/lib/semmle/code/cpp/models/implementations/Memcpy.qll @@ -16,7 +16,7 @@ import semmle.code.cpp.models.interfaces.NonThrowing * `__builtin___memcpy_chk`. */ private class MemcpyFunction extends ArrayFunction, DataFlowFunction, SideEffectFunction, - AliasFunction, NonThrowingFunction + AliasFunction, NonCppThrowingFunction { MemcpyFunction() { // memcpy(dest, src, num) diff --git a/cpp/ql/lib/semmle/code/cpp/models/implementations/Memset.qll b/cpp/ql/lib/semmle/code/cpp/models/implementations/Memset.qll index ab2e0af99f3..51234e50f94 100644 --- a/cpp/ql/lib/semmle/code/cpp/models/implementations/Memset.qll +++ b/cpp/ql/lib/semmle/code/cpp/models/implementations/Memset.qll @@ -11,7 +11,7 @@ import semmle.code.cpp.models.interfaces.SideEffect import semmle.code.cpp.models.interfaces.NonThrowing private class MemsetFunctionModel extends ArrayFunction, DataFlowFunction, AliasFunction, - SideEffectFunction, NonThrowingFunction + SideEffectFunction, NonCppThrowingFunction { MemsetFunctionModel() { this.hasGlobalOrStdOrBslName("memset") diff --git a/cpp/ql/lib/semmle/code/cpp/models/implementations/NoexceptFunction.qll b/cpp/ql/lib/semmle/code/cpp/models/implementations/NoexceptFunction.qll index b0f76ee6538..22f860bc593 100644 --- a/cpp/ql/lib/semmle/code/cpp/models/implementations/NoexceptFunction.qll +++ b/cpp/ql/lib/semmle/code/cpp/models/implementations/NoexceptFunction.qll @@ -6,6 +6,6 @@ import semmle.code.cpp.models.interfaces.NonThrowing * * Note: The `throw` specifier was deprecated in C++11 and removed in C++17. */ -class NoexceptFunction extends NonThrowingFunction { +class NoexceptFunction extends NonCppThrowingFunction { NoexceptFunction() { this.isNoExcept() or this.isNoThrow() } } diff --git a/cpp/ql/lib/semmle/code/cpp/models/implementations/Printf.qll b/cpp/ql/lib/semmle/code/cpp/models/implementations/Printf.qll index 9c3bfb4f35e..d4b054ea0b5 100644 --- a/cpp/ql/lib/semmle/code/cpp/models/implementations/Printf.qll +++ b/cpp/ql/lib/semmle/code/cpp/models/implementations/Printf.qll @@ -13,7 +13,7 @@ import semmle.code.cpp.models.interfaces.NonThrowing /** * The standard functions `printf`, `wprintf` and their glib variants. */ -private class Printf extends FormattingFunction, AliasFunction, NonThrowingFunction { +private class Printf extends FormattingFunction, AliasFunction, NonCppThrowingFunction { Printf() { this instanceof TopLevelFunction and ( @@ -37,7 +37,7 @@ private class Printf extends FormattingFunction, AliasFunction, NonThrowingFunct /** * The standard functions `fprintf`, `fwprintf` and their glib variants. */ -private class Fprintf extends FormattingFunction, NonThrowingFunction { +private class Fprintf extends FormattingFunction, NonCppThrowingFunction { Fprintf() { this instanceof TopLevelFunction and ( @@ -55,7 +55,7 @@ private class Fprintf extends FormattingFunction, NonThrowingFunction { /** * The standard function `sprintf` and its Microsoft and glib variants. */ -private class Sprintf extends FormattingFunction, NonThrowingFunction { +private class Sprintf extends FormattingFunction, NonCppThrowingFunction { Sprintf() { this instanceof TopLevelFunction and ( @@ -98,7 +98,9 @@ private class Sprintf extends FormattingFunction, NonThrowingFunction { /** * Implements `Snprintf`. */ -private class SnprintfImpl extends Snprintf, AliasFunction, SideEffectFunction, NonThrowingFunction { +private class SnprintfImpl extends Snprintf, AliasFunction, SideEffectFunction, + NonCppThrowingFunction +{ SnprintfImpl() { this instanceof TopLevelFunction and ( @@ -205,7 +207,7 @@ private class StringCchPrintf extends FormattingFunction { /** * The standard function `syslog`. */ -private class Syslog extends FormattingFunction, NonThrowingFunction { +private class Syslog extends FormattingFunction, NonCppThrowingFunction { Syslog() { this instanceof TopLevelFunction and this.hasGlobalName("syslog") and diff --git a/cpp/ql/lib/semmle/code/cpp/models/implementations/Strcat.qll b/cpp/ql/lib/semmle/code/cpp/models/implementations/Strcat.qll index 9b11ed0af15..966c7425dc4 100644 --- a/cpp/ql/lib/semmle/code/cpp/models/implementations/Strcat.qll +++ b/cpp/ql/lib/semmle/code/cpp/models/implementations/Strcat.qll @@ -15,7 +15,7 @@ import semmle.code.cpp.models.interfaces.NonThrowing * Does not include `strlcat`, which is covered by `StrlcatFunction` */ class StrcatFunction extends TaintFunction, DataFlowFunction, ArrayFunction, SideEffectFunction, - NonThrowingFunction + NonCppThrowingFunction { StrcatFunction() { this.hasGlobalOrStdOrBslName([ diff --git a/cpp/ql/lib/semmle/code/cpp/models/implementations/Strcpy.qll b/cpp/ql/lib/semmle/code/cpp/models/implementations/Strcpy.qll index b7f06f0cebf..b7ed20f1bab 100644 --- a/cpp/ql/lib/semmle/code/cpp/models/implementations/Strcpy.qll +++ b/cpp/ql/lib/semmle/code/cpp/models/implementations/Strcpy.qll @@ -13,7 +13,7 @@ import semmle.code.cpp.models.interfaces.NonThrowing * The standard function `strcpy` and its wide, sized, and Microsoft variants. */ class StrcpyFunction extends ArrayFunction, DataFlowFunction, TaintFunction, SideEffectFunction, - NonThrowingFunction + NonCppThrowingFunction { StrcpyFunction() { this.hasGlobalOrStdOrBslName([ diff --git a/cpp/ql/lib/semmle/code/cpp/models/implementations/StructuredExceptionHandling.qll b/cpp/ql/lib/semmle/code/cpp/models/implementations/StructuredExceptionHandling.qll index af8f3088f25..e561bfadee6 100644 --- a/cpp/ql/lib/semmle/code/cpp/models/implementations/StructuredExceptionHandling.qll +++ b/cpp/ql/lib/semmle/code/cpp/models/implementations/StructuredExceptionHandling.qll @@ -1,9 +1,7 @@ import semmle.code.cpp.models.interfaces.Throwing -class WindowsDriverFunction extends ThrowingFunction { - WindowsDriverFunction() { +class WindowsDriverExceptionAnnotation extends AlwaysSehThrowingFunction { + WindowsDriverExceptionAnnotation() { this.hasGlobalName(["RaiseException", "ExRaiseAccessViolation", "ExRaiseDatatypeMisalignment"]) } - - final override predicate mayThrowException(boolean unconditional) { unconditional = true } } diff --git a/cpp/ql/lib/semmle/code/cpp/models/interfaces/NonThrowing.qll b/cpp/ql/lib/semmle/code/cpp/models/interfaces/NonThrowing.qll index 64901d39ad3..85b9b66cd66 100644 --- a/cpp/ql/lib/semmle/code/cpp/models/interfaces/NonThrowing.qll +++ b/cpp/ql/lib/semmle/code/cpp/models/interfaces/NonThrowing.qll @@ -6,6 +6,15 @@ import semmle.code.cpp.Function import semmle.code.cpp.models.Models /** - * A function that is guaranteed to never throw. + * A function that is guaranteed to never throw a C++ exception + * + * The function may still raise a structured exception handling (SEH) exception. */ -abstract class NonThrowingFunction extends Function { } +abstract class NonCppThrowingFunction extends Function { } + +/** + * A function that is guaranteed to never throw. + * + * DEPRECATED: use `NonCppThrowingFunction` instead. + */ +deprecated class NonThrowingFunction = NonCppThrowingFunction; diff --git a/cpp/ql/lib/semmle/code/cpp/models/interfaces/Throwing.qll b/cpp/ql/lib/semmle/code/cpp/models/interfaces/Throwing.qll index 79b7523f1d9..cc294806709 100644 --- a/cpp/ql/lib/semmle/code/cpp/models/interfaces/Throwing.qll +++ b/cpp/ql/lib/semmle/code/cpp/models/interfaces/Throwing.qll @@ -11,7 +11,7 @@ import semmle.code.cpp.models.Models import semmle.code.cpp.models.interfaces.FunctionInputsAndOutputs /** - * A class that models the exceptional behavior of a function. + * A function that is known to raise an exception. */ abstract class ThrowingFunction extends Function { /** @@ -20,3 +20,8 @@ abstract class ThrowingFunction extends Function { */ abstract predicate mayThrowException(boolean unconditional); } + +/** + * A function that unconditionally raises a structured exception handling (SEH) exception. + */ +abstract class AlwaysSehThrowingFunction extends Function { } diff --git a/cpp/ql/src/Best Practices/GuardedFree.ql b/cpp/ql/src/Best Practices/GuardedFree.ql index ea81a715828..3afe1a92e95 100644 --- a/cpp/ql/src/Best Practices/GuardedFree.ql +++ b/cpp/ql/src/Best Practices/GuardedFree.ql @@ -27,8 +27,12 @@ predicate blockContainsPreprocessorBranches(BasicBlock bb) { ) } -from GuardCondition gc, FreeCall fc, Variable v, BasicBlock bb -where +/** + * Holds if `gc` ensures that `v` is non-zero when reaching `bb`, and `bb` + * contains a single statement which is `fc`. + */ +pragma[nomagic] +private predicate interesting(GuardCondition gc, FreeCall fc, Variable v, BasicBlock bb) { gc.ensuresEq(v.getAnAccess(), 0, bb, false) and fc.getArgument(0) = v.getAnAccess() and bb = fc.getBasicBlock() and @@ -39,9 +43,21 @@ where // Block statement with a single nested statement: if (x) { free(x); } strictcount(bb.(BlockStmt).getAStmt()) = 1 ) and - strictcount(BasicBlock bb2 | gc.ensuresEq(_, 0, bb2, _) | bb2) = 1 and not fc.isInMacroExpansion() and not blockContainsPreprocessorBranches(bb) and not (gc instanceof BinaryOperation and not gc instanceof ComparisonOperation) and not exists(CommaExpr c | c.getAChild*() = fc) +} + +/** Holds if `gc` only guards a single block. */ +bindingset[gc] +pragma[inline_late] +private predicate guardConditionGuardsUniqueBlock(GuardCondition gc) { + strictcount(BasicBlock bb | gc.ensuresEq(_, 0, bb, _)) = 1 +} + +from GuardCondition gc, FreeCall fc, Variable v, BasicBlock bb +where + interesting(gc, fc, v, bb) and + guardConditionGuardsUniqueBlock(gc) select gc, "unnecessary NULL check before call to $@", fc, "free" diff --git a/cpp/ql/src/CHANGELOG.md b/cpp/ql/src/CHANGELOG.md index 4098bcf4d20..74781fe0f87 100644 --- a/cpp/ql/src/CHANGELOG.md +++ b/cpp/ql/src/CHANGELOG.md @@ -1,3 +1,17 @@ +## 1.3.0 + +### New Queries + +* Added a new high-precision quality query, `cpp/guarded-free`, which detects useless NULL pointer checks before calls to `free`. A variation of this query was originally contributed as an [experimental query by @mario-campos](https://github.com/github/codeql/pull/16331). + +### Minor Analysis Improvements + +* The "Call to function with fewer arguments than declared parameters" query (`cpp/too-few-arguments`) query no longer produces results if the function has been implicitly declared. + +## 1.2.7 + +No user-facing changes. + ## 1.2.6 ### Minor Analysis Improvements diff --git a/cpp/ql/src/Security/CWE/CWE-078/ExecTainted.ql b/cpp/ql/src/Security/CWE/CWE-078/ExecTainted.ql index 0686c4a707c..f6dd3b6f212 100644 --- a/cpp/ql/src/Security/CWE/CWE-078/ExecTainted.ql +++ b/cpp/ql/src/Security/CWE/CWE-078/ExecTainted.ql @@ -19,7 +19,6 @@ import semmle.code.cpp.security.Security import semmle.code.cpp.valuenumbering.GlobalValueNumbering import semmle.code.cpp.ir.IR import semmle.code.cpp.ir.dataflow.TaintTracking -import semmle.code.cpp.ir.dataflow.TaintTracking2 import semmle.code.cpp.security.FlowSources import semmle.code.cpp.models.implementations.Strcat import ExecTaint::PathGraph diff --git a/cpp/ql/src/Security/CWE/CWE-570/IncorrectAllocationErrorHandling.ql b/cpp/ql/src/Security/CWE/CWE-570/IncorrectAllocationErrorHandling.ql index 92daf31b057..d4d908f8474 100644 --- a/cpp/ql/src/Security/CWE/CWE-570/IncorrectAllocationErrorHandling.ql +++ b/cpp/ql/src/Security/CWE/CWE-570/IncorrectAllocationErrorHandling.ql @@ -45,7 +45,7 @@ predicate deleteMayThrow(DeleteOrDeleteArrayExpr deleteExpr) { * like it might throw an exception, and the function does not have a `noexcept` or `throw()` specifier. */ predicate functionMayThrow(Function f) { - not f instanceof NonThrowingFunction and + not f instanceof NonCppThrowingFunction and (not exists(f.getBlock()) or stmtMayThrow(f.getBlock())) } diff --git a/cpp/ql/src/change-notes/2024-11-22-too-few-arguments.md b/cpp/ql/src/change-notes/2024-11-22-too-few-arguments.md deleted file mode 100644 index 116df08838a..00000000000 --- a/cpp/ql/src/change-notes/2024-11-22-too-few-arguments.md +++ /dev/null @@ -1,4 +0,0 @@ ---- -category: minorAnalysis ---- -* The "Call to function with fewer arguments than declared parameters" query (`cpp/too-few-arguments`) query no longer produces results if the function has been implicitly declared. diff --git a/cpp/ql/src/change-notes/released/1.2.7.md b/cpp/ql/src/change-notes/released/1.2.7.md new file mode 100644 index 00000000000..99f957692ac --- /dev/null +++ b/cpp/ql/src/change-notes/released/1.2.7.md @@ -0,0 +1,3 @@ +## 1.2.7 + +No user-facing changes. diff --git a/cpp/ql/src/change-notes/2014-11-26-guarded-free.md b/cpp/ql/src/change-notes/released/1.3.0.md similarity index 52% rename from cpp/ql/src/change-notes/2014-11-26-guarded-free.md rename to cpp/ql/src/change-notes/released/1.3.0.md index 4280025a04f..1443206add8 100644 --- a/cpp/ql/src/change-notes/2014-11-26-guarded-free.md +++ b/cpp/ql/src/change-notes/released/1.3.0.md @@ -1,4 +1,9 @@ ---- -category: newQuery ---- +## 1.3.0 + +### New Queries + * Added a new high-precision quality query, `cpp/guarded-free`, which detects useless NULL pointer checks before calls to `free`. A variation of this query was originally contributed as an [experimental query by @mario-campos](https://github.com/github/codeql/pull/16331). + +### Minor Analysis Improvements + +* The "Call to function with fewer arguments than declared parameters" query (`cpp/too-few-arguments`) query no longer produces results if the function has been implicitly declared. diff --git a/cpp/ql/src/codeql-pack.release.yml b/cpp/ql/src/codeql-pack.release.yml index 24962f7ba24..ec16350ed6f 100644 --- a/cpp/ql/src/codeql-pack.release.yml +++ b/cpp/ql/src/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.2.6 +lastReleaseVersion: 1.3.0 diff --git a/cpp/ql/src/qlpack.yml b/cpp/ql/src/qlpack.yml index 7059965615a..940c3e2a4cb 100644 --- a/cpp/ql/src/qlpack.yml +++ b/cpp/ql/src/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/cpp-queries -version: 1.2.7-dev +version: 1.3.1-dev groups: - cpp - queries diff --git a/cpp/ql/test/experimental/library-tests/rangeanalysis/rangeanalysis/RangeAnalysis.expected b/cpp/ql/test/experimental/library-tests/rangeanalysis/rangeanalysis/RangeAnalysis.expected index 15125038d19..106313c8707 100644 --- a/cpp/ql/test/experimental/library-tests/rangeanalysis/rangeanalysis/RangeAnalysis.expected +++ b/cpp/ql/test/experimental/library-tests/rangeanalysis/rangeanalysis/RangeAnalysis.expected @@ -17,7 +17,6 @@ | test.cpp:49:12:49:12 | Load: x | test.cpp:46:22:46:22 | ValueNumberBound | -1 | true | CompareLT: ... < ... | test.cpp:48:9:48:13 | test.cpp:48:9:48:13 | | test.cpp:49:12:49:12 | Load: x | test.cpp:46:29:46:29 | ValueNumberBound | -2 | true | CompareLT: ... < ... | test.cpp:48:9:48:13 | test.cpp:48:9:48:13 | | test.cpp:54:12:54:12 | Load: x | test.cpp:46:22:46:22 | ValueNumberBound | -1 | true | CompareLT: ... < ... | test.cpp:52:7:52:11 | test.cpp:52:7:52:11 | -| test.cpp:54:12:54:12 | Load: x | test.cpp:46:29:46:29 | ValueNumberBound | -2 | true | CompareLT: ... < ... | test.cpp:52:7:52:11 | test.cpp:52:7:52:11 | | test.cpp:62:10:62:13 | Load: iter | test.cpp:60:17:60:17 | ValueNumberBound | 0 | false | NoReason | file://:0:0:0:0 | file://:0:0:0:0 | | test.cpp:62:10:62:13 | Load: iter | test.cpp:60:17:60:17 | ValueNumberBound | 3 | true | CompareLT: ... < ... | test.cpp:61:32:61:51 | test.cpp:61:32:61:51 | | test.cpp:62:10:62:13 | Load: iter | test.cpp:61:39:61:51 | ValueNumberBound | -1 | true | CompareLT: ... < ... | test.cpp:61:32:61:51 | test.cpp:61:32:61:51 | diff --git a/cpp/ql/test/experimental/library-tests/rangeanalysis/rangeanalysis/test.cpp b/cpp/ql/test/experimental/library-tests/rangeanalysis/rangeanalysis/test.cpp index 6b241fc42f7..87653c2fa43 100644 --- a/cpp/ql/test/experimental/library-tests/rangeanalysis/rangeanalysis/test.cpp +++ b/cpp/ql/test/experimental/library-tests/rangeanalysis/rangeanalysis/test.cpp @@ -51,7 +51,7 @@ int test5(int x, int y, int z) { } if (x < y) { if (y < z) { - sink(x); // x < z is inferred here + sink(x); // x < z is not inferred here } } } diff --git a/cpp/ql/test/library-tests/controlflow/guards-ir/tests.expected b/cpp/ql/test/library-tests/controlflow/guards-ir/tests.expected index 24ce995f813..d097fa7dfa6 100644 --- a/cpp/ql/test/library-tests/controlflow/guards-ir/tests.expected +++ b/cpp/ql/test/library-tests/controlflow/guards-ir/tests.expected @@ -42,8 +42,6 @@ astGuards astGuardsCompare | 7 | 0 < x+0 when ... > ... is true | | 7 | 0 >= x+0 when ... > ... is false | -| 7 | ... > ... != 0 when ... > ... is true | -| 7 | ... > ... == 0 when ... > ... is false | | 7 | x < 0+1 when ... > ... is false | | 7 | x >= 0+1 when ... > ... is true | | 17 | 0 < x+1 when ... < ... is false | @@ -52,12 +50,6 @@ astGuardsCompare | 17 | 1 < y+0 when ... && ... is true | | 17 | 1 < y+0 when ... > ... is true | | 17 | 1 >= y+0 when ... > ... is false | -| 17 | ... < ... != 0 when ... && ... is true | -| 17 | ... < ... != 0 when ... < ... is true | -| 17 | ... < ... == 0 when ... < ... is false | -| 17 | ... > ... != 0 when ... && ... is true | -| 17 | ... > ... != 0 when ... > ... is true | -| 17 | ... > ... == 0 when ... > ... is false | | 17 | x < 0+0 when ... && ... is true | | 17 | x < 0+0 when ... < ... is true | | 17 | x >= 0+0 when ... < ... is false | @@ -68,42 +60,30 @@ astGuardsCompare | 18 | call to get == 0 when call to get is false | | 26 | 0 < x+0 when ... > ... is true | | 26 | 0 >= x+0 when ... > ... is false | -| 26 | ... > ... != 0 when ... > ... is true | -| 26 | ... > ... == 0 when ... > ... is false | | 26 | x < 0+1 when ... > ... is false | | 26 | x >= 0+1 when ... > ... is true | | 31 | - ... != x+0 when ... == ... is false | | 31 | - ... == x+0 when ... == ... is true | -| 31 | ... == ... != 0 when ... == ... is true | -| 31 | ... == ... == 0 when ... == ... is false | | 31 | x != -1 when ... == ... is false | | 31 | x != - ...+0 when ... == ... is false | | 31 | x == -1 when ... == ... is true | | 31 | x == - ...+0 when ... == ... is true | | 34 | 10 < j+1 when ... < ... is false | | 34 | 10 >= j+1 when ... < ... is true | -| 34 | ... < ... != 0 when ... < ... is true | -| 34 | ... < ... == 0 when ... < ... is false | | 34 | j < 10+0 when ... < ... is true | | 34 | j >= 10+0 when ... < ... is false | | 42 | 10 < j+1 when ... < ... is false | | 42 | 10 >= j+1 when ... < ... is true | -| 42 | ... < ... != 0 when ... < ... is true | -| 42 | ... < ... == 0 when ... < ... is false | | 42 | call to getABool != 0 when call to getABool is true | | 42 | call to getABool == 0 when call to getABool is false | | 42 | j < 10+0 when ... < ... is true | | 42 | j >= 10+0 when ... < ... is false | | 44 | 0 < z+0 when ... > ... is true | | 44 | 0 >= z+0 when ... > ... is false | -| 44 | ... > ... != 0 when ... > ... is true | -| 44 | ... > ... == 0 when ... > ... is false | | 44 | z < 0+1 when ... > ... is false | | 44 | z >= 0+1 when ... > ... is true | | 45 | 0 < y+0 when ... > ... is true | | 45 | 0 >= y+0 when ... > ... is false | -| 45 | ... > ... != 0 when ... > ... is true | -| 45 | ... > ... == 0 when ... > ... is false | | 45 | y < 0+1 when ... > ... is false | | 45 | y >= 0+1 when ... > ... is true | | 58 | 0 != x+0 when ... == ... is false | @@ -112,12 +92,6 @@ astGuardsCompare | 58 | 0 < y+1 when ... \|\| ... is false | | 58 | 0 == x+0 when ... == ... is true | | 58 | 0 >= y+1 when ... < ... is true | -| 58 | ... < ... != 0 when ... < ... is true | -| 58 | ... < ... == 0 when ... < ... is false | -| 58 | ... < ... == 0 when ... \|\| ... is false | -| 58 | ... == ... != 0 when ... == ... is true | -| 58 | ... == ... == 0 when ... == ... is false | -| 58 | ... == ... == 0 when ... \|\| ... is false | | 58 | x != 0 when ... == ... is false | | 58 | x != 0 when ... \|\| ... is false | | 58 | x != 0+0 when ... == ... is false | @@ -129,8 +103,6 @@ astGuardsCompare | 58 | y >= 0+0 when ... \|\| ... is false | | 75 | 0 != x+0 when ... == ... is false | | 75 | 0 == x+0 when ... == ... is true | -| 75 | ... == ... != 0 when ... == ... is true | -| 75 | ... == ... == 0 when ... == ... is false | | 75 | x != 0 when ... == ... is false | | 75 | x != 0+0 when ... == ... is false | | 75 | x == 0 when ... == ... is true | @@ -141,12 +113,6 @@ astGuardsCompare | 85 | 0 == x+0 when ... && ... is true | | 85 | 0 == x+0 when ... == ... is true | | 85 | 0 == y+0 when ... != ... is false | -| 85 | ... != ... != 0 when ... != ... is true | -| 85 | ... != ... != 0 when ... && ... is true | -| 85 | ... != ... == 0 when ... != ... is false | -| 85 | ... == ... != 0 when ... && ... is true | -| 85 | ... == ... != 0 when ... == ... is true | -| 85 | ... == ... == 0 when ... == ... is false | | 85 | x != 0 when ... == ... is false | | 85 | x != 0+0 when ... == ... is false | | 85 | x == 0 when ... && ... is true | @@ -161,16 +127,12 @@ astGuardsCompare | 85 | y == 0+0 when ... != ... is false | | 94 | 0 != x+0 when ... != ... is true | | 94 | 0 == x+0 when ... != ... is false | -| 94 | ... != ... != 0 when ... != ... is true | -| 94 | ... != ... == 0 when ... != ... is false | | 94 | x != 0 when ... != ... is true | | 94 | x != 0+0 when ... != ... is true | | 94 | x == 0 when ... != ... is false | | 94 | x == 0+0 when ... != ... is false | | 102 | 10 < j+1 when ... < ... is false | | 102 | 10 >= j+1 when ... < ... is true | -| 102 | ... < ... != 0 when ... < ... is true | -| 102 | ... < ... == 0 when ... < ... is false | | 102 | j < 10+0 when ... < ... is true | | 102 | j >= 10+0 when ... < ... is false | | 109 | 0 != x+0 when ... == ... is false | @@ -179,12 +141,6 @@ astGuardsCompare | 109 | 0 < y+1 when ... \|\| ... is false | | 109 | 0 == x+0 when ... == ... is true | | 109 | 0 >= y+1 when ... < ... is true | -| 109 | ... < ... != 0 when ... < ... is true | -| 109 | ... < ... == 0 when ... < ... is false | -| 109 | ... < ... == 0 when ... \|\| ... is false | -| 109 | ... == ... != 0 when ... == ... is true | -| 109 | ... == ... == 0 when ... == ... is false | -| 109 | ... == ... == 0 when ... \|\| ... is false | | 109 | x != 0 when ... == ... is false | | 109 | x != 0 when ... \|\| ... is false | | 109 | x != 0+0 when ... == ... is false | @@ -217,8 +173,6 @@ astGuardsCompare | 152 | y == 0 when y is false | | 156 | ... + ... != x+0 when ... == ... is false | | 156 | ... + ... == x+0 when ... == ... is true | -| 156 | ... == ... != 0 when ... == ... is true | -| 156 | ... == ... == 0 when ... == ... is false | | 156 | x != ... + ...+0 when ... == ... is false | | 156 | x != y+42 when ... == ... is false | | 156 | x == ... + ...+0 when ... == ... is true | @@ -227,8 +181,6 @@ astGuardsCompare | 156 | y == x+-42 when ... == ... is true | | 159 | ... - ... != x+0 when ... == ... is false | | 159 | ... - ... == x+0 when ... == ... is true | -| 159 | ... == ... != 0 when ... == ... is true | -| 159 | ... == ... == 0 when ... == ... is false | | 159 | x != ... - ...+0 when ... == ... is false | | 159 | x != y+-42 when ... == ... is false | | 159 | x == ... - ...+0 when ... == ... is true | @@ -237,8 +189,6 @@ astGuardsCompare | 159 | y == x+42 when ... == ... is true | | 162 | ... + ... < x+1 when ... < ... is false | | 162 | ... + ... >= x+1 when ... < ... is true | -| 162 | ... < ... != 0 when ... < ... is true | -| 162 | ... < ... == 0 when ... < ... is false | | 162 | x < ... + ...+0 when ... < ... is true | | 162 | x < y+42 when ... < ... is true | | 162 | x >= ... + ...+0 when ... < ... is false | @@ -247,8 +197,6 @@ astGuardsCompare | 162 | y >= x+-41 when ... < ... is true | | 165 | ... - ... < x+1 when ... < ... is false | | 165 | ... - ... >= x+1 when ... < ... is true | -| 165 | ... < ... != 0 when ... < ... is true | -| 165 | ... < ... == 0 when ... < ... is false | | 165 | x < ... - ...+0 when ... < ... is true | | 165 | x < y+-42 when ... < ... is true | | 165 | x >= ... - ...+0 when ... < ... is false | @@ -257,8 +205,6 @@ astGuardsCompare | 165 | y >= x+43 when ... < ... is true | | 175 | 0 != call to foo+0 when ... == ... is false | | 175 | 0 == call to foo+0 when ... == ... is true | -| 175 | ... == ... != 0 when ... == ... is true | -| 175 | ... == ... == 0 when ... == ... is false | | 175 | call to foo != 0 when ... == ... is false | | 175 | call to foo != 0+0 when ... == ... is false | | 175 | call to foo == 0 when ... == ... is true | @@ -468,20 +414,10 @@ astGuardsEnsure | test.c:75:9:75:14 | ... == ... | test.c:75:9:75:9 | x | == | test.c:75:14:75:14 | 0 | 0 | 75 | 77 | | test.c:75:9:75:14 | ... == ... | test.c:75:14:75:14 | 0 | != | test.c:75:9:75:9 | x | 0 | 78 | 79 | | test.c:75:9:75:14 | ... == ... | test.c:75:14:75:14 | 0 | == | test.c:75:9:75:9 | x | 0 | 75 | 77 | -| test.c:75:9:75:14 | ... == ... | test.c:85:8:85:8 | x | != | test.c:85:13:85:13 | 0 | 0 | 78 | 79 | -| test.c:75:9:75:14 | ... == ... | test.c:85:8:85:8 | x | == | test.c:85:13:85:13 | 0 | 0 | 75 | 77 | -| test.c:75:9:75:14 | ... == ... | test.c:85:13:85:13 | 0 | != | test.c:85:8:85:8 | x | 0 | 78 | 79 | -| test.c:75:9:75:14 | ... == ... | test.c:85:13:85:13 | 0 | == | test.c:85:8:85:8 | x | 0 | 75 | 77 | -| test.c:85:8:85:13 | ... == ... | test.c:75:9:75:9 | x | == | test.c:75:14:75:14 | 0 | 0 | 85 | 85 | -| test.c:85:8:85:13 | ... == ... | test.c:75:9:75:9 | x | == | test.c:75:14:75:14 | 0 | 0 | 86 | 86 | -| test.c:85:8:85:13 | ... == ... | test.c:75:14:75:14 | 0 | == | test.c:75:9:75:9 | x | 0 | 85 | 85 | -| test.c:85:8:85:13 | ... == ... | test.c:75:14:75:14 | 0 | == | test.c:75:9:75:9 | x | 0 | 86 | 86 | | test.c:85:8:85:13 | ... == ... | test.c:85:8:85:8 | x | == | test.c:85:13:85:13 | 0 | 0 | 85 | 85 | | test.c:85:8:85:13 | ... == ... | test.c:85:8:85:8 | x | == | test.c:85:13:85:13 | 0 | 0 | 86 | 86 | | test.c:85:8:85:13 | ... == ... | test.c:85:13:85:13 | 0 | == | test.c:85:8:85:8 | x | 0 | 85 | 85 | | test.c:85:8:85:13 | ... == ... | test.c:85:13:85:13 | 0 | == | test.c:85:8:85:8 | x | 0 | 86 | 86 | -| test.c:85:8:85:23 | ... && ... | test.c:75:9:75:9 | x | == | test.c:75:14:75:14 | 0 | 0 | 86 | 86 | -| test.c:85:8:85:23 | ... && ... | test.c:75:14:75:14 | 0 | == | test.c:75:9:75:9 | x | 0 | 86 | 86 | | test.c:85:8:85:23 | ... && ... | test.c:85:8:85:8 | x | == | test.c:85:13:85:13 | 0 | 0 | 86 | 86 | | test.c:85:8:85:23 | ... && ... | test.c:85:13:85:13 | 0 | == | test.c:85:8:85:8 | x | 0 | 86 | 86 | | test.c:85:8:85:23 | ... && ... | test.c:85:18:85:18 | y | != | test.c:85:23:85:23 | 0 | 0 | 86 | 86 | @@ -555,81 +491,16 @@ astGuardsEnsure | test.cpp:31:7:31:13 | ... == ... | test.cpp:31:12:31:13 | - ... | == | test.cpp:31:7:31:7 | x | 0 | 30 | 30 | | test.cpp:31:7:31:13 | ... == ... | test.cpp:31:12:31:13 | - ... | == | test.cpp:31:7:31:7 | x | 0 | 31 | 32 | astGuardsEnsure_const -| test.c:7:9:7:13 | ... > ... | test.c:7:9:7:13 | ... > ... | != | 0 | 7 | 9 | -| test.c:7:9:7:13 | ... > ... | test.c:7:9:7:13 | ... > ... | == | 0 | 10 | 11 | -| test.c:17:8:17:12 | ... < ... | test.c:17:8:17:12 | ... < ... | != | 0 | 17 | 17 | -| test.c:17:8:17:12 | ... < ... | test.c:17:8:17:12 | ... < ... | != | 0 | 18 | 18 | -| test.c:17:8:17:21 | ... && ... | test.c:17:8:17:12 | ... < ... | != | 0 | 18 | 18 | -| test.c:17:8:17:21 | ... && ... | test.c:17:17:17:21 | ... > ... | != | 0 | 18 | 18 | -| test.c:17:17:17:21 | ... > ... | test.c:17:17:17:21 | ... > ... | != | 0 | 18 | 18 | -| test.c:26:11:26:15 | ... > ... | test.c:26:11:26:15 | ... > ... | != | 0 | 26 | 28 | -| test.c:26:11:26:15 | ... > ... | test.c:26:11:26:15 | ... > ... | == | 0 | 2 | 2 | -| test.c:26:11:26:15 | ... > ... | test.c:26:11:26:15 | ... > ... | == | 0 | 31 | 34 | -| test.c:26:11:26:15 | ... > ... | test.c:26:11:26:15 | ... > ... | == | 0 | 34 | 34 | -| test.c:26:11:26:15 | ... > ... | test.c:26:11:26:15 | ... > ... | == | 0 | 39 | 42 | -| test.c:26:11:26:15 | ... > ... | test.c:26:11:26:15 | ... > ... | == | 0 | 42 | 42 | -| test.c:26:11:26:15 | ... > ... | test.c:26:11:26:15 | ... > ... | == | 0 | 42 | 44 | -| test.c:26:11:26:15 | ... > ... | test.c:26:11:26:15 | ... > ... | == | 0 | 45 | 45 | -| test.c:26:11:26:15 | ... > ... | test.c:26:11:26:15 | ... > ... | == | 0 | 45 | 47 | -| test.c:26:11:26:15 | ... > ... | test.c:26:11:26:15 | ... > ... | == | 0 | 51 | 53 | -| test.c:26:11:26:15 | ... > ... | test.c:26:11:26:15 | ... > ... | == | 0 | 56 | 58 | -| test.c:26:11:26:15 | ... > ... | test.c:26:11:26:15 | ... > ... | == | 0 | 58 | 58 | -| test.c:26:11:26:15 | ... > ... | test.c:26:11:26:15 | ... > ... | == | 0 | 58 | 66 | -| test.c:26:11:26:15 | ... > ... | test.c:26:11:26:15 | ... > ... | == | 0 | 62 | 62 | -| test.c:34:16:34:21 | ... < ... | test.c:34:16:34:21 | ... < ... | != | 0 | 34 | 34 | -| test.c:34:16:34:21 | ... < ... | test.c:34:16:34:21 | ... < ... | == | 0 | 2 | 2 | -| test.c:34:16:34:21 | ... < ... | test.c:34:16:34:21 | ... < ... | == | 0 | 39 | 42 | -| test.c:34:16:34:21 | ... < ... | test.c:34:16:34:21 | ... < ... | == | 0 | 42 | 42 | -| test.c:34:16:34:21 | ... < ... | test.c:34:16:34:21 | ... < ... | == | 0 | 42 | 44 | -| test.c:34:16:34:21 | ... < ... | test.c:34:16:34:21 | ... < ... | == | 0 | 45 | 45 | -| test.c:34:16:34:21 | ... < ... | test.c:34:16:34:21 | ... < ... | == | 0 | 45 | 47 | -| test.c:34:16:34:21 | ... < ... | test.c:34:16:34:21 | ... < ... | == | 0 | 51 | 53 | -| test.c:34:16:34:21 | ... < ... | test.c:34:16:34:21 | ... < ... | == | 0 | 56 | 58 | -| test.c:34:16:34:21 | ... < ... | test.c:34:16:34:21 | ... < ... | == | 0 | 58 | 58 | -| test.c:34:16:34:21 | ... < ... | test.c:34:16:34:21 | ... < ... | == | 0 | 58 | 66 | -| test.c:34:16:34:21 | ... < ... | test.c:34:16:34:21 | ... < ... | == | 0 | 62 | 62 | -| test.c:42:16:42:21 | ... < ... | test.c:42:16:42:21 | ... < ... | != | 0 | 42 | 42 | -| test.c:42:16:42:21 | ... < ... | test.c:42:16:42:21 | ... < ... | != | 0 | 42 | 44 | -| test.c:42:16:42:21 | ... < ... | test.c:42:16:42:21 | ... < ... | != | 0 | 45 | 45 | -| test.c:42:16:42:21 | ... < ... | test.c:42:16:42:21 | ... < ... | != | 0 | 45 | 47 | -| test.c:42:16:42:21 | ... < ... | test.c:42:16:42:21 | ... < ... | != | 0 | 51 | 53 | -| test.c:44:12:44:16 | ... > ... | test.c:44:12:44:16 | ... > ... | != | 0 | 45 | 45 | -| test.c:44:12:44:16 | ... > ... | test.c:44:12:44:16 | ... > ... | != | 0 | 45 | 47 | -| test.c:44:12:44:16 | ... > ... | test.c:44:12:44:16 | ... > ... | == | 0 | 42 | 42 | -| test.c:44:12:44:16 | ... > ... | test.c:44:12:44:16 | ... > ... | == | 0 | 51 | 53 | -| test.c:45:16:45:20 | ... > ... | test.c:45:16:45:20 | ... > ... | != | 0 | 45 | 47 | | test.c:58:9:58:14 | ... == ... | test.c:58:9:58:9 | x | != | 0 | 58 | 58 | | test.c:58:9:58:14 | ... == ... | test.c:58:9:58:9 | x | != | 0 | 62 | 62 | -| test.c:58:9:58:14 | ... == ... | test.c:58:9:58:14 | ... == ... | == | 0 | 58 | 58 | -| test.c:58:9:58:14 | ... == ... | test.c:58:9:58:14 | ... == ... | == | 0 | 62 | 62 | | test.c:58:9:58:23 | ... \|\| ... | test.c:58:9:58:9 | x | != | 0 | 62 | 62 | -| test.c:58:9:58:23 | ... \|\| ... | test.c:58:9:58:14 | ... == ... | == | 0 | 62 | 62 | -| test.c:58:9:58:23 | ... \|\| ... | test.c:58:19:58:23 | ... < ... | == | 0 | 62 | 62 | -| test.c:58:19:58:23 | ... < ... | test.c:58:19:58:23 | ... < ... | == | 0 | 62 | 62 | | test.c:75:9:75:14 | ... == ... | test.c:75:9:75:9 | x | != | 0 | 78 | 79 | | test.c:75:9:75:14 | ... == ... | test.c:75:9:75:9 | x | == | 0 | 75 | 77 | -| test.c:75:9:75:14 | ... == ... | test.c:75:9:75:14 | ... == ... | != | 0 | 75 | 77 | -| test.c:75:9:75:14 | ... == ... | test.c:75:9:75:14 | ... == ... | == | 0 | 78 | 79 | -| test.c:75:9:75:14 | ... == ... | test.c:85:8:85:8 | x | != | 0 | 78 | 79 | -| test.c:75:9:75:14 | ... == ... | test.c:85:8:85:8 | x | == | 0 | 75 | 77 | -| test.c:75:9:75:14 | ... == ... | test.c:85:8:85:13 | ... == ... | != | 0 | 75 | 77 | -| test.c:75:9:75:14 | ... == ... | test.c:85:8:85:13 | ... == ... | == | 0 | 78 | 79 | -| test.c:85:8:85:13 | ... == ... | test.c:75:9:75:9 | x | == | 0 | 85 | 85 | -| test.c:85:8:85:13 | ... == ... | test.c:75:9:75:9 | x | == | 0 | 86 | 86 | -| test.c:85:8:85:13 | ... == ... | test.c:75:9:75:14 | ... == ... | != | 0 | 85 | 85 | -| test.c:85:8:85:13 | ... == ... | test.c:75:9:75:14 | ... == ... | != | 0 | 86 | 86 | | test.c:85:8:85:13 | ... == ... | test.c:85:8:85:8 | x | == | 0 | 85 | 85 | | test.c:85:8:85:13 | ... == ... | test.c:85:8:85:8 | x | == | 0 | 86 | 86 | -| test.c:85:8:85:13 | ... == ... | test.c:85:8:85:13 | ... == ... | != | 0 | 85 | 85 | -| test.c:85:8:85:13 | ... == ... | test.c:85:8:85:13 | ... == ... | != | 0 | 86 | 86 | -| test.c:85:8:85:23 | ... && ... | test.c:75:9:75:9 | x | == | 0 | 86 | 86 | -| test.c:85:8:85:23 | ... && ... | test.c:75:9:75:14 | ... == ... | != | 0 | 86 | 86 | | test.c:85:8:85:23 | ... && ... | test.c:85:8:85:8 | x | == | 0 | 86 | 86 | -| test.c:85:8:85:23 | ... && ... | test.c:85:8:85:13 | ... == ... | != | 0 | 86 | 86 | | test.c:85:8:85:23 | ... && ... | test.c:85:18:85:18 | y | != | 0 | 86 | 86 | -| test.c:85:8:85:23 | ... && ... | test.c:85:18:85:23 | ... != ... | != | 0 | 86 | 86 | | test.c:85:18:85:23 | ... != ... | test.c:85:18:85:18 | y | != | 0 | 86 | 86 | -| test.c:85:18:85:23 | ... != ... | test.c:85:18:85:23 | ... != ... | != | 0 | 86 | 86 | | test.c:94:11:94:16 | ... != ... | test.c:94:11:94:11 | x | != | 0 | 94 | 96 | | test.c:94:11:94:16 | ... != ... | test.c:94:11:94:11 | x | == | 0 | 70 | 70 | | test.c:94:11:94:16 | ... != ... | test.c:94:11:94:11 | x | == | 0 | 99 | 102 | @@ -638,41 +509,16 @@ astGuardsEnsure_const | test.c:94:11:94:16 | ... != ... | test.c:94:11:94:11 | x | == | 0 | 109 | 109 | | test.c:94:11:94:16 | ... != ... | test.c:94:11:94:11 | x | == | 0 | 109 | 117 | | test.c:94:11:94:16 | ... != ... | test.c:94:11:94:11 | x | == | 0 | 113 | 113 | -| test.c:94:11:94:16 | ... != ... | test.c:94:11:94:16 | ... != ... | != | 0 | 94 | 96 | -| test.c:94:11:94:16 | ... != ... | test.c:94:11:94:16 | ... != ... | == | 0 | 70 | 70 | -| test.c:94:11:94:16 | ... != ... | test.c:94:11:94:16 | ... != ... | == | 0 | 99 | 102 | -| test.c:94:11:94:16 | ... != ... | test.c:94:11:94:16 | ... != ... | == | 0 | 102 | 102 | -| test.c:94:11:94:16 | ... != ... | test.c:94:11:94:16 | ... != ... | == | 0 | 107 | 109 | -| test.c:94:11:94:16 | ... != ... | test.c:94:11:94:16 | ... != ... | == | 0 | 109 | 109 | -| test.c:94:11:94:16 | ... != ... | test.c:94:11:94:16 | ... != ... | == | 0 | 109 | 117 | -| test.c:94:11:94:16 | ... != ... | test.c:94:11:94:16 | ... != ... | == | 0 | 113 | 113 | -| test.c:102:16:102:21 | ... < ... | test.c:102:16:102:21 | ... < ... | != | 0 | 102 | 102 | -| test.c:102:16:102:21 | ... < ... | test.c:102:16:102:21 | ... < ... | == | 0 | 70 | 70 | -| test.c:102:16:102:21 | ... < ... | test.c:102:16:102:21 | ... < ... | == | 0 | 107 | 109 | -| test.c:102:16:102:21 | ... < ... | test.c:102:16:102:21 | ... < ... | == | 0 | 109 | 109 | -| test.c:102:16:102:21 | ... < ... | test.c:102:16:102:21 | ... < ... | == | 0 | 109 | 117 | -| test.c:102:16:102:21 | ... < ... | test.c:102:16:102:21 | ... < ... | == | 0 | 113 | 113 | | test.c:109:9:109:14 | ... == ... | test.c:109:9:109:9 | x | != | 0 | 109 | 109 | | test.c:109:9:109:14 | ... == ... | test.c:109:9:109:9 | x | != | 0 | 113 | 113 | -| test.c:109:9:109:14 | ... == ... | test.c:109:9:109:14 | ... == ... | == | 0 | 109 | 109 | -| test.c:109:9:109:14 | ... == ... | test.c:109:9:109:14 | ... == ... | == | 0 | 113 | 113 | | test.c:109:9:109:23 | ... \|\| ... | test.c:109:9:109:9 | x | != | 0 | 113 | 113 | -| test.c:109:9:109:23 | ... \|\| ... | test.c:109:9:109:14 | ... == ... | == | 0 | 113 | 113 | -| test.c:109:9:109:23 | ... \|\| ... | test.c:109:19:109:23 | ... < ... | == | 0 | 113 | 113 | -| test.c:109:19:109:23 | ... < ... | test.c:109:19:109:23 | ... < ... | == | 0 | 113 | 113 | | test.c:126:7:126:7 | 1 | test.c:126:7:126:7 | 1 | != | 0 | 126 | 126 | | test.c:126:7:126:7 | 1 | test.c:126:7:126:7 | 1 | != | 0 | 126 | 128 | | test.c:126:7:126:7 | 1 | test.c:126:7:126:7 | 1 | != | 0 | 131 | 131 | | test.c:126:7:126:7 | 1 | test.c:126:7:126:7 | 1 | != | 0 | 131 | 132 | | test.c:126:7:126:7 | 1 | test.c:126:7:126:7 | 1 | != | 0 | 134 | 123 | -| test.c:126:7:126:7 | 1 | test.c:127:9:127:9 | 1 | != | 0 | 126 | 126 | -| test.c:126:7:126:7 | 1 | test.c:127:9:127:9 | 1 | != | 0 | 126 | 128 | -| test.c:126:7:126:7 | 1 | test.c:127:9:127:9 | 1 | != | 0 | 131 | 131 | -| test.c:126:7:126:7 | 1 | test.c:127:9:127:9 | 1 | != | 0 | 131 | 132 | -| test.c:126:7:126:7 | 1 | test.c:127:9:127:9 | 1 | != | 0 | 134 | 123 | | test.c:126:7:126:28 | ... && ... | test.c:126:7:126:7 | 1 | != | 0 | 126 | 128 | | test.c:126:7:126:28 | ... && ... | test.c:126:12:126:26 | call to test3_condition | != | 0 | 126 | 128 | -| test.c:126:7:126:28 | ... && ... | test.c:127:9:127:9 | 1 | != | 0 | 126 | 128 | | test.c:126:12:126:26 | call to test3_condition | test.c:126:12:126:26 | call to test3_condition | != | 0 | 126 | 128 | | test.c:131:7:131:7 | b | test.c:131:7:131:7 | b | != | 0 | 131 | 132 | | test.c:137:7:137:7 | 0 | test.c:137:7:137:7 | 0 | == | 0 | 142 | 136 | @@ -683,14 +529,8 @@ astGuardsEnsure_const | test.c:152:10:152:15 | ... && ... | test.c:152:10:152:10 | x | != | 0 | 151 | 152 | | test.c:152:10:152:15 | ... && ... | test.c:152:15:152:15 | y | != | 0 | 151 | 152 | | test.c:152:15:152:15 | y | test.c:152:15:152:15 | y | != | 0 | 151 | 152 | -| test.c:156:9:156:19 | ... == ... | test.c:156:9:156:19 | ... == ... | != | 0 | 156 | 157 | -| test.c:159:9:159:19 | ... == ... | test.c:159:9:159:19 | ... == ... | != | 0 | 159 | 160 | -| test.c:162:9:162:18 | ... < ... | test.c:162:9:162:18 | ... < ... | != | 0 | 162 | 163 | -| test.c:165:9:165:18 | ... < ... | test.c:165:9:165:18 | ... < ... | != | 0 | 165 | 166 | | test.c:175:13:175:32 | ... == ... | test.c:175:13:175:15 | call to foo | != | 0 | 175 | 175 | | test.c:175:13:175:32 | ... == ... | test.c:175:13:175:15 | call to foo | == | 0 | 175 | 175 | -| test.c:175:13:175:32 | ... == ... | test.c:175:13:175:32 | ... == ... | != | 0 | 175 | 175 | -| test.c:175:13:175:32 | ... == ... | test.c:175:13:175:32 | ... == ... | == | 0 | 175 | 175 | | test.c:181:9:181:9 | x | test.c:181:9:181:9 | x | != | 0 | 181 | 182 | | test.c:181:9:181:9 | x | test.c:181:9:181:9 | x | != | 0 | 186 | 180 | | test.c:181:9:181:9 | x | test.c:181:9:181:9 | x | == | 0 | 183 | 184 | @@ -699,10 +539,6 @@ astGuardsEnsure_const | test.cpp:31:7:31:13 | ... == ... | test.cpp:31:7:31:7 | x | != | -1 | 34 | 34 | | test.cpp:31:7:31:13 | ... == ... | test.cpp:31:7:31:7 | x | == | -1 | 30 | 30 | | test.cpp:31:7:31:13 | ... == ... | test.cpp:31:7:31:7 | x | == | -1 | 31 | 32 | -| test.cpp:31:7:31:13 | ... == ... | test.cpp:31:7:31:13 | ... == ... | != | 0 | 30 | 30 | -| test.cpp:31:7:31:13 | ... == ... | test.cpp:31:7:31:13 | ... == ... | != | 0 | 31 | 32 | -| test.cpp:31:7:31:13 | ... == ... | test.cpp:31:7:31:13 | ... == ... | == | 0 | 30 | 30 | -| test.cpp:31:7:31:13 | ... == ... | test.cpp:31:7:31:13 | ... == ... | == | 0 | 34 | 34 | | test.cpp:42:13:42:20 | call to getABool | test.cpp:42:13:42:20 | call to getABool | != | 0 | 43 | 45 | | test.cpp:42:13:42:20 | call to getABool | test.cpp:42:13:42:20 | call to getABool | == | 0 | 53 | 53 | irGuards @@ -743,8 +579,6 @@ irGuards irGuardsCompare | 7 | 0 < x+0 when CompareGT: ... > ... is true | | 7 | 0 >= x+0 when CompareGT: ... > ... is false | -| 7 | ... > ... != 0 when CompareGT: ... > ... is true | -| 7 | ... > ... == 0 when CompareGT: ... > ... is false | | 7 | x < 0+1 when CompareGT: ... > ... is false | | 7 | x < 1 when CompareGT: ... > ... is false | | 7 | x >= 0+1 when CompareGT: ... > ... is true | @@ -753,10 +587,6 @@ irGuardsCompare | 17 | 0 >= x+1 when CompareLT: ... < ... is true | | 17 | 1 < y+0 when CompareGT: ... > ... is true | | 17 | 1 >= y+0 when CompareGT: ... > ... is false | -| 17 | ... < ... != 0 when CompareLT: ... < ... is true | -| 17 | ... < ... == 0 when CompareLT: ... < ... is false | -| 17 | ... > ... != 0 when CompareGT: ... > ... is true | -| 17 | ... > ... == 0 when CompareGT: ... > ... is false | | 17 | x < 0 when CompareLT: ... < ... is true | | 17 | x < 0+0 when CompareLT: ... < ... is true | | 17 | x >= 0 when CompareLT: ... < ... is false | @@ -769,32 +599,24 @@ irGuardsCompare | 18 | call to get == 0 when CompareNE: (bool)... is false | | 26 | 0 < x+0 when CompareGT: ... > ... is true | | 26 | 0 >= x+0 when CompareGT: ... > ... is false | -| 26 | ... > ... != 0 when CompareGT: ... > ... is true | -| 26 | ... > ... == 0 when CompareGT: ... > ... is false | | 26 | x < 0+1 when CompareGT: ... > ... is false | | 26 | x < 1 when CompareGT: ... > ... is false | | 26 | x >= 0+1 when CompareGT: ... > ... is true | | 26 | x >= 1 when CompareGT: ... > ... is true | | 31 | - ... != x+0 when CompareEQ: ... == ... is false | | 31 | - ... == x+0 when CompareEQ: ... == ... is true | -| 31 | ... == ... != 0 when CompareEQ: ... == ... is true | -| 31 | ... == ... == 0 when CompareEQ: ... == ... is false | | 31 | x != -1 when CompareEQ: ... == ... is false | | 31 | x != - ...+0 when CompareEQ: ... == ... is false | | 31 | x == -1 when CompareEQ: ... == ... is true | | 31 | x == - ...+0 when CompareEQ: ... == ... is true | | 34 | 10 < j+1 when CompareLT: ... < ... is false | | 34 | 10 >= j+1 when CompareLT: ... < ... is true | -| 34 | ... < ... != 0 when CompareLT: ... < ... is true | -| 34 | ... < ... == 0 when CompareLT: ... < ... is false | | 34 | j < 10 when CompareLT: ... < ... is true | | 34 | j < 10+0 when CompareLT: ... < ... is true | | 34 | j >= 10 when CompareLT: ... < ... is false | | 34 | j >= 10+0 when CompareLT: ... < ... is false | | 42 | 10 < j+1 when CompareLT: ... < ... is false | | 42 | 10 >= j+1 when CompareLT: ... < ... is true | -| 42 | ... < ... != 0 when CompareLT: ... < ... is true | -| 42 | ... < ... == 0 when CompareLT: ... < ... is false | | 42 | call to getABool != 0 when Call: call to getABool is true | | 42 | call to getABool == 0 when Call: call to getABool is false | | 42 | j < 10 when CompareLT: ... < ... is true | @@ -803,16 +625,12 @@ irGuardsCompare | 42 | j >= 10+0 when CompareLT: ... < ... is false | | 44 | 0 < z+0 when CompareGT: ... > ... is true | | 44 | 0 >= z+0 when CompareGT: ... > ... is false | -| 44 | ... > ... != 0 when CompareGT: ... > ... is true | -| 44 | ... > ... == 0 when CompareGT: ... > ... is false | | 44 | z < 0+1 when CompareGT: ... > ... is false | | 44 | z < 1 when CompareGT: ... > ... is false | | 44 | z >= 0+1 when CompareGT: ... > ... is true | | 44 | z >= 1 when CompareGT: ... > ... is true | | 45 | 0 < y+0 when CompareGT: ... > ... is true | | 45 | 0 >= y+0 when CompareGT: ... > ... is false | -| 45 | ... > ... != 0 when CompareGT: ... > ... is true | -| 45 | ... > ... == 0 when CompareGT: ... > ... is false | | 45 | y < 0+1 when CompareGT: ... > ... is false | | 45 | y < 1 when CompareGT: ... > ... is false | | 45 | y >= 0+1 when CompareGT: ... > ... is true | @@ -821,10 +639,6 @@ irGuardsCompare | 58 | 0 < y+1 when CompareLT: ... < ... is false | | 58 | 0 == x+0 when CompareEQ: ... == ... is true | | 58 | 0 >= y+1 when CompareLT: ... < ... is true | -| 58 | ... < ... != 0 when CompareLT: ... < ... is true | -| 58 | ... < ... == 0 when CompareLT: ... < ... is false | -| 58 | ... == ... != 0 when CompareEQ: ... == ... is true | -| 58 | ... == ... == 0 when CompareEQ: ... == ... is false | | 58 | x != 0 when CompareEQ: ... == ... is false | | 58 | x != 0+0 when CompareEQ: ... == ... is false | | 58 | x == 0 when CompareEQ: ... == ... is true | @@ -835,8 +649,6 @@ irGuardsCompare | 58 | y >= 0+0 when CompareLT: ... < ... is false | | 75 | 0 != x+0 when CompareEQ: ... == ... is false | | 75 | 0 == x+0 when CompareEQ: ... == ... is true | -| 75 | ... == ... != 0 when CompareEQ: ... == ... is true | -| 75 | ... == ... == 0 when CompareEQ: ... == ... is false | | 75 | x != 0 when CompareEQ: ... == ... is false | | 75 | x != 0+0 when CompareEQ: ... == ... is false | | 75 | x == 0 when CompareEQ: ... == ... is true | @@ -845,10 +657,6 @@ irGuardsCompare | 85 | 0 != y+0 when CompareNE: ... != ... is true | | 85 | 0 == x+0 when CompareEQ: ... == ... is true | | 85 | 0 == y+0 when CompareNE: ... != ... is false | -| 85 | ... != ... != 0 when CompareNE: ... != ... is true | -| 85 | ... != ... == 0 when CompareNE: ... != ... is false | -| 85 | ... == ... != 0 when CompareEQ: ... == ... is true | -| 85 | ... == ... == 0 when CompareEQ: ... == ... is false | | 85 | x != 0 when CompareEQ: ... == ... is false | | 85 | x != 0+0 when CompareEQ: ... == ... is false | | 85 | x == 0 when CompareEQ: ... == ... is true | @@ -859,16 +667,12 @@ irGuardsCompare | 85 | y == 0+0 when CompareNE: ... != ... is false | | 94 | 0 != x+0 when CompareNE: ... != ... is true | | 94 | 0 == x+0 when CompareNE: ... != ... is false | -| 94 | ... != ... != 0 when CompareNE: ... != ... is true | -| 94 | ... != ... == 0 when CompareNE: ... != ... is false | | 94 | x != 0 when CompareNE: ... != ... is true | | 94 | x != 0+0 when CompareNE: ... != ... is true | | 94 | x == 0 when CompareNE: ... != ... is false | | 94 | x == 0+0 when CompareNE: ... != ... is false | | 102 | 10 < j+1 when CompareLT: ... < ... is false | | 102 | 10 >= j+1 when CompareLT: ... < ... is true | -| 102 | ... < ... != 0 when CompareLT: ... < ... is true | -| 102 | ... < ... == 0 when CompareLT: ... < ... is false | | 102 | j < 10 when CompareLT: ... < ... is true | | 102 | j < 10+0 when CompareLT: ... < ... is true | | 102 | j >= 10 when CompareLT: ... < ... is false | @@ -877,10 +681,6 @@ irGuardsCompare | 109 | 0 < y+1 when CompareLT: ... < ... is false | | 109 | 0 == x+0 when CompareEQ: ... == ... is true | | 109 | 0 >= y+1 when CompareLT: ... < ... is true | -| 109 | ... < ... != 0 when CompareLT: ... < ... is true | -| 109 | ... < ... == 0 when CompareLT: ... < ... is false | -| 109 | ... == ... != 0 when CompareEQ: ... == ... is true | -| 109 | ... == ... == 0 when CompareEQ: ... == ... is false | | 109 | x != 0 when CompareEQ: ... == ... is false | | 109 | x != 0+0 when CompareEQ: ... == ... is false | | 109 | x == 0 when CompareEQ: ... == ... is true | @@ -908,8 +708,6 @@ irGuardsCompare | 152 | y == 0 when Load: y is false | | 156 | ... + ... != x+0 when CompareEQ: ... == ... is false | | 156 | ... + ... == x+0 when CompareEQ: ... == ... is true | -| 156 | ... == ... != 0 when CompareEQ: ... == ... is true | -| 156 | ... == ... == 0 when CompareEQ: ... == ... is false | | 156 | x != ... + ...+0 when CompareEQ: ... == ... is false | | 156 | x != y+42 when CompareEQ: ... == ... is false | | 156 | x == ... + ...+0 when CompareEQ: ... == ... is true | @@ -918,8 +716,6 @@ irGuardsCompare | 156 | y == x+-42 when CompareEQ: ... == ... is true | | 159 | ... - ... != x+0 when CompareEQ: ... == ... is false | | 159 | ... - ... == x+0 when CompareEQ: ... == ... is true | -| 159 | ... == ... != 0 when CompareEQ: ... == ... is true | -| 159 | ... == ... == 0 when CompareEQ: ... == ... is false | | 159 | x != ... - ...+0 when CompareEQ: ... == ... is false | | 159 | x != y+-42 when CompareEQ: ... == ... is false | | 159 | x == ... - ...+0 when CompareEQ: ... == ... is true | @@ -928,8 +724,6 @@ irGuardsCompare | 159 | y == x+42 when CompareEQ: ... == ... is true | | 162 | ... + ... < x+1 when CompareLT: ... < ... is false | | 162 | ... + ... >= x+1 when CompareLT: ... < ... is true | -| 162 | ... < ... != 0 when CompareLT: ... < ... is true | -| 162 | ... < ... == 0 when CompareLT: ... < ... is false | | 162 | x < ... + ...+0 when CompareLT: ... < ... is true | | 162 | x < y+42 when CompareLT: ... < ... is true | | 162 | x >= ... + ...+0 when CompareLT: ... < ... is false | @@ -938,8 +732,6 @@ irGuardsCompare | 162 | y >= x+-41 when CompareLT: ... < ... is true | | 165 | ... - ... < x+1 when CompareLT: ... < ... is false | | 165 | ... - ... >= x+1 when CompareLT: ... < ... is true | -| 165 | ... < ... != 0 when CompareLT: ... < ... is true | -| 165 | ... < ... == 0 when CompareLT: ... < ... is false | | 165 | x < ... - ...+0 when CompareLT: ... < ... is true | | 165 | x < y+-42 when CompareLT: ... < ... is true | | 165 | x >= ... - ...+0 when CompareLT: ... < ... is false | @@ -948,8 +740,6 @@ irGuardsCompare | 165 | y >= x+43 when CompareLT: ... < ... is true | | 175 | 0 != call to foo+0 when CompareEQ: ... == ... is false | | 175 | 0 == call to foo+0 when CompareEQ: ... == ... is true | -| 175 | ... == ... != 0 when CompareEQ: ... == ... is true | -| 175 | ... == ... == 0 when CompareEQ: ... == ... is false | | 175 | call to foo != 0 when CompareEQ: ... == ... is false | | 175 | call to foo != 0+0 when CompareEQ: ... == ... is false | | 175 | call to foo == 0 when CompareEQ: ... == ... is true | @@ -1140,14 +930,6 @@ irGuardsEnsure | test.c:75:9:75:14 | CompareEQ: ... == ... | test.c:75:9:75:9 | Load: x | == | test.c:75:14:75:14 | Constant: 0 | 0 | 76 | 76 | | test.c:75:9:75:14 | CompareEQ: ... == ... | test.c:75:14:75:14 | Constant: 0 | != | test.c:75:9:75:9 | Load: x | 0 | 79 | 79 | | test.c:75:9:75:14 | CompareEQ: ... == ... | test.c:75:14:75:14 | Constant: 0 | == | test.c:75:9:75:9 | Load: x | 0 | 76 | 76 | -| test.c:75:9:75:14 | CompareEQ: ... == ... | test.c:85:8:85:8 | Load: x | != | test.c:85:13:85:13 | Constant: 0 | 0 | 79 | 79 | -| test.c:75:9:75:14 | CompareEQ: ... == ... | test.c:85:8:85:8 | Load: x | == | test.c:85:13:85:13 | Constant: 0 | 0 | 76 | 76 | -| test.c:75:9:75:14 | CompareEQ: ... == ... | test.c:85:13:85:13 | Constant: 0 | != | test.c:85:8:85:8 | Load: x | 0 | 79 | 79 | -| test.c:75:9:75:14 | CompareEQ: ... == ... | test.c:85:13:85:13 | Constant: 0 | == | test.c:85:8:85:8 | Load: x | 0 | 76 | 76 | -| test.c:85:8:85:13 | CompareEQ: ... == ... | test.c:75:9:75:9 | Load: x | == | test.c:75:14:75:14 | Constant: 0 | 0 | 85 | 85 | -| test.c:85:8:85:13 | CompareEQ: ... == ... | test.c:75:9:75:9 | Load: x | == | test.c:75:14:75:14 | Constant: 0 | 0 | 86 | 86 | -| test.c:85:8:85:13 | CompareEQ: ... == ... | test.c:75:14:75:14 | Constant: 0 | == | test.c:75:9:75:9 | Load: x | 0 | 85 | 85 | -| test.c:85:8:85:13 | CompareEQ: ... == ... | test.c:75:14:75:14 | Constant: 0 | == | test.c:75:9:75:9 | Load: x | 0 | 86 | 86 | | test.c:85:8:85:13 | CompareEQ: ... == ... | test.c:85:8:85:8 | Load: x | == | test.c:85:13:85:13 | Constant: 0 | 0 | 85 | 85 | | test.c:85:8:85:13 | CompareEQ: ... == ... | test.c:85:8:85:8 | Load: x | == | test.c:85:13:85:13 | Constant: 0 | 0 | 86 | 86 | | test.c:85:8:85:13 | CompareEQ: ... == ... | test.c:85:13:85:13 | Constant: 0 | == | test.c:85:8:85:8 | Load: x | 0 | 85 | 85 | @@ -1221,14 +1003,9 @@ irGuardsEnsure irGuardsEnsure_const | test.c:7:9:7:13 | CompareGT: ... > ... | test.c:7:9:7:9 | Load: x | < | 1 | 11 | 11 | | test.c:7:9:7:13 | CompareGT: ... > ... | test.c:7:9:7:9 | Load: x | >= | 1 | 8 | 8 | -| test.c:7:9:7:13 | CompareGT: ... > ... | test.c:7:9:7:13 | CompareGT: ... > ... | != | 0 | 8 | 8 | -| test.c:7:9:7:13 | CompareGT: ... > ... | test.c:7:9:7:13 | CompareGT: ... > ... | == | 0 | 11 | 11 | | test.c:17:8:17:12 | CompareLT: ... < ... | test.c:17:8:17:8 | Load: x | < | 0 | 17 | 17 | | test.c:17:8:17:12 | CompareLT: ... < ... | test.c:17:8:17:8 | Load: x | < | 0 | 18 | 18 | -| test.c:17:8:17:12 | CompareLT: ... < ... | test.c:17:8:17:12 | CompareLT: ... < ... | != | 0 | 17 | 17 | -| test.c:17:8:17:12 | CompareLT: ... < ... | test.c:17:8:17:12 | CompareLT: ... < ... | != | 0 | 18 | 18 | | test.c:17:17:17:21 | CompareGT: ... > ... | test.c:17:17:17:17 | Load: y | >= | 2 | 18 | 18 | -| test.c:17:17:17:21 | CompareGT: ... > ... | test.c:17:17:17:21 | CompareGT: ... > ... | != | 0 | 18 | 18 | | test.c:26:11:26:15 | CompareGT: ... > ... | test.c:26:11:26:11 | Load: x | < | 1 | 2 | 2 | | test.c:26:11:26:15 | CompareGT: ... > ... | test.c:26:11:26:11 | Load: x | < | 1 | 31 | 31 | | test.c:26:11:26:15 | CompareGT: ... > ... | test.c:26:11:26:11 | Load: x | < | 1 | 34 | 34 | @@ -1244,21 +1021,6 @@ irGuardsEnsure_const | test.c:26:11:26:15 | CompareGT: ... > ... | test.c:26:11:26:11 | Load: x | < | 1 | 59 | 59 | | test.c:26:11:26:15 | CompareGT: ... > ... | test.c:26:11:26:11 | Load: x | < | 1 | 62 | 62 | | test.c:26:11:26:15 | CompareGT: ... > ... | test.c:26:11:26:11 | Load: x | >= | 1 | 27 | 27 | -| test.c:26:11:26:15 | CompareGT: ... > ... | test.c:26:11:26:15 | CompareGT: ... > ... | != | 0 | 27 | 27 | -| test.c:26:11:26:15 | CompareGT: ... > ... | test.c:26:11:26:15 | CompareGT: ... > ... | == | 0 | 2 | 2 | -| test.c:26:11:26:15 | CompareGT: ... > ... | test.c:26:11:26:15 | CompareGT: ... > ... | == | 0 | 31 | 31 | -| test.c:26:11:26:15 | CompareGT: ... > ... | test.c:26:11:26:15 | CompareGT: ... > ... | == | 0 | 34 | 34 | -| test.c:26:11:26:15 | CompareGT: ... > ... | test.c:26:11:26:15 | CompareGT: ... > ... | == | 0 | 35 | 35 | -| test.c:26:11:26:15 | CompareGT: ... > ... | test.c:26:11:26:15 | CompareGT: ... > ... | == | 0 | 39 | 39 | -| test.c:26:11:26:15 | CompareGT: ... > ... | test.c:26:11:26:15 | CompareGT: ... > ... | == | 0 | 42 | 42 | -| test.c:26:11:26:15 | CompareGT: ... > ... | test.c:26:11:26:15 | CompareGT: ... > ... | == | 0 | 43 | 43 | -| test.c:26:11:26:15 | CompareGT: ... > ... | test.c:26:11:26:15 | CompareGT: ... > ... | == | 0 | 45 | 45 | -| test.c:26:11:26:15 | CompareGT: ... > ... | test.c:26:11:26:15 | CompareGT: ... > ... | == | 0 | 46 | 46 | -| test.c:26:11:26:15 | CompareGT: ... > ... | test.c:26:11:26:15 | CompareGT: ... > ... | == | 0 | 52 | 52 | -| test.c:26:11:26:15 | CompareGT: ... > ... | test.c:26:11:26:15 | CompareGT: ... > ... | == | 0 | 56 | 56 | -| test.c:26:11:26:15 | CompareGT: ... > ... | test.c:26:11:26:15 | CompareGT: ... > ... | == | 0 | 58 | 58 | -| test.c:26:11:26:15 | CompareGT: ... > ... | test.c:26:11:26:15 | CompareGT: ... > ... | == | 0 | 59 | 59 | -| test.c:26:11:26:15 | CompareGT: ... > ... | test.c:26:11:26:15 | CompareGT: ... > ... | == | 0 | 62 | 62 | | test.c:34:16:34:21 | CompareLT: ... < ... | test.c:34:16:34:16 | Load: j | < | 10 | 35 | 35 | | test.c:34:16:34:21 | CompareLT: ... < ... | test.c:34:16:34:16 | Load: j | >= | 10 | 2 | 2 | | test.c:34:16:34:21 | CompareLT: ... < ... | test.c:34:16:34:16 | Load: j | >= | 10 | 39 | 39 | @@ -1271,58 +1033,22 @@ irGuardsEnsure_const | test.c:34:16:34:21 | CompareLT: ... < ... | test.c:34:16:34:16 | Load: j | >= | 10 | 58 | 58 | | test.c:34:16:34:21 | CompareLT: ... < ... | test.c:34:16:34:16 | Load: j | >= | 10 | 59 | 59 | | test.c:34:16:34:21 | CompareLT: ... < ... | test.c:34:16:34:16 | Load: j | >= | 10 | 62 | 62 | -| test.c:34:16:34:21 | CompareLT: ... < ... | test.c:34:16:34:21 | CompareLT: ... < ... | != | 0 | 35 | 35 | -| test.c:34:16:34:21 | CompareLT: ... < ... | test.c:34:16:34:21 | CompareLT: ... < ... | == | 0 | 2 | 2 | -| test.c:34:16:34:21 | CompareLT: ... < ... | test.c:34:16:34:21 | CompareLT: ... < ... | == | 0 | 39 | 39 | -| test.c:34:16:34:21 | CompareLT: ... < ... | test.c:34:16:34:21 | CompareLT: ... < ... | == | 0 | 42 | 42 | -| test.c:34:16:34:21 | CompareLT: ... < ... | test.c:34:16:34:21 | CompareLT: ... < ... | == | 0 | 43 | 43 | -| test.c:34:16:34:21 | CompareLT: ... < ... | test.c:34:16:34:21 | CompareLT: ... < ... | == | 0 | 45 | 45 | -| test.c:34:16:34:21 | CompareLT: ... < ... | test.c:34:16:34:21 | CompareLT: ... < ... | == | 0 | 46 | 46 | -| test.c:34:16:34:21 | CompareLT: ... < ... | test.c:34:16:34:21 | CompareLT: ... < ... | == | 0 | 52 | 52 | -| test.c:34:16:34:21 | CompareLT: ... < ... | test.c:34:16:34:21 | CompareLT: ... < ... | == | 0 | 56 | 56 | -| test.c:34:16:34:21 | CompareLT: ... < ... | test.c:34:16:34:21 | CompareLT: ... < ... | == | 0 | 58 | 58 | -| test.c:34:16:34:21 | CompareLT: ... < ... | test.c:34:16:34:21 | CompareLT: ... < ... | == | 0 | 59 | 59 | -| test.c:34:16:34:21 | CompareLT: ... < ... | test.c:34:16:34:21 | CompareLT: ... < ... | == | 0 | 62 | 62 | | test.c:42:16:42:21 | CompareLT: ... < ... | test.c:42:16:42:16 | Load: j | < | 10 | 43 | 43 | | test.c:42:16:42:21 | CompareLT: ... < ... | test.c:42:16:42:16 | Load: j | < | 10 | 45 | 45 | | test.c:42:16:42:21 | CompareLT: ... < ... | test.c:42:16:42:16 | Load: j | < | 10 | 46 | 46 | | test.c:42:16:42:21 | CompareLT: ... < ... | test.c:42:16:42:16 | Load: j | < | 10 | 52 | 52 | -| test.c:42:16:42:21 | CompareLT: ... < ... | test.c:42:16:42:21 | CompareLT: ... < ... | != | 0 | 43 | 43 | -| test.c:42:16:42:21 | CompareLT: ... < ... | test.c:42:16:42:21 | CompareLT: ... < ... | != | 0 | 45 | 45 | -| test.c:42:16:42:21 | CompareLT: ... < ... | test.c:42:16:42:21 | CompareLT: ... < ... | != | 0 | 46 | 46 | -| test.c:42:16:42:21 | CompareLT: ... < ... | test.c:42:16:42:21 | CompareLT: ... < ... | != | 0 | 52 | 52 | | test.c:44:12:44:16 | CompareGT: ... > ... | test.c:44:12:44:12 | Load: z | < | 1 | 52 | 52 | | test.c:44:12:44:16 | CompareGT: ... > ... | test.c:44:12:44:12 | Load: z | >= | 1 | 45 | 45 | | test.c:44:12:44:16 | CompareGT: ... > ... | test.c:44:12:44:12 | Load: z | >= | 1 | 46 | 46 | -| test.c:44:12:44:16 | CompareGT: ... > ... | test.c:44:12:44:16 | CompareGT: ... > ... | != | 0 | 45 | 45 | -| test.c:44:12:44:16 | CompareGT: ... > ... | test.c:44:12:44:16 | CompareGT: ... > ... | != | 0 | 46 | 46 | -| test.c:44:12:44:16 | CompareGT: ... > ... | test.c:44:12:44:16 | CompareGT: ... > ... | == | 0 | 52 | 52 | | test.c:45:16:45:20 | CompareGT: ... > ... | test.c:45:16:45:16 | Load: y | >= | 1 | 46 | 46 | -| test.c:45:16:45:20 | CompareGT: ... > ... | test.c:45:16:45:20 | CompareGT: ... > ... | != | 0 | 46 | 46 | | test.c:58:9:58:14 | CompareEQ: ... == ... | test.c:58:9:58:9 | Load: x | != | 0 | 58 | 58 | | test.c:58:9:58:14 | CompareEQ: ... == ... | test.c:58:9:58:9 | Load: x | != | 0 | 62 | 62 | -| test.c:58:9:58:14 | CompareEQ: ... == ... | test.c:58:9:58:14 | CompareEQ: ... == ... | == | 0 | 58 | 58 | -| test.c:58:9:58:14 | CompareEQ: ... == ... | test.c:58:9:58:14 | CompareEQ: ... == ... | == | 0 | 62 | 62 | | test.c:58:19:58:23 | CompareLT: ... < ... | test.c:58:19:58:19 | Load: y | >= | 0 | 62 | 62 | -| test.c:58:19:58:23 | CompareLT: ... < ... | test.c:58:19:58:23 | CompareLT: ... < ... | == | 0 | 62 | 62 | | test.c:75:9:75:14 | CompareEQ: ... == ... | test.c:75:9:75:9 | Load: x | != | 0 | 79 | 79 | | test.c:75:9:75:14 | CompareEQ: ... == ... | test.c:75:9:75:9 | Load: x | == | 0 | 76 | 76 | -| test.c:75:9:75:14 | CompareEQ: ... == ... | test.c:75:9:75:14 | CompareEQ: ... == ... | != | 0 | 76 | 76 | -| test.c:75:9:75:14 | CompareEQ: ... == ... | test.c:75:9:75:14 | CompareEQ: ... == ... | == | 0 | 79 | 79 | -| test.c:75:9:75:14 | CompareEQ: ... == ... | test.c:85:8:85:8 | Load: x | != | 0 | 79 | 79 | -| test.c:75:9:75:14 | CompareEQ: ... == ... | test.c:85:8:85:8 | Load: x | == | 0 | 76 | 76 | -| test.c:75:9:75:14 | CompareEQ: ... == ... | test.c:85:8:85:13 | CompareEQ: ... == ... | != | 0 | 76 | 76 | -| test.c:75:9:75:14 | CompareEQ: ... == ... | test.c:85:8:85:13 | CompareEQ: ... == ... | == | 0 | 79 | 79 | -| test.c:85:8:85:13 | CompareEQ: ... == ... | test.c:75:9:75:9 | Load: x | == | 0 | 85 | 85 | -| test.c:85:8:85:13 | CompareEQ: ... == ... | test.c:75:9:75:9 | Load: x | == | 0 | 86 | 86 | -| test.c:85:8:85:13 | CompareEQ: ... == ... | test.c:75:9:75:14 | CompareEQ: ... == ... | != | 0 | 85 | 85 | -| test.c:85:8:85:13 | CompareEQ: ... == ... | test.c:75:9:75:14 | CompareEQ: ... == ... | != | 0 | 86 | 86 | | test.c:85:8:85:13 | CompareEQ: ... == ... | test.c:85:8:85:8 | Load: x | == | 0 | 85 | 85 | | test.c:85:8:85:13 | CompareEQ: ... == ... | test.c:85:8:85:8 | Load: x | == | 0 | 86 | 86 | -| test.c:85:8:85:13 | CompareEQ: ... == ... | test.c:85:8:85:13 | CompareEQ: ... == ... | != | 0 | 85 | 85 | -| test.c:85:8:85:13 | CompareEQ: ... == ... | test.c:85:8:85:13 | CompareEQ: ... == ... | != | 0 | 86 | 86 | | test.c:85:18:85:23 | CompareNE: ... != ... | test.c:85:18:85:18 | Load: y | != | 0 | 86 | 86 | -| test.c:85:18:85:23 | CompareNE: ... != ... | test.c:85:18:85:23 | CompareNE: ... != ... | != | 0 | 86 | 86 | | test.c:94:11:94:16 | CompareNE: ... != ... | test.c:94:11:94:11 | Load: x | != | 0 | 95 | 95 | | test.c:94:11:94:16 | CompareNE: ... != ... | test.c:94:11:94:11 | Load: x | == | 0 | 70 | 70 | | test.c:94:11:94:16 | CompareNE: ... != ... | test.c:94:11:94:11 | Load: x | == | 0 | 99 | 99 | @@ -1332,78 +1058,34 @@ irGuardsEnsure_const | test.c:94:11:94:16 | CompareNE: ... != ... | test.c:94:11:94:11 | Load: x | == | 0 | 109 | 109 | | test.c:94:11:94:16 | CompareNE: ... != ... | test.c:94:11:94:11 | Load: x | == | 0 | 110 | 110 | | test.c:94:11:94:16 | CompareNE: ... != ... | test.c:94:11:94:11 | Load: x | == | 0 | 113 | 113 | -| test.c:94:11:94:16 | CompareNE: ... != ... | test.c:94:11:94:16 | CompareNE: ... != ... | != | 0 | 95 | 95 | -| test.c:94:11:94:16 | CompareNE: ... != ... | test.c:94:11:94:16 | CompareNE: ... != ... | == | 0 | 70 | 70 | -| test.c:94:11:94:16 | CompareNE: ... != ... | test.c:94:11:94:16 | CompareNE: ... != ... | == | 0 | 99 | 99 | -| test.c:94:11:94:16 | CompareNE: ... != ... | test.c:94:11:94:16 | CompareNE: ... != ... | == | 0 | 102 | 102 | -| test.c:94:11:94:16 | CompareNE: ... != ... | test.c:94:11:94:16 | CompareNE: ... != ... | == | 0 | 103 | 103 | -| test.c:94:11:94:16 | CompareNE: ... != ... | test.c:94:11:94:16 | CompareNE: ... != ... | == | 0 | 107 | 107 | -| test.c:94:11:94:16 | CompareNE: ... != ... | test.c:94:11:94:16 | CompareNE: ... != ... | == | 0 | 109 | 109 | -| test.c:94:11:94:16 | CompareNE: ... != ... | test.c:94:11:94:16 | CompareNE: ... != ... | == | 0 | 110 | 110 | -| test.c:94:11:94:16 | CompareNE: ... != ... | test.c:94:11:94:16 | CompareNE: ... != ... | == | 0 | 113 | 113 | | test.c:102:16:102:21 | CompareLT: ... < ... | test.c:102:16:102:16 | Load: j | < | 10 | 103 | 103 | | test.c:102:16:102:21 | CompareLT: ... < ... | test.c:102:16:102:16 | Load: j | >= | 10 | 70 | 70 | | test.c:102:16:102:21 | CompareLT: ... < ... | test.c:102:16:102:16 | Load: j | >= | 10 | 107 | 107 | | test.c:102:16:102:21 | CompareLT: ... < ... | test.c:102:16:102:16 | Load: j | >= | 10 | 109 | 109 | | test.c:102:16:102:21 | CompareLT: ... < ... | test.c:102:16:102:16 | Load: j | >= | 10 | 110 | 110 | | test.c:102:16:102:21 | CompareLT: ... < ... | test.c:102:16:102:16 | Load: j | >= | 10 | 113 | 113 | -| test.c:102:16:102:21 | CompareLT: ... < ... | test.c:102:16:102:21 | CompareLT: ... < ... | != | 0 | 103 | 103 | -| test.c:102:16:102:21 | CompareLT: ... < ... | test.c:102:16:102:21 | CompareLT: ... < ... | == | 0 | 70 | 70 | -| test.c:102:16:102:21 | CompareLT: ... < ... | test.c:102:16:102:21 | CompareLT: ... < ... | == | 0 | 107 | 107 | -| test.c:102:16:102:21 | CompareLT: ... < ... | test.c:102:16:102:21 | CompareLT: ... < ... | == | 0 | 109 | 109 | -| test.c:102:16:102:21 | CompareLT: ... < ... | test.c:102:16:102:21 | CompareLT: ... < ... | == | 0 | 110 | 110 | -| test.c:102:16:102:21 | CompareLT: ... < ... | test.c:102:16:102:21 | CompareLT: ... < ... | == | 0 | 113 | 113 | | test.c:109:9:109:14 | CompareEQ: ... == ... | test.c:109:9:109:9 | Load: x | != | 0 | 109 | 109 | | test.c:109:9:109:14 | CompareEQ: ... == ... | test.c:109:9:109:9 | Load: x | != | 0 | 113 | 113 | -| test.c:109:9:109:14 | CompareEQ: ... == ... | test.c:109:9:109:14 | CompareEQ: ... == ... | == | 0 | 109 | 109 | -| test.c:109:9:109:14 | CompareEQ: ... == ... | test.c:109:9:109:14 | CompareEQ: ... == ... | == | 0 | 113 | 113 | | test.c:109:19:109:23 | CompareLT: ... < ... | test.c:109:19:109:19 | Load: y | >= | 0 | 113 | 113 | -| test.c:109:19:109:23 | CompareLT: ... < ... | test.c:109:19:109:23 | CompareLT: ... < ... | == | 0 | 113 | 113 | | test.c:126:7:126:7 | Constant: 1 | test.c:126:7:126:7 | Constant: 1 | != | 0 | 126 | 126 | | test.c:126:7:126:7 | Constant: 1 | test.c:126:7:126:7 | Constant: 1 | != | 0 | 127 | 127 | | test.c:126:7:126:7 | Constant: 1 | test.c:126:7:126:7 | Constant: 1 | != | 0 | 131 | 131 | | test.c:126:7:126:7 | Constant: 1 | test.c:126:7:126:7 | Constant: 1 | != | 0 | 132 | 132 | | test.c:126:7:126:7 | Constant: 1 | test.c:126:7:126:7 | Constant: 1 | != | 0 | 134 | 134 | -| test.c:126:7:126:7 | Constant: 1 | test.c:127:5:127:9 | Store: ... = ... | != | 0 | 126 | 126 | -| test.c:126:7:126:7 | Constant: 1 | test.c:127:5:127:9 | Store: ... = ... | != | 0 | 127 | 127 | -| test.c:126:7:126:7 | Constant: 1 | test.c:127:5:127:9 | Store: ... = ... | != | 0 | 131 | 131 | -| test.c:126:7:126:7 | Constant: 1 | test.c:127:5:127:9 | Store: ... = ... | != | 0 | 132 | 132 | -| test.c:126:7:126:7 | Constant: 1 | test.c:127:5:127:9 | Store: ... = ... | != | 0 | 134 | 134 | -| test.c:126:7:126:7 | Constant: 1 | test.c:127:9:127:9 | Constant: 1 | != | 0 | 126 | 126 | -| test.c:126:7:126:7 | Constant: 1 | test.c:127:9:127:9 | Constant: 1 | != | 0 | 127 | 127 | -| test.c:126:7:126:7 | Constant: 1 | test.c:127:9:127:9 | Constant: 1 | != | 0 | 131 | 131 | -| test.c:126:7:126:7 | Constant: 1 | test.c:127:9:127:9 | Constant: 1 | != | 0 | 132 | 132 | -| test.c:126:7:126:7 | Constant: 1 | test.c:127:9:127:9 | Constant: 1 | != | 0 | 134 | 134 | | test.c:126:12:126:26 | Call: call to test3_condition | test.c:126:12:126:26 | Call: call to test3_condition | != | 0 | 127 | 127 | | test.c:131:7:131:7 | Load: b | test.c:131:7:131:7 | Load: b | != | 0 | 132 | 132 | -| test.c:131:7:131:7 | Load: b | test.c:131:7:131:7 | Phi: b | != | 0 | 132 | 132 | | test.c:137:7:137:7 | Constant: 0 | test.c:137:7:137:7 | Constant: 0 | == | 0 | 142 | 142 | | test.c:146:7:146:8 | LogicalNot: ! ... | test.c:146:7:146:8 | LogicalNot: ! ... | != | 0 | 147 | 147 | -| test.c:146:8:146:8 | Load: x | test.c:145:16:145:16 | InitializeParameter: x | == | 0 | 147 | 147 | | test.c:146:8:146:8 | Load: x | test.c:146:8:146:8 | Load: x | == | 0 | 147 | 147 | -| test.c:152:10:152:10 | Load: x | test.c:151:16:151:16 | InitializeParameter: x | != | 0 | 152 | 152 | | test.c:152:10:152:10 | Load: x | test.c:152:10:152:10 | Load: x | != | 0 | 152 | 152 | -| test.c:152:15:152:15 | Load: y | test.c:151:23:151:23 | InitializeParameter: y | != | 0 | 152 | 152 | | test.c:152:15:152:15 | Load: y | test.c:152:15:152:15 | Load: y | != | 0 | 152 | 152 | -| test.c:156:9:156:19 | CompareEQ: ... == ... | test.c:156:9:156:19 | CompareEQ: ... == ... | != | 0 | 156 | 157 | -| test.c:159:9:159:19 | CompareEQ: ... == ... | test.c:159:9:159:19 | CompareEQ: ... == ... | != | 0 | 159 | 160 | -| test.c:162:9:162:18 | CompareLT: ... < ... | test.c:162:9:162:18 | CompareLT: ... < ... | != | 0 | 162 | 163 | -| test.c:165:9:165:18 | CompareLT: ... < ... | test.c:165:9:165:18 | CompareLT: ... < ... | != | 0 | 165 | 166 | | test.c:175:13:175:32 | CompareEQ: ... == ... | test.c:175:13:175:15 | Call: call to foo | != | 0 | 175 | 175 | | test.c:175:13:175:32 | CompareEQ: ... == ... | test.c:175:13:175:15 | Call: call to foo | == | 0 | 175 | 175 | -| test.c:175:13:175:32 | CompareEQ: ... == ... | test.c:175:13:175:32 | CompareEQ: ... == ... | != | 0 | 175 | 175 | -| test.c:175:13:175:32 | CompareEQ: ... == ... | test.c:175:13:175:32 | CompareEQ: ... == ... | == | 0 | 175 | 175 | -| test.c:181:9:181:9 | Load: x | test.c:180:20:180:20 | InitializeParameter: x | != | 0 | 182 | 182 | -| test.c:181:9:181:9 | Load: x | test.c:180:20:180:20 | InitializeParameter: x | == | 0 | 184 | 184 | | test.c:181:9:181:9 | Load: x | test.c:181:9:181:9 | Load: x | != | 0 | 182 | 182 | | test.c:181:9:181:9 | Load: x | test.c:181:9:181:9 | Load: x | == | 0 | 184 | 184 | | test.cpp:18:8:18:12 | CompareNE: (bool)... | test.cpp:18:8:18:10 | Call: call to get | != | 0 | 19 | 19 | -| test.cpp:18:8:18:12 | CompareNE: (bool)... | test.cpp:18:8:18:12 | CompareNE: (bool)... | != | 0 | 19 | 19 | | test.cpp:31:7:31:13 | CompareEQ: ... == ... | test.cpp:31:7:31:7 | Load: x | != | -1 | 34 | 34 | | test.cpp:31:7:31:13 | CompareEQ: ... == ... | test.cpp:31:7:31:7 | Load: x | == | -1 | 30 | 30 | | test.cpp:31:7:31:13 | CompareEQ: ... == ... | test.cpp:31:7:31:7 | Load: x | == | -1 | 32 | 32 | -| test.cpp:31:7:31:13 | CompareEQ: ... == ... | test.cpp:31:7:31:13 | CompareEQ: ... == ... | != | 0 | 30 | 30 | -| test.cpp:31:7:31:13 | CompareEQ: ... == ... | test.cpp:31:7:31:13 | CompareEQ: ... == ... | != | 0 | 32 | 32 | -| test.cpp:31:7:31:13 | CompareEQ: ... == ... | test.cpp:31:7:31:13 | CompareEQ: ... == ... | == | 0 | 34 | 34 | | test.cpp:42:13:42:20 | Call: call to getABool | test.cpp:42:13:42:20 | Call: call to getABool | != | 0 | 44 | 44 | | test.cpp:42:13:42:20 | Call: call to getABool | test.cpp:42:13:42:20 | Call: call to getABool | == | 0 | 53 | 53 | diff --git a/cpp/ql/test/library-tests/controlflow/guards/GuardsCompare.expected b/cpp/ql/test/library-tests/controlflow/guards/GuardsCompare.expected index 4f44591e0b8..8480a1f8613 100644 --- a/cpp/ql/test/library-tests/controlflow/guards/GuardsCompare.expected +++ b/cpp/ql/test/library-tests/controlflow/guards/GuardsCompare.expected @@ -1,7 +1,5 @@ | 7 | 0 < x+0 when ... > ... is true | | 7 | 0 >= x+0 when ... > ... is false | -| 7 | ... > ... != 0 when ... > ... is true | -| 7 | ... > ... == 0 when ... > ... is false | | 7 | x < 0+1 when ... > ... is false | | 7 | x < 1 when ... > ... is false | | 7 | x >= 0+1 when ... > ... is true | @@ -12,12 +10,6 @@ | 17 | 1 < y+0 when ... && ... is true | | 17 | 1 < y+0 when ... > ... is true | | 17 | 1 >= y+0 when ... > ... is false | -| 17 | ... < ... != 0 when ... && ... is true | -| 17 | ... < ... != 0 when ... < ... is true | -| 17 | ... < ... == 0 when ... < ... is false | -| 17 | ... > ... != 0 when ... && ... is true | -| 17 | ... > ... != 0 when ... > ... is true | -| 17 | ... > ... == 0 when ... > ... is false | | 17 | x < 0 when ... && ... is true | | 17 | x < 0 when ... < ... is true | | 17 | x < 0+0 when ... && ... is true | @@ -34,32 +26,24 @@ | 18 | call to get == 0 when call to get is false | | 26 | 0 < x+0 when ... > ... is true | | 26 | 0 >= x+0 when ... > ... is false | -| 26 | ... > ... != 0 when ... > ... is true | -| 26 | ... > ... == 0 when ... > ... is false | | 26 | x < 0+1 when ... > ... is false | | 26 | x < 1 when ... > ... is false | | 26 | x >= 0+1 when ... > ... is true | | 26 | x >= 1 when ... > ... is true | | 31 | - ... != x+0 when ... == ... is false | | 31 | - ... == x+0 when ... == ... is true | -| 31 | ... == ... != 0 when ... == ... is true | -| 31 | ... == ... == 0 when ... == ... is false | | 31 | x != -1 when ... == ... is false | | 31 | x != - ...+0 when ... == ... is false | | 31 | x == -1 when ... == ... is true | | 31 | x == - ...+0 when ... == ... is true | | 34 | 10 < j+1 when ... < ... is false | | 34 | 10 >= j+1 when ... < ... is true | -| 34 | ... < ... != 0 when ... < ... is true | -| 34 | ... < ... == 0 when ... < ... is false | | 34 | j < 10 when ... < ... is true | | 34 | j < 10+0 when ... < ... is true | | 34 | j >= 10 when ... < ... is false | | 34 | j >= 10+0 when ... < ... is false | | 42 | 10 < j+1 when ... < ... is false | | 42 | 10 >= j+1 when ... < ... is true | -| 42 | ... < ... != 0 when ... < ... is true | -| 42 | ... < ... == 0 when ... < ... is false | | 42 | call to getABool != 0 when call to getABool is true | | 42 | call to getABool == 0 when call to getABool is false | | 42 | j < 10 when ... < ... is true | @@ -68,16 +52,12 @@ | 42 | j >= 10+0 when ... < ... is false | | 44 | 0 < z+0 when ... > ... is true | | 44 | 0 >= z+0 when ... > ... is false | -| 44 | ... > ... != 0 when ... > ... is true | -| 44 | ... > ... == 0 when ... > ... is false | | 44 | z < 0+1 when ... > ... is false | | 44 | z < 1 when ... > ... is false | | 44 | z >= 0+1 when ... > ... is true | | 44 | z >= 1 when ... > ... is true | | 45 | 0 < y+0 when ... > ... is true | | 45 | 0 >= y+0 when ... > ... is false | -| 45 | ... > ... != 0 when ... > ... is true | -| 45 | ... > ... == 0 when ... > ... is false | | 45 | y < 0+1 when ... > ... is false | | 45 | y < 1 when ... > ... is false | | 45 | y >= 0+1 when ... > ... is true | @@ -88,12 +68,6 @@ | 58 | 0 < y+1 when ... \|\| ... is false | | 58 | 0 == x+0 when ... == ... is true | | 58 | 0 >= y+1 when ... < ... is true | -| 58 | ... < ... != 0 when ... < ... is true | -| 58 | ... < ... == 0 when ... < ... is false | -| 58 | ... < ... == 0 when ... \|\| ... is false | -| 58 | ... == ... != 0 when ... == ... is true | -| 58 | ... == ... == 0 when ... == ... is false | -| 58 | ... == ... == 0 when ... \|\| ... is false | | 58 | x != 0 when ... == ... is false | | 58 | x != 0 when ... \|\| ... is false | | 58 | x != 0+0 when ... == ... is false | @@ -115,8 +89,6 @@ | 74 | i >= 11 when i is Case[11..20] | | 75 | 0 != x+0 when ... == ... is false | | 75 | 0 == x+0 when ... == ... is true | -| 75 | ... == ... != 0 when ... == ... is true | -| 75 | ... == ... == 0 when ... == ... is false | | 75 | x != 0 when ... == ... is false | | 75 | x != 0+0 when ... == ... is false | | 75 | x == 0 when ... == ... is true | @@ -127,12 +99,6 @@ | 85 | 0 == x+0 when ... && ... is true | | 85 | 0 == x+0 when ... == ... is true | | 85 | 0 == y+0 when ... != ... is false | -| 85 | ... != ... != 0 when ... != ... is true | -| 85 | ... != ... != 0 when ... && ... is true | -| 85 | ... != ... == 0 when ... != ... is false | -| 85 | ... == ... != 0 when ... && ... is true | -| 85 | ... == ... != 0 when ... == ... is true | -| 85 | ... == ... == 0 when ... == ... is false | | 85 | x != 0 when ... == ... is false | | 85 | x != 0+0 when ... == ... is false | | 85 | x == 0 when ... && ... is true | @@ -149,26 +115,18 @@ | 93 | c == 0 when c is false | | 94 | 0 != x+0 when ... != ... is true | | 94 | 0 == x+0 when ... != ... is false | -| 94 | ... != ... != 0 when ... != ... is true | -| 94 | ... != ... == 0 when ... != ... is false | | 94 | x != 0 when ... != ... is true | | 94 | x != 0+0 when ... != ... is true | | 94 | x == 0 when ... != ... is false | | 94 | x == 0+0 when ... != ... is false | -| 99 | f != 0 when f is true | -| 99 | f == 0 when f is false | | 102 | 10 < j+1 when ... < ... is false | | 102 | 10 >= j+1 when ... < ... is true | -| 102 | ... < ... != 0 when ... < ... is true | -| 102 | ... < ... == 0 when ... < ... is false | | 102 | j < 10 when ... < ... is true | | 102 | j < 10+0 when ... < ... is true | | 102 | j >= 10 when ... < ... is false | | 102 | j >= 10+0 when ... < ... is false | | 105 | 0.0 != f+0 when ... != ... is true | | 105 | 0.0 == f+0 when ... != ... is false | -| 105 | ... != ... != 0 when ... != ... is true | -| 105 | ... != ... == 0 when ... != ... is false | | 105 | f != 0.0+0 when ... != ... is true | | 105 | f == 0.0+0 when ... != ... is false | | 109 | 0 != x+0 when ... == ... is false | @@ -177,12 +135,6 @@ | 109 | 0 < y+1 when ... \|\| ... is false | | 109 | 0 == x+0 when ... == ... is true | | 109 | 0 >= y+1 when ... < ... is true | -| 109 | ... < ... != 0 when ... < ... is true | -| 109 | ... < ... == 0 when ... < ... is false | -| 109 | ... < ... == 0 when ... \|\| ... is false | -| 109 | ... == ... != 0 when ... == ... is true | -| 109 | ... == ... == 0 when ... == ... is false | -| 109 | ... == ... == 0 when ... \|\| ... is false | | 109 | x != 0 when ... == ... is false | | 109 | x != 0 when ... \|\| ... is false | | 109 | x != 0+0 when ... == ... is false | @@ -197,8 +149,6 @@ | 109 | y >= 0+0 when ... \|\| ... is false | | 111 | 0.0 != i+0 when ... != ... is true | | 111 | 0.0 == i+0 when ... != ... is false | -| 111 | ... != ... != 0 when ... != ... is true | -| 111 | ... != ... == 0 when ... != ... is false | | 111 | i != 0.0+0 when ... != ... is true | | 111 | i == 0.0+0 when ... != ... is false | | 122 | b != 0 when b is true | @@ -216,8 +166,6 @@ | 126 | call to test3_condition == 0 when call to test3_condition is false | | 131 | ... + ... != a+0 when call to __builtin_expect is false | | 131 | ... + ... == a+0 when call to __builtin_expect is true | -| 131 | ... == ... != 0 when call to __builtin_expect is true | -| 131 | ... == ... == 0 when call to __builtin_expect is false | | 131 | a != ... + ...+0 when call to __builtin_expect is false | | 131 | a != b+42 when call to __builtin_expect is false | | 131 | a == ... + ...+0 when call to __builtin_expect is true | @@ -228,8 +176,6 @@ | 131 | b == a+-42 when call to __builtin_expect is true | | 131 | call to __builtin_expect != 0 when call to __builtin_expect is true | | 131 | call to __builtin_expect == 0 when call to __builtin_expect is false | -| 135 | ... != ... != 0 when call to __builtin_expect is true | -| 135 | ... != ... == 0 when call to __builtin_expect is false | | 135 | ... + ... != a+0 when call to __builtin_expect is true | | 135 | ... + ... == a+0 when call to __builtin_expect is false | | 135 | a != ... + ...+0 when call to __builtin_expect is true | @@ -244,8 +190,6 @@ | 137 | 0 == 0 when 0 is false | | 141 | 42 != a+0 when call to __builtin_expect is false | | 141 | 42 == a+0 when call to __builtin_expect is true | -| 141 | ... == ... != 0 when call to __builtin_expect is true | -| 141 | ... == ... == 0 when call to __builtin_expect is false | | 141 | a != 42 when call to __builtin_expect is false | | 141 | a != 42+0 when call to __builtin_expect is false | | 141 | a == 42 when call to __builtin_expect is true | @@ -254,8 +198,6 @@ | 141 | call to __builtin_expect == 0 when call to __builtin_expect is false | | 145 | 42 != a+0 when call to __builtin_expect is true | | 145 | 42 == a+0 when call to __builtin_expect is false | -| 145 | ... != ... != 0 when call to __builtin_expect is true | -| 145 | ... != ... == 0 when call to __builtin_expect is false | | 145 | a != 42 when call to __builtin_expect is true | | 145 | a != 42+0 when call to __builtin_expect is true | | 145 | a == 42 when call to __builtin_expect is false | diff --git a/cpp/ql/test/library-tests/controlflow/guards/GuardsEnsure.expected b/cpp/ql/test/library-tests/controlflow/guards/GuardsEnsure.expected index c41cdfd6063..c520b48f94e 100644 --- a/cpp/ql/test/library-tests/controlflow/guards/GuardsEnsure.expected +++ b/cpp/ql/test/library-tests/controlflow/guards/GuardsEnsure.expected @@ -99,20 +99,10 @@ binary | test.c:75:9:75:14 | ... == ... | test.c:75:9:75:9 | x | == | test.c:75:14:75:14 | 0 | 0 | 75 | 77 | | test.c:75:9:75:14 | ... == ... | test.c:75:14:75:14 | 0 | != | test.c:75:9:75:9 | x | 0 | 78 | 79 | | test.c:75:9:75:14 | ... == ... | test.c:75:14:75:14 | 0 | == | test.c:75:9:75:9 | x | 0 | 75 | 77 | -| test.c:75:9:75:14 | ... == ... | test.c:85:8:85:8 | x | != | test.c:85:13:85:13 | 0 | 0 | 78 | 79 | -| test.c:75:9:75:14 | ... == ... | test.c:85:8:85:8 | x | == | test.c:85:13:85:13 | 0 | 0 | 75 | 77 | -| test.c:75:9:75:14 | ... == ... | test.c:85:13:85:13 | 0 | != | test.c:85:8:85:8 | x | 0 | 78 | 79 | -| test.c:75:9:75:14 | ... == ... | test.c:85:13:85:13 | 0 | == | test.c:85:8:85:8 | x | 0 | 75 | 77 | -| test.c:85:8:85:13 | ... == ... | test.c:75:9:75:9 | x | == | test.c:75:14:75:14 | 0 | 0 | 85 | 85 | -| test.c:85:8:85:13 | ... == ... | test.c:75:9:75:9 | x | == | test.c:75:14:75:14 | 0 | 0 | 86 | 86 | -| test.c:85:8:85:13 | ... == ... | test.c:75:14:75:14 | 0 | == | test.c:75:9:75:9 | x | 0 | 85 | 85 | -| test.c:85:8:85:13 | ... == ... | test.c:75:14:75:14 | 0 | == | test.c:75:9:75:9 | x | 0 | 86 | 86 | | test.c:85:8:85:13 | ... == ... | test.c:85:8:85:8 | x | == | test.c:85:13:85:13 | 0 | 0 | 85 | 85 | | test.c:85:8:85:13 | ... == ... | test.c:85:8:85:8 | x | == | test.c:85:13:85:13 | 0 | 0 | 86 | 86 | | test.c:85:8:85:13 | ... == ... | test.c:85:13:85:13 | 0 | == | test.c:85:8:85:8 | x | 0 | 85 | 85 | | test.c:85:8:85:13 | ... == ... | test.c:85:13:85:13 | 0 | == | test.c:85:8:85:8 | x | 0 | 86 | 86 | -| test.c:85:8:85:23 | ... && ... | test.c:75:9:75:9 | x | == | test.c:75:14:75:14 | 0 | 0 | 86 | 86 | -| test.c:85:8:85:23 | ... && ... | test.c:75:14:75:14 | 0 | == | test.c:75:9:75:9 | x | 0 | 86 | 86 | | test.c:85:8:85:23 | ... && ... | test.c:85:8:85:8 | x | == | test.c:85:13:85:13 | 0 | 0 | 86 | 86 | | test.c:85:8:85:23 | ... && ... | test.c:85:13:85:13 | 0 | == | test.c:85:8:85:8 | x | 0 | 86 | 86 | | test.c:85:8:85:23 | ... && ... | test.c:85:18:85:18 | y | != | test.c:85:23:85:23 | 0 | 0 | 86 | 86 | @@ -184,18 +174,11 @@ binary unary | test.c:7:9:7:13 | ... > ... | test.c:7:9:7:9 | x | < | 1 | 10 | 11 | | test.c:7:9:7:13 | ... > ... | test.c:7:9:7:9 | x | >= | 1 | 7 | 9 | -| test.c:7:9:7:13 | ... > ... | test.c:7:9:7:13 | ... > ... | != | 0 | 7 | 9 | -| test.c:7:9:7:13 | ... > ... | test.c:7:9:7:13 | ... > ... | == | 0 | 10 | 11 | | test.c:17:8:17:12 | ... < ... | test.c:17:8:17:8 | x | < | 0 | 17 | 17 | | test.c:17:8:17:12 | ... < ... | test.c:17:8:17:8 | x | < | 0 | 18 | 18 | -| test.c:17:8:17:12 | ... < ... | test.c:17:8:17:12 | ... < ... | != | 0 | 17 | 17 | -| test.c:17:8:17:12 | ... < ... | test.c:17:8:17:12 | ... < ... | != | 0 | 18 | 18 | | test.c:17:8:17:21 | ... && ... | test.c:17:8:17:8 | x | < | 0 | 18 | 18 | -| test.c:17:8:17:21 | ... && ... | test.c:17:8:17:12 | ... < ... | != | 0 | 18 | 18 | | test.c:17:8:17:21 | ... && ... | test.c:17:17:17:17 | y | >= | 2 | 18 | 18 | -| test.c:17:8:17:21 | ... && ... | test.c:17:17:17:21 | ... > ... | != | 0 | 18 | 18 | | test.c:17:17:17:21 | ... > ... | test.c:17:17:17:17 | y | >= | 2 | 18 | 18 | -| test.c:17:17:17:21 | ... > ... | test.c:17:17:17:21 | ... > ... | != | 0 | 18 | 18 | | test.c:26:11:26:15 | ... > ... | test.c:26:11:26:11 | x | < | 1 | 2 | 2 | | test.c:26:11:26:15 | ... > ... | test.c:26:11:26:11 | x | < | 1 | 31 | 34 | | test.c:26:11:26:15 | ... > ... | test.c:26:11:26:11 | x | < | 1 | 34 | 34 | @@ -210,20 +193,6 @@ unary | test.c:26:11:26:15 | ... > ... | test.c:26:11:26:11 | x | < | 1 | 58 | 66 | | test.c:26:11:26:15 | ... > ... | test.c:26:11:26:11 | x | < | 1 | 62 | 62 | | test.c:26:11:26:15 | ... > ... | test.c:26:11:26:11 | x | >= | 1 | 26 | 28 | -| test.c:26:11:26:15 | ... > ... | test.c:26:11:26:15 | ... > ... | != | 0 | 26 | 28 | -| test.c:26:11:26:15 | ... > ... | test.c:26:11:26:15 | ... > ... | == | 0 | 2 | 2 | -| test.c:26:11:26:15 | ... > ... | test.c:26:11:26:15 | ... > ... | == | 0 | 31 | 34 | -| test.c:26:11:26:15 | ... > ... | test.c:26:11:26:15 | ... > ... | == | 0 | 34 | 34 | -| test.c:26:11:26:15 | ... > ... | test.c:26:11:26:15 | ... > ... | == | 0 | 39 | 42 | -| test.c:26:11:26:15 | ... > ... | test.c:26:11:26:15 | ... > ... | == | 0 | 42 | 42 | -| test.c:26:11:26:15 | ... > ... | test.c:26:11:26:15 | ... > ... | == | 0 | 42 | 44 | -| test.c:26:11:26:15 | ... > ... | test.c:26:11:26:15 | ... > ... | == | 0 | 45 | 45 | -| test.c:26:11:26:15 | ... > ... | test.c:26:11:26:15 | ... > ... | == | 0 | 45 | 47 | -| test.c:26:11:26:15 | ... > ... | test.c:26:11:26:15 | ... > ... | == | 0 | 51 | 53 | -| test.c:26:11:26:15 | ... > ... | test.c:26:11:26:15 | ... > ... | == | 0 | 56 | 58 | -| test.c:26:11:26:15 | ... > ... | test.c:26:11:26:15 | ... > ... | == | 0 | 58 | 58 | -| test.c:26:11:26:15 | ... > ... | test.c:26:11:26:15 | ... > ... | == | 0 | 58 | 66 | -| test.c:26:11:26:15 | ... > ... | test.c:26:11:26:15 | ... > ... | == | 0 | 62 | 62 | | test.c:34:16:34:21 | ... < ... | test.c:34:16:34:16 | j | < | 10 | 34 | 34 | | test.c:34:16:34:21 | ... < ... | test.c:34:16:34:16 | j | >= | 10 | 2 | 2 | | test.c:34:16:34:21 | ... < ... | test.c:34:16:34:16 | j | >= | 10 | 39 | 42 | @@ -236,72 +205,28 @@ unary | test.c:34:16:34:21 | ... < ... | test.c:34:16:34:16 | j | >= | 10 | 58 | 58 | | test.c:34:16:34:21 | ... < ... | test.c:34:16:34:16 | j | >= | 10 | 58 | 66 | | test.c:34:16:34:21 | ... < ... | test.c:34:16:34:16 | j | >= | 10 | 62 | 62 | -| test.c:34:16:34:21 | ... < ... | test.c:34:16:34:21 | ... < ... | != | 0 | 34 | 34 | -| test.c:34:16:34:21 | ... < ... | test.c:34:16:34:21 | ... < ... | == | 0 | 2 | 2 | -| test.c:34:16:34:21 | ... < ... | test.c:34:16:34:21 | ... < ... | == | 0 | 39 | 42 | -| test.c:34:16:34:21 | ... < ... | test.c:34:16:34:21 | ... < ... | == | 0 | 42 | 42 | -| test.c:34:16:34:21 | ... < ... | test.c:34:16:34:21 | ... < ... | == | 0 | 42 | 44 | -| test.c:34:16:34:21 | ... < ... | test.c:34:16:34:21 | ... < ... | == | 0 | 45 | 45 | -| test.c:34:16:34:21 | ... < ... | test.c:34:16:34:21 | ... < ... | == | 0 | 45 | 47 | -| test.c:34:16:34:21 | ... < ... | test.c:34:16:34:21 | ... < ... | == | 0 | 51 | 53 | -| test.c:34:16:34:21 | ... < ... | test.c:34:16:34:21 | ... < ... | == | 0 | 56 | 58 | -| test.c:34:16:34:21 | ... < ... | test.c:34:16:34:21 | ... < ... | == | 0 | 58 | 58 | -| test.c:34:16:34:21 | ... < ... | test.c:34:16:34:21 | ... < ... | == | 0 | 58 | 66 | -| test.c:34:16:34:21 | ... < ... | test.c:34:16:34:21 | ... < ... | == | 0 | 62 | 62 | | test.c:42:16:42:21 | ... < ... | test.c:42:16:42:16 | j | < | 10 | 42 | 42 | | test.c:42:16:42:21 | ... < ... | test.c:42:16:42:16 | j | < | 10 | 42 | 44 | | test.c:42:16:42:21 | ... < ... | test.c:42:16:42:16 | j | < | 10 | 45 | 45 | | test.c:42:16:42:21 | ... < ... | test.c:42:16:42:16 | j | < | 10 | 45 | 47 | | test.c:42:16:42:21 | ... < ... | test.c:42:16:42:16 | j | < | 10 | 51 | 53 | -| test.c:42:16:42:21 | ... < ... | test.c:42:16:42:21 | ... < ... | != | 0 | 42 | 42 | -| test.c:42:16:42:21 | ... < ... | test.c:42:16:42:21 | ... < ... | != | 0 | 42 | 44 | -| test.c:42:16:42:21 | ... < ... | test.c:42:16:42:21 | ... < ... | != | 0 | 45 | 45 | -| test.c:42:16:42:21 | ... < ... | test.c:42:16:42:21 | ... < ... | != | 0 | 45 | 47 | -| test.c:42:16:42:21 | ... < ... | test.c:42:16:42:21 | ... < ... | != | 0 | 51 | 53 | | test.c:44:12:44:16 | ... > ... | test.c:44:12:44:12 | z | < | 1 | 42 | 42 | | test.c:44:12:44:16 | ... > ... | test.c:44:12:44:12 | z | < | 1 | 51 | 53 | | test.c:44:12:44:16 | ... > ... | test.c:44:12:44:12 | z | >= | 1 | 45 | 45 | | test.c:44:12:44:16 | ... > ... | test.c:44:12:44:12 | z | >= | 1 | 45 | 47 | -| test.c:44:12:44:16 | ... > ... | test.c:44:12:44:16 | ... > ... | != | 0 | 45 | 45 | -| test.c:44:12:44:16 | ... > ... | test.c:44:12:44:16 | ... > ... | != | 0 | 45 | 47 | -| test.c:44:12:44:16 | ... > ... | test.c:44:12:44:16 | ... > ... | == | 0 | 42 | 42 | -| test.c:44:12:44:16 | ... > ... | test.c:44:12:44:16 | ... > ... | == | 0 | 51 | 53 | | test.c:45:16:45:20 | ... > ... | test.c:45:16:45:16 | y | >= | 1 | 45 | 47 | -| test.c:45:16:45:20 | ... > ... | test.c:45:16:45:20 | ... > ... | != | 0 | 45 | 47 | | test.c:58:9:58:14 | ... == ... | test.c:58:9:58:9 | x | != | 0 | 58 | 58 | | test.c:58:9:58:14 | ... == ... | test.c:58:9:58:9 | x | != | 0 | 62 | 62 | -| test.c:58:9:58:14 | ... == ... | test.c:58:9:58:14 | ... == ... | == | 0 | 58 | 58 | -| test.c:58:9:58:14 | ... == ... | test.c:58:9:58:14 | ... == ... | == | 0 | 62 | 62 | | test.c:58:9:58:23 | ... \|\| ... | test.c:58:9:58:9 | x | != | 0 | 62 | 62 | -| test.c:58:9:58:23 | ... \|\| ... | test.c:58:9:58:14 | ... == ... | == | 0 | 62 | 62 | | test.c:58:9:58:23 | ... \|\| ... | test.c:58:19:58:19 | y | >= | 0 | 62 | 62 | -| test.c:58:9:58:23 | ... \|\| ... | test.c:58:19:58:23 | ... < ... | == | 0 | 62 | 62 | | test.c:58:19:58:23 | ... < ... | test.c:58:19:58:19 | y | >= | 0 | 62 | 62 | -| test.c:58:19:58:23 | ... < ... | test.c:58:19:58:23 | ... < ... | == | 0 | 62 | 62 | | test.c:75:9:75:14 | ... == ... | test.c:75:9:75:9 | x | != | 0 | 78 | 79 | | test.c:75:9:75:14 | ... == ... | test.c:75:9:75:9 | x | == | 0 | 75 | 77 | -| test.c:75:9:75:14 | ... == ... | test.c:75:9:75:14 | ... == ... | != | 0 | 75 | 77 | -| test.c:75:9:75:14 | ... == ... | test.c:75:9:75:14 | ... == ... | == | 0 | 78 | 79 | -| test.c:75:9:75:14 | ... == ... | test.c:85:8:85:8 | x | != | 0 | 78 | 79 | -| test.c:75:9:75:14 | ... == ... | test.c:85:8:85:8 | x | == | 0 | 75 | 77 | -| test.c:75:9:75:14 | ... == ... | test.c:85:8:85:13 | ... == ... | != | 0 | 75 | 77 | -| test.c:75:9:75:14 | ... == ... | test.c:85:8:85:13 | ... == ... | == | 0 | 78 | 79 | -| test.c:85:8:85:13 | ... == ... | test.c:75:9:75:9 | x | == | 0 | 85 | 85 | -| test.c:85:8:85:13 | ... == ... | test.c:75:9:75:9 | x | == | 0 | 86 | 86 | -| test.c:85:8:85:13 | ... == ... | test.c:75:9:75:14 | ... == ... | != | 0 | 85 | 85 | -| test.c:85:8:85:13 | ... == ... | test.c:75:9:75:14 | ... == ... | != | 0 | 86 | 86 | | test.c:85:8:85:13 | ... == ... | test.c:85:8:85:8 | x | == | 0 | 85 | 85 | | test.c:85:8:85:13 | ... == ... | test.c:85:8:85:8 | x | == | 0 | 86 | 86 | -| test.c:85:8:85:13 | ... == ... | test.c:85:8:85:13 | ... == ... | != | 0 | 85 | 85 | -| test.c:85:8:85:13 | ... == ... | test.c:85:8:85:13 | ... == ... | != | 0 | 86 | 86 | -| test.c:85:8:85:23 | ... && ... | test.c:75:9:75:9 | x | == | 0 | 86 | 86 | -| test.c:85:8:85:23 | ... && ... | test.c:75:9:75:14 | ... == ... | != | 0 | 86 | 86 | | test.c:85:8:85:23 | ... && ... | test.c:85:8:85:8 | x | == | 0 | 86 | 86 | -| test.c:85:8:85:23 | ... && ... | test.c:85:8:85:13 | ... == ... | != | 0 | 86 | 86 | | test.c:85:8:85:23 | ... && ... | test.c:85:18:85:18 | y | != | 0 | 86 | 86 | -| test.c:85:8:85:23 | ... && ... | test.c:85:18:85:23 | ... != ... | != | 0 | 86 | 86 | | test.c:85:18:85:23 | ... != ... | test.c:85:18:85:18 | y | != | 0 | 86 | 86 | -| test.c:85:18:85:23 | ... != ... | test.c:85:18:85:23 | ... != ... | != | 0 | 86 | 86 | | test.c:94:11:94:16 | ... != ... | test.c:94:11:94:11 | x | != | 0 | 94 | 96 | | test.c:94:11:94:16 | ... != ... | test.c:94:11:94:11 | x | == | 0 | 70 | 70 | | test.c:94:11:94:16 | ... != ... | test.c:94:11:94:11 | x | == | 0 | 99 | 102 | @@ -310,49 +235,24 @@ unary | test.c:94:11:94:16 | ... != ... | test.c:94:11:94:11 | x | == | 0 | 109 | 109 | | test.c:94:11:94:16 | ... != ... | test.c:94:11:94:11 | x | == | 0 | 109 | 117 | | test.c:94:11:94:16 | ... != ... | test.c:94:11:94:11 | x | == | 0 | 113 | 113 | -| test.c:94:11:94:16 | ... != ... | test.c:94:11:94:16 | ... != ... | != | 0 | 94 | 96 | -| test.c:94:11:94:16 | ... != ... | test.c:94:11:94:16 | ... != ... | == | 0 | 70 | 70 | -| test.c:94:11:94:16 | ... != ... | test.c:94:11:94:16 | ... != ... | == | 0 | 99 | 102 | -| test.c:94:11:94:16 | ... != ... | test.c:94:11:94:16 | ... != ... | == | 0 | 102 | 102 | -| test.c:94:11:94:16 | ... != ... | test.c:94:11:94:16 | ... != ... | == | 0 | 107 | 109 | -| test.c:94:11:94:16 | ... != ... | test.c:94:11:94:16 | ... != ... | == | 0 | 109 | 109 | -| test.c:94:11:94:16 | ... != ... | test.c:94:11:94:16 | ... != ... | == | 0 | 109 | 117 | -| test.c:94:11:94:16 | ... != ... | test.c:94:11:94:16 | ... != ... | == | 0 | 113 | 113 | | test.c:102:16:102:21 | ... < ... | test.c:102:16:102:16 | j | < | 10 | 102 | 102 | | test.c:102:16:102:21 | ... < ... | test.c:102:16:102:16 | j | >= | 10 | 70 | 70 | | test.c:102:16:102:21 | ... < ... | test.c:102:16:102:16 | j | >= | 10 | 107 | 109 | | test.c:102:16:102:21 | ... < ... | test.c:102:16:102:16 | j | >= | 10 | 109 | 109 | | test.c:102:16:102:21 | ... < ... | test.c:102:16:102:16 | j | >= | 10 | 109 | 117 | | test.c:102:16:102:21 | ... < ... | test.c:102:16:102:16 | j | >= | 10 | 113 | 113 | -| test.c:102:16:102:21 | ... < ... | test.c:102:16:102:21 | ... < ... | != | 0 | 102 | 102 | -| test.c:102:16:102:21 | ... < ... | test.c:102:16:102:21 | ... < ... | == | 0 | 70 | 70 | -| test.c:102:16:102:21 | ... < ... | test.c:102:16:102:21 | ... < ... | == | 0 | 107 | 109 | -| test.c:102:16:102:21 | ... < ... | test.c:102:16:102:21 | ... < ... | == | 0 | 109 | 109 | -| test.c:102:16:102:21 | ... < ... | test.c:102:16:102:21 | ... < ... | == | 0 | 109 | 117 | -| test.c:102:16:102:21 | ... < ... | test.c:102:16:102:21 | ... < ... | == | 0 | 113 | 113 | | test.c:109:9:109:14 | ... == ... | test.c:109:9:109:9 | x | != | 0 | 109 | 109 | | test.c:109:9:109:14 | ... == ... | test.c:109:9:109:9 | x | != | 0 | 113 | 113 | -| test.c:109:9:109:14 | ... == ... | test.c:109:9:109:14 | ... == ... | == | 0 | 109 | 109 | -| test.c:109:9:109:14 | ... == ... | test.c:109:9:109:14 | ... == ... | == | 0 | 113 | 113 | | test.c:109:9:109:23 | ... \|\| ... | test.c:109:9:109:9 | x | != | 0 | 113 | 113 | -| test.c:109:9:109:23 | ... \|\| ... | test.c:109:9:109:14 | ... == ... | == | 0 | 113 | 113 | | test.c:109:9:109:23 | ... \|\| ... | test.c:109:19:109:19 | y | >= | 0 | 113 | 113 | -| test.c:109:9:109:23 | ... \|\| ... | test.c:109:19:109:23 | ... < ... | == | 0 | 113 | 113 | | test.c:109:19:109:23 | ... < ... | test.c:109:19:109:19 | y | >= | 0 | 113 | 113 | -| test.c:109:19:109:23 | ... < ... | test.c:109:19:109:23 | ... < ... | == | 0 | 113 | 113 | | test.c:126:7:126:7 | 1 | test.c:126:7:126:7 | 1 | != | 0 | 126 | 126 | | test.c:126:7:126:7 | 1 | test.c:126:7:126:7 | 1 | != | 0 | 126 | 128 | | test.c:126:7:126:7 | 1 | test.c:126:7:126:7 | 1 | != | 0 | 131 | 131 | | test.c:126:7:126:7 | 1 | test.c:126:7:126:7 | 1 | != | 0 | 131 | 132 | | test.c:126:7:126:7 | 1 | test.c:126:7:126:7 | 1 | != | 0 | 134 | 123 | -| test.c:126:7:126:7 | 1 | test.c:127:9:127:9 | 1 | != | 0 | 126 | 126 | -| test.c:126:7:126:7 | 1 | test.c:127:9:127:9 | 1 | != | 0 | 126 | 128 | -| test.c:126:7:126:7 | 1 | test.c:127:9:127:9 | 1 | != | 0 | 131 | 131 | -| test.c:126:7:126:7 | 1 | test.c:127:9:127:9 | 1 | != | 0 | 131 | 132 | -| test.c:126:7:126:7 | 1 | test.c:127:9:127:9 | 1 | != | 0 | 134 | 123 | | test.c:126:7:126:28 | ... && ... | test.c:126:7:126:7 | 1 | != | 0 | 126 | 128 | | test.c:126:7:126:28 | ... && ... | test.c:126:12:126:26 | call to test3_condition | != | 0 | 126 | 128 | -| test.c:126:7:126:28 | ... && ... | test.c:127:9:127:9 | 1 | != | 0 | 126 | 128 | | test.c:126:12:126:26 | call to test3_condition | test.c:126:12:126:26 | call to test3_condition | != | 0 | 126 | 128 | | test.c:131:7:131:7 | b | test.c:131:7:131:7 | b | != | 0 | 131 | 132 | | test.c:137:7:137:7 | 0 | test.c:137:7:137:7 | 0 | == | 0 | 142 | 136 | @@ -369,10 +269,6 @@ unary | test.cpp:31:7:31:13 | ... == ... | test.cpp:31:7:31:7 | x | != | -1 | 34 | 34 | | test.cpp:31:7:31:13 | ... == ... | test.cpp:31:7:31:7 | x | == | -1 | 30 | 30 | | test.cpp:31:7:31:13 | ... == ... | test.cpp:31:7:31:7 | x | == | -1 | 31 | 32 | -| test.cpp:31:7:31:13 | ... == ... | test.cpp:31:7:31:13 | ... == ... | != | 0 | 30 | 30 | -| test.cpp:31:7:31:13 | ... == ... | test.cpp:31:7:31:13 | ... == ... | != | 0 | 31 | 32 | -| test.cpp:31:7:31:13 | ... == ... | test.cpp:31:7:31:13 | ... == ... | == | 0 | 30 | 30 | -| test.cpp:31:7:31:13 | ... == ... | test.cpp:31:7:31:13 | ... == ... | == | 0 | 34 | 34 | | test.cpp:42:13:42:20 | call to getABool | test.cpp:42:13:42:20 | call to getABool | != | 0 | 43 | 45 | | test.cpp:42:13:42:20 | call to getABool | test.cpp:42:13:42:20 | call to getABool | == | 0 | 53 | 53 | | test.cpp:61:10:61:10 | i | test.cpp:61:10:61:10 | i | == | 0 | 62 | 64 | @@ -382,20 +278,13 @@ unary | test.cpp:74:10:74:10 | i | test.cpp:74:10:74:10 | i | >= | 0 | 75 | 77 | | test.cpp:74:10:74:10 | i | test.cpp:74:10:74:10 | i | >= | 11 | 78 | 79 | | test.cpp:93:6:93:6 | c | test.cpp:93:6:93:6 | c | != | 0 | 93 | 94 | -| test.cpp:99:6:99:6 | f | test.cpp:99:6:99:6 | f | != | 0 | 99 | 100 | -| test.cpp:105:6:105:14 | ... != ... | test.cpp:105:6:105:14 | ... != ... | != | 0 | 105 | 106 | -| test.cpp:111:6:111:14 | ... != ... | test.cpp:111:6:111:14 | ... != ... | != | 0 | 111 | 112 | | test.cpp:122:9:122:9 | b | test.cpp:122:9:122:9 | b | != | 0 | 123 | 125 | | test.cpp:122:9:122:9 | b | test.cpp:122:9:122:9 | b | != | 0 | 125 | 125 | | test.cpp:125:13:125:20 | ! ... | test.cpp:125:13:125:20 | ! ... | != | 0 | 125 | 125 | | test.cpp:125:14:125:17 | call to safe | test.cpp:125:14:125:17 | call to safe | == | 0 | 125 | 125 | | test.cpp:131:6:131:21 | call to __builtin_expect | test.cpp:131:6:131:21 | call to __builtin_expect | != | 0 | 131 | 132 | -| test.cpp:131:6:131:21 | call to __builtin_expect | test.cpp:131:23:131:33 | ... == ... | != | 0 | 131 | 132 | | test.cpp:135:6:135:21 | call to __builtin_expect | test.cpp:135:6:135:21 | call to __builtin_expect | != | 0 | 135 | 136 | -| test.cpp:135:6:135:21 | call to __builtin_expect | test.cpp:135:23:135:33 | ... != ... | != | 0 | 135 | 136 | | test.cpp:141:6:141:21 | call to __builtin_expect | test.cpp:141:6:141:21 | call to __builtin_expect | != | 0 | 141 | 142 | | test.cpp:141:6:141:21 | call to __builtin_expect | test.cpp:141:23:141:23 | a | == | 42 | 141 | 142 | -| test.cpp:141:6:141:21 | call to __builtin_expect | test.cpp:141:23:141:29 | ... == ... | != | 0 | 141 | 142 | | test.cpp:145:6:145:21 | call to __builtin_expect | test.cpp:145:6:145:21 | call to __builtin_expect | != | 0 | 145 | 146 | | test.cpp:145:6:145:21 | call to __builtin_expect | test.cpp:145:23:145:23 | a | != | 42 | 145 | 146 | -| test.cpp:145:6:145:21 | call to __builtin_expect | test.cpp:145:23:145:29 | ... != ... | != | 0 | 145 | 146 | diff --git a/cpp/ql/test/library-tests/dataflow/asExpr/test-indirect.expected b/cpp/ql/test/library-tests/dataflow/asExpr/test-indirect.expected index 8ec8033d086..e69de29bb2d 100644 --- a/cpp/ql/test/library-tests/dataflow/asExpr/test-indirect.expected +++ b/cpp/ql/test/library-tests/dataflow/asExpr/test-indirect.expected @@ -1,2 +0,0 @@ -testFailures -failures diff --git a/cpp/ql/test/library-tests/dataflow/asExpr/test.expected b/cpp/ql/test/library-tests/dataflow/asExpr/test.expected index 8ec8033d086..e69de29bb2d 100644 --- a/cpp/ql/test/library-tests/dataflow/asExpr/test.expected +++ b/cpp/ql/test/library-tests/dataflow/asExpr/test.expected @@ -1,2 +0,0 @@ -testFailures -failures diff --git a/cpp/ql/test/library-tests/dataflow/dataflow-tests/guard-condition-regression-test.expected b/cpp/ql/test/library-tests/dataflow/dataflow-tests/guard-condition-regression-test.expected index 8ec8033d086..e69de29bb2d 100644 --- a/cpp/ql/test/library-tests/dataflow/dataflow-tests/guard-condition-regression-test.expected +++ b/cpp/ql/test/library-tests/dataflow/dataflow-tests/guard-condition-regression-test.expected @@ -1,2 +0,0 @@ -testFailures -failures diff --git a/cpp/ql/test/library-tests/dataflow/dataflow-tests/has-parameter-flow-out.expected b/cpp/ql/test/library-tests/dataflow/dataflow-tests/has-parameter-flow-out.expected index 22f278d41ae..5711cec229d 100644 --- a/cpp/ql/test/library-tests/dataflow/dataflow-tests/has-parameter-flow-out.expected +++ b/cpp/ql/test/library-tests/dataflow/dataflow-tests/has-parameter-flow-out.expected @@ -1,3 +1 @@ WARNING: module 'DataFlow' has been deprecated and may be removed in future (has-parameter-flow-out.ql:5,18-61) -testFailures -failures diff --git a/cpp/ql/test/library-tests/dataflow/dataflow-tests/test-number-of-outnodes.expected b/cpp/ql/test/library-tests/dataflow/dataflow-tests/test-number-of-outnodes.expected index a32c8f7af91..316ac213731 100644 --- a/cpp/ql/test/library-tests/dataflow/dataflow-tests/test-number-of-outnodes.expected +++ b/cpp/ql/test/library-tests/dataflow/dataflow-tests/test-number-of-outnodes.expected @@ -1,3 +1 @@ WARNING: module 'DataFlow' has been deprecated and may be removed in future (test-number-of-outnodes.ql:5,18-61) -failures -testFailures diff --git a/cpp/ql/test/library-tests/dataflow/dataflow-tests/test.expected b/cpp/ql/test/library-tests/dataflow/dataflow-tests/test.expected index 8ec8033d086..e69de29bb2d 100644 --- a/cpp/ql/test/library-tests/dataflow/dataflow-tests/test.expected +++ b/cpp/ql/test/library-tests/dataflow/dataflow-tests/test.expected @@ -1,2 +0,0 @@ -testFailures -failures diff --git a/cpp/ql/test/library-tests/dataflow/dataflow-tests/test_self_argument_flow.expected b/cpp/ql/test/library-tests/dataflow/dataflow-tests/test_self_argument_flow.expected index 8ec8033d086..e69de29bb2d 100644 --- a/cpp/ql/test/library-tests/dataflow/dataflow-tests/test_self_argument_flow.expected +++ b/cpp/ql/test/library-tests/dataflow/dataflow-tests/test_self_argument_flow.expected @@ -1,2 +0,0 @@ -testFailures -failures diff --git a/cpp/ql/test/library-tests/dataflow/dataflow-tests/test_self_parameter_flow.expected b/cpp/ql/test/library-tests/dataflow/dataflow-tests/test_self_parameter_flow.expected index 48de9172b36..e69de29bb2d 100644 --- a/cpp/ql/test/library-tests/dataflow/dataflow-tests/test_self_parameter_flow.expected +++ b/cpp/ql/test/library-tests/dataflow/dataflow-tests/test_self_parameter_flow.expected @@ -1,2 +0,0 @@ -failures -testFailures diff --git a/cpp/ql/test/library-tests/dataflow/dataflow-tests/type-bugs.expected b/cpp/ql/test/library-tests/dataflow/dataflow-tests/type-bugs.expected index 02f5544fe14..87ebdc9e83a 100644 --- a/cpp/ql/test/library-tests/dataflow/dataflow-tests/type-bugs.expected +++ b/cpp/ql/test/library-tests/dataflow/dataflow-tests/type-bugs.expected @@ -52,4 +52,3 @@ incorrectBaseType | test.cpp:854:10:854:36 | * ... | Expected 'Node.getType()' to be const int, but it was int | | test.cpp:867:10:867:30 | * ... | Expected 'Node.getType()' to be const int, but it was int | | test.cpp:1098:52:1098:53 | *& ... | Expected 'Node.getType()' to be char, but it was char * | -failures diff --git a/cpp/ql/test/library-tests/dataflow/external-models/flow.expected b/cpp/ql/test/library-tests/dataflow/external-models/flow.expected index a3d09178f2c..8a954e9235a 100644 --- a/cpp/ql/test/library-tests/dataflow/external-models/flow.expected +++ b/cpp/ql/test/library-tests/dataflow/external-models/flow.expected @@ -1,5 +1,4 @@ testFailures -failures edges | asio_streams.cpp:56:18:56:23 | [summary param] *0 in buffer | asio_streams.cpp:56:18:56:23 | [summary] to write: ReturnValue in buffer | provenance | MaD:10 | | asio_streams.cpp:87:34:87:44 | read_until output argument | asio_streams.cpp:91:7:91:17 | recv_buffer | provenance | Src:MaD:2 | diff --git a/cpp/ql/test/library-tests/dataflow/fields/flow.expected b/cpp/ql/test/library-tests/dataflow/fields/flow.expected index 8ec8033d086..e69de29bb2d 100644 --- a/cpp/ql/test/library-tests/dataflow/fields/flow.expected +++ b/cpp/ql/test/library-tests/dataflow/fields/flow.expected @@ -1,2 +0,0 @@ -testFailures -failures diff --git a/cpp/ql/test/library-tests/dataflow/models-as-data/interpretElement.expected b/cpp/ql/test/library-tests/dataflow/models-as-data/interpretElement.expected index 8ec8033d086..e69de29bb2d 100644 --- a/cpp/ql/test/library-tests/dataflow/models-as-data/interpretElement.expected +++ b/cpp/ql/test/library-tests/dataflow/models-as-data/interpretElement.expected @@ -1,2 +0,0 @@ -testFailures -failures diff --git a/cpp/ql/test/library-tests/dataflow/models-as-data/taint.expected b/cpp/ql/test/library-tests/dataflow/models-as-data/taint.expected index 8ec8033d086..e69de29bb2d 100644 --- a/cpp/ql/test/library-tests/dataflow/models-as-data/taint.expected +++ b/cpp/ql/test/library-tests/dataflow/models-as-data/taint.expected @@ -1,2 +0,0 @@ -testFailures -failures diff --git a/cpp/ql/test/library-tests/dataflow/parameters-without-defs/test.expected b/cpp/ql/test/library-tests/dataflow/parameters-without-defs/test.expected index 8ec8033d086..e69de29bb2d 100644 --- a/cpp/ql/test/library-tests/dataflow/parameters-without-defs/test.expected +++ b/cpp/ql/test/library-tests/dataflow/parameters-without-defs/test.expected @@ -1,2 +0,0 @@ -testFailures -failures diff --git a/cpp/ql/test/library-tests/dataflow/smart-pointers-taint/taint.expected b/cpp/ql/test/library-tests/dataflow/smart-pointers-taint/taint.expected index dfa7c56f90b..a3e8b75f996 100644 --- a/cpp/ql/test/library-tests/dataflow/smart-pointers-taint/taint.expected +++ b/cpp/ql/test/library-tests/dataflow/smart-pointers-taint/taint.expected @@ -2,5 +2,3 @@ WARNING: module 'DataFlow' has been deprecated and may be removed in future (tai WARNING: module 'DataFlow' has been deprecated and may be removed in future (taint.ql:7,24-32) WARNING: module 'DataFlow' has been deprecated and may be removed in future (taint.ql:11,22-30) WARNING: module 'TaintTracking' has been deprecated and may be removed in future (taint.ql:19,20-33) -failures -testFailures diff --git a/cpp/ql/test/library-tests/dataflow/source-sink-tests/local-flow.expected b/cpp/ql/test/library-tests/dataflow/source-sink-tests/local-flow.expected index 8ec8033d086..e69de29bb2d 100644 --- a/cpp/ql/test/library-tests/dataflow/source-sink-tests/local-flow.expected +++ b/cpp/ql/test/library-tests/dataflow/source-sink-tests/local-flow.expected @@ -1,2 +0,0 @@ -testFailures -failures diff --git a/cpp/ql/test/library-tests/dataflow/source-sink-tests/remote-flow.expected b/cpp/ql/test/library-tests/dataflow/source-sink-tests/remote-flow.expected index 8ec8033d086..e69de29bb2d 100644 --- a/cpp/ql/test/library-tests/dataflow/source-sink-tests/remote-flow.expected +++ b/cpp/ql/test/library-tests/dataflow/source-sink-tests/remote-flow.expected @@ -1,2 +0,0 @@ -testFailures -failures diff --git a/cpp/ql/test/library-tests/dataflow/taint-tests/taint.expected b/cpp/ql/test/library-tests/dataflow/taint-tests/taint.expected index 299f1413878..444be256516 100644 --- a/cpp/ql/test/library-tests/dataflow/taint-tests/taint.expected +++ b/cpp/ql/test/library-tests/dataflow/taint-tests/taint.expected @@ -3,5 +3,3 @@ WARNING: module 'DataFlow' has been deprecated and may be removed in future (tai WARNING: module 'DataFlow' has been deprecated and may be removed in future (taint.ql:61,22-30) WARNING: module 'DataFlow' has been deprecated and may be removed in future (taint.ql:68,25-33) WARNING: module 'TaintTracking' has been deprecated and may be removed in future (taint.ql:73,20-33) -testFailures -failures diff --git a/cpp/ql/test/library-tests/ir/modulus-analysis/ModulusAnalysis.expected b/cpp/ql/test/library-tests/ir/modulus-analysis/ModulusAnalysis.expected index 8ec8033d086..e69de29bb2d 100644 --- a/cpp/ql/test/library-tests/ir/modulus-analysis/ModulusAnalysis.expected +++ b/cpp/ql/test/library-tests/ir/modulus-analysis/ModulusAnalysis.expected @@ -1,2 +0,0 @@ -testFailures -failures diff --git a/cpp/ql/test/library-tests/ir/range-analysis/Overflow.expected b/cpp/ql/test/library-tests/ir/range-analysis/Overflow.expected index 8ec8033d086..e69de29bb2d 100644 --- a/cpp/ql/test/library-tests/ir/range-analysis/Overflow.expected +++ b/cpp/ql/test/library-tests/ir/range-analysis/Overflow.expected @@ -1,2 +0,0 @@ -testFailures -failures diff --git a/cpp/ql/test/library-tests/ir/range-analysis/RangeAnalysis.expected b/cpp/ql/test/library-tests/ir/range-analysis/RangeAnalysis.expected index 8ec8033d086..e69de29bb2d 100644 --- a/cpp/ql/test/library-tests/ir/range-analysis/RangeAnalysis.expected +++ b/cpp/ql/test/library-tests/ir/range-analysis/RangeAnalysis.expected @@ -1,2 +0,0 @@ -testFailures -failures diff --git a/cpp/ql/test/library-tests/ir/sign-analysis/SignAnalysis.expected b/cpp/ql/test/library-tests/ir/sign-analysis/SignAnalysis.expected index 8ec8033d086..e69de29bb2d 100644 --- a/cpp/ql/test/library-tests/ir/sign-analysis/SignAnalysis.expected +++ b/cpp/ql/test/library-tests/ir/sign-analysis/SignAnalysis.expected @@ -1,2 +0,0 @@ -testFailures -failures diff --git a/cpp/ql/test/library-tests/ir/types/irtypes.expected b/cpp/ql/test/library-tests/ir/types/irtypes.expected index 8ec8033d086..e69de29bb2d 100644 --- a/cpp/ql/test/library-tests/ir/types/irtypes.expected +++ b/cpp/ql/test/library-tests/ir/types/irtypes.expected @@ -1,2 +0,0 @@ -testFailures -failures diff --git a/cpp/ql/test/query-tests/Critical/MissingCheckScanf/MissingCheckScanf.expected b/cpp/ql/test/query-tests/Critical/MissingCheckScanf/MissingCheckScanf.expected index 1edf3b1ae99..dac8afd3fd3 100644 --- a/cpp/ql/test/query-tests/Critical/MissingCheckScanf/MissingCheckScanf.expected +++ b/cpp/ql/test/query-tests/Critical/MissingCheckScanf/MissingCheckScanf.expected @@ -52,9 +52,6 @@ edges | test.cpp:541:39:541:40 | sscanf output argument | test.cpp:549:8:549:8 | e | provenance | | | test.cpp:541:43:541:44 | sscanf output argument | test.cpp:545:8:545:8 | f | provenance | | | test.cpp:541:43:541:44 | sscanf output argument | test.cpp:550:8:550:8 | f | provenance | | -| test.cpp:559:30:559:31 | scanf output argument | test.cpp:561:9:561:9 | i | provenance | | -| test.cpp:567:35:567:36 | scanf output argument | test.cpp:569:9:569:9 | i | provenance | | -| test.cpp:575:30:575:31 | scanf output argument | test.cpp:577:9:577:9 | i | provenance | | nodes | test.cpp:34:15:34:16 | scanf output argument | semmle.label | scanf output argument | | test.cpp:35:7:35:7 | i | semmle.label | i | @@ -157,12 +154,6 @@ nodes | test.cpp:548:8:548:8 | d | semmle.label | d | | test.cpp:549:8:549:8 | e | semmle.label | e | | test.cpp:550:8:550:8 | f | semmle.label | f | -| test.cpp:559:30:559:31 | scanf output argument | semmle.label | scanf output argument | -| test.cpp:561:9:561:9 | i | semmle.label | i | -| test.cpp:567:35:567:36 | scanf output argument | semmle.label | scanf output argument | -| test.cpp:569:9:569:9 | i | semmle.label | i | -| test.cpp:575:30:575:31 | scanf output argument | semmle.label | scanf output argument | -| test.cpp:577:9:577:9 | i | semmle.label | i | subpaths #select | test.cpp:35:7:35:7 | i | test.cpp:34:15:34:16 | scanf output argument | test.cpp:35:7:35:7 | i | This variable is read, but may not have been written. It should be guarded by a check that the $@ returns at least 1. | test.cpp:34:3:34:7 | call to scanf | call to scanf | @@ -186,5 +177,3 @@ subpaths | test.cpp:484:9:484:9 | i | test.cpp:480:25:480:26 | scanf output argument | test.cpp:484:9:484:9 | i | This variable is read, but may not have been written. It should be guarded by a check that the $@ returns at least 1. | test.cpp:480:13:480:17 | call to scanf | call to scanf | | test.cpp:495:8:495:8 | i | test.cpp:491:25:491:26 | scanf output argument | test.cpp:495:8:495:8 | i | This variable is read, but may not have been written. It should be guarded by a check that the $@ returns at least 1. | test.cpp:491:13:491:17 | call to scanf | call to scanf | | test.cpp:545:8:545:8 | f | test.cpp:541:43:541:44 | sscanf output argument | test.cpp:545:8:545:8 | f | This variable is read, but may not have been written. It should be guarded by a check that the $@ returns at least 3. | test.cpp:541:10:541:15 | call to sscanf | call to sscanf | -| test.cpp:569:9:569:9 | i | test.cpp:567:35:567:36 | scanf output argument | test.cpp:569:9:569:9 | i | This variable is read, but may not have been written. It should be guarded by a check that the $@ returns at least 1. | test.cpp:567:23:567:27 | call to scanf | call to scanf | -| test.cpp:577:9:577:9 | i | test.cpp:575:30:575:31 | scanf output argument | test.cpp:577:9:577:9 | i | This variable is read, but may not have been written. It should be guarded by a check that the $@ returns at least 1. | test.cpp:575:18:575:22 | call to scanf | call to scanf | diff --git a/cpp/ql/test/query-tests/Critical/MissingCheckScanf/test.cpp b/cpp/ql/test/query-tests/Critical/MissingCheckScanf/test.cpp index 9cfad40a148..efc37060a55 100644 --- a/cpp/ql/test/query-tests/Critical/MissingCheckScanf/test.cpp +++ b/cpp/ql/test/query-tests/Critical/MissingCheckScanf/test.cpp @@ -553,27 +553,3 @@ void switch_cases(const char *data) { break; } } - -void test_scanf_compared_right_away() { - int i; - bool success = scanf("%d", &i) == 1; - if(success) { - use(i); // GOOD - } -} - -void test_scanf_compared_in_conjunct_right(bool b) { - int i; - bool success = b && scanf("%d", &i) == 1; - if(success) { - use(i); // GOOD [FALSE POSITIVE] - } -} - -void test_scanf_compared_in_conjunct_left(bool b) { - int i; - bool success = scanf("%d", &i) == 1 && b; - if(success) { - use(i); // GOOD [FALSE POSITIVE] - } -} diff --git a/cpp/ql/test/query-tests/Security/CWE/CWE-193/AllocationToInvalidPointer.expected b/cpp/ql/test/query-tests/Security/CWE/CWE-193/AllocationToInvalidPointer.expected index 8ec8033d086..e69de29bb2d 100644 --- a/cpp/ql/test/query-tests/Security/CWE/CWE-193/AllocationToInvalidPointer.expected +++ b/cpp/ql/test/query-tests/Security/CWE/CWE-193/AllocationToInvalidPointer.expected @@ -1,2 +0,0 @@ -testFailures -failures diff --git a/cpp/ql/test/query-tests/Security/CWE/CWE-193/InvalidPointerToDereference.expected b/cpp/ql/test/query-tests/Security/CWE/CWE-193/InvalidPointerToDereference.expected index 8ec8033d086..e69de29bb2d 100644 --- a/cpp/ql/test/query-tests/Security/CWE/CWE-193/InvalidPointerToDereference.expected +++ b/cpp/ql/test/query-tests/Security/CWE/CWE-193/InvalidPointerToDereference.expected @@ -1,2 +0,0 @@ -testFailures -failures diff --git a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/NugetPackageRestorer.cs b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/NugetPackageRestorer.cs index 3895db3e4d4..f30760981f3 100644 --- a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/NugetPackageRestorer.cs +++ b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/NugetPackageRestorer.cs @@ -4,7 +4,6 @@ using System.Collections.Generic; using System.IO; using System.Linq; using System.Net.Http; -using System.Security.Cryptography; using System.Text; using System.Text.RegularExpressions; using System.Threading; @@ -264,7 +263,7 @@ namespace Semmle.Extraction.CSharp.DependencyFetching var isWindows = fileContent.UseWindowsForms || fileContent.UseWpf; - var sync = new object(); + var sync = new Lock(); var projectGroups = projects.GroupBy(Path.GetDirectoryName); Parallel.ForEach(projectGroups, new ParallelOptions { MaxDegreeOfParallelism = DependencyManager.Threads }, projectGroup => { @@ -346,7 +345,7 @@ namespace Semmle.Extraction.CSharp.DependencyFetching compilationInfoContainer.CompilationInfos.Add(("Fallback nuget restore", notYetDownloadedPackages.Count.ToString())); var successCount = 0; - var sync = new object(); + var sync = new Lock(); Parallel.ForEach(notYetDownloadedPackages, new ParallelOptions { MaxDegreeOfParallelism = DependencyManager.Threads }, package => { diff --git a/csharp/extractor/Semmle.Extraction.CSharp.Standalone/Options.cs b/csharp/extractor/Semmle.Extraction.CSharp.Standalone/Options.cs index 39c363a7753..64d7535ee2a 100644 --- a/csharp/extractor/Semmle.Extraction.CSharp.Standalone/Options.cs +++ b/csharp/extractor/Semmle.Extraction.CSharp.Standalone/Options.cs @@ -1,8 +1,6 @@ +using System; using System.IO; using Semmle.Util; -using Semmle.Util.Logging; -using Semmle.Extraction.CSharp.DependencyFetching; -using System; namespace Semmle.Extraction.CSharp.Standalone { diff --git a/csharp/extractor/Semmle.Extraction.CSharp.Standalone/Program.cs b/csharp/extractor/Semmle.Extraction.CSharp.Standalone/Program.cs index fc13b774f4f..475847be576 100644 --- a/csharp/extractor/Semmle.Extraction.CSharp.Standalone/Program.cs +++ b/csharp/extractor/Semmle.Extraction.CSharp.Standalone/Program.cs @@ -1,8 +1,3 @@ -using System; -using System.Collections.Generic; -using Semmle.Util.Logging; -using Semmle.Extraction.CSharp.DependencyFetching; - namespace Semmle.Extraction.CSharp.Standalone { public class Program diff --git a/csharp/extractor/Semmle.Extraction.CSharp/CodeAnalysisExtensions/SymbolExtensions.cs b/csharp/extractor/Semmle.Extraction.CSharp/CodeAnalysisExtensions/SymbolExtensions.cs index 72c45b797d8..bb61efe332c 100644 --- a/csharp/extractor/Semmle.Extraction.CSharp/CodeAnalysisExtensions/SymbolExtensions.cs +++ b/csharp/extractor/Semmle.Extraction.CSharp/CodeAnalysisExtensions/SymbolExtensions.cs @@ -642,5 +642,40 @@ namespace Semmle.Extraction.CSharp /// public static IEnumerable GetAnnotatedTypeArguments(this INamedTypeSymbol symbol) => symbol.TypeArguments.Zip(symbol.TypeArgumentNullableAnnotations, (t, a) => new AnnotatedTypeSymbol(t, a)); + + /// + /// Returns true if the symbol is public, protected or protected internal. + /// + public static bool IsPublicOrProtected(this ISymbol symbol) => + symbol.DeclaredAccessibility == Accessibility.Public + || symbol.DeclaredAccessibility == Accessibility.Protected + || symbol.DeclaredAccessibility == Accessibility.ProtectedOrInternal; + + /// + /// Returns true if the given symbol should be extracted. + /// + public static bool ShouldExtractSymbol(this ISymbol symbol) + { + // Extract all source symbols and public/protected metadata symbols. + if (symbol.Locations.Any(x => !x.IsInMetadata) || symbol.IsPublicOrProtected()) + { + return true; + } + if (symbol is IMethodSymbol method) + { + return method.ExplicitInterfaceImplementations.Any(m => m.ContainingType.ShouldExtractSymbol()); + } + if (symbol is IPropertySymbol property) + { + return property.ExplicitInterfaceImplementations.Any(m => m.ContainingType.ShouldExtractSymbol()); + } + return false; + } + + /// + /// Returns the symbols that should be extracted. + /// + public static IEnumerable ExtractionCandidates(this IEnumerable symbols) where T : ISymbol => + symbols.Where(symbol => symbol.ShouldExtractSymbol()); } } diff --git a/csharp/extractor/Semmle.Extraction.CSharp/Entities/Method.cs b/csharp/extractor/Semmle.Extraction.CSharp/Entities/Method.cs index 6890ca49084..6ba5cca01cf 100644 --- a/csharp/extractor/Semmle.Extraction.CSharp/Entities/Method.cs +++ b/csharp/extractor/Semmle.Extraction.CSharp/Entities/Method.cs @@ -101,7 +101,7 @@ namespace Semmle.Extraction.CSharp.Entities } } - if (Symbol.OverriddenMethod is not null) + if (Symbol.OverriddenMethod is not null && Symbol.OverriddenMethod.ShouldExtractSymbol()) { trapFile.overrides(this, Method.Create(Context, Symbol.OverriddenMethod)); } diff --git a/csharp/extractor/Semmle.Extraction.CSharp/Entities/Types/Type.cs b/csharp/extractor/Semmle.Extraction.CSharp/Entities/Types/Type.cs index 56382923a48..efd09409afd 100644 --- a/csharp/extractor/Semmle.Extraction.CSharp/Entities/Types/Type.cs +++ b/csharp/extractor/Semmle.Extraction.CSharp/Entities/Types/Type.cs @@ -225,7 +225,7 @@ namespace Semmle.Extraction.CSharp.Entities } /// - /// Called to extract all members and nested types. + /// Called to extract members and nested types. /// This is called on each member of a namespace, /// in either source code or an assembly. /// @@ -236,7 +236,7 @@ namespace Semmle.Extraction.CSharp.Entities Context.BindComments(this, l); } - foreach (var member in Symbol.GetMembers()) + foreach (var member in Symbol.GetMembers().ExtractionCandidates()) { switch (member.Kind) { @@ -262,16 +262,16 @@ namespace Semmle.Extraction.CSharp.Entities var members = new List(); - foreach (var member in Symbol.GetMembers()) + foreach (var member in Symbol.GetMembers().ExtractionCandidates()) members.Add(member); - foreach (var member in Symbol.GetTypeMembers()) + foreach (var member in Symbol.GetTypeMembers().ExtractionCandidates()) members.Add(member); // Mono extractor puts all BASE interface members as members of the current interface. if (Symbol.TypeKind == TypeKind.Interface) { - foreach (var baseInterface in Symbol.Interfaces) + foreach (var baseInterface in Symbol.Interfaces.ExtractionCandidates()) { foreach (var member in baseInterface.GetMembers()) members.Add(member); @@ -288,7 +288,7 @@ namespace Semmle.Extraction.CSharp.Entities if (Symbol.BaseType is not null) Create(Context, Symbol.BaseType).PopulateGenerics(); - foreach (var i in Symbol.Interfaces) + foreach (var i in Symbol.Interfaces.ExtractionCandidates()) { Create(Context, i).PopulateGenerics(); } diff --git a/csharp/extractor/Semmle.Extraction.CSharp/Extractor/Analyser.cs b/csharp/extractor/Semmle.Extraction.CSharp/Extractor/Analyser.cs index b839d2c976a..3ea99a0d772 100644 --- a/csharp/extractor/Semmle.Extraction.CSharp/Extractor/Analyser.cs +++ b/csharp/extractor/Semmle.Extraction.CSharp/Extractor/Analyser.cs @@ -269,7 +269,7 @@ namespace Semmle.Extraction.CSharp AnalyseNamespace(cx, memberNamespace); } - foreach (var memberType in ns.GetTypeMembers()) + foreach (var memberType in ns.GetTypeMembers().ExtractionCandidates()) { Entities.Type.Create(cx, memberType).ExtractRecursive(); } diff --git a/csharp/extractor/Semmle.Extraction.CSharp/Extractor/ExtractionContext.cs b/csharp/extractor/Semmle.Extraction.CSharp/Extractor/ExtractionContext.cs index 619eb995347..262475ca5a1 100644 --- a/csharp/extractor/Semmle.Extraction.CSharp/Extractor/ExtractionContext.cs +++ b/csharp/extractor/Semmle.Extraction.CSharp/Extractor/ExtractionContext.cs @@ -1,4 +1,5 @@ using System.Collections.Generic; +using System.Threading; using Semmle.Util.Logging; using CompilationInfo = (string key, string value); @@ -38,7 +39,7 @@ namespace Semmle.Extraction.CSharp // to handle pathological cases. private const int maxErrors = 1000; - private readonly object mutex = new object(); + private readonly Lock mutex = new(); public void Message(Message msg) { diff --git a/csharp/extractor/Semmle.Extraction.CSharp/Extractor/Extractor.cs b/csharp/extractor/Semmle.Extraction.CSharp/Extractor/Extractor.cs index 50f673a7158..3c01893dd89 100644 --- a/csharp/extractor/Semmle.Extraction.CSharp/Extractor/Extractor.cs +++ b/csharp/extractor/Semmle.Extraction.CSharp/Extractor/Extractor.cs @@ -549,7 +549,6 @@ namespace Semmle.Extraction.CSharp compilerArguments.CompilationOptions .WithAssemblyIdentityComparer(DesktopAssemblyIdentityComparer.Default) .WithStrongNameProvider(new DesktopStrongNameProvider(compilerArguments.KeyFileSearchPaths)) - .WithMetadataImportOptions(MetadataImportOptions.All) ); }, (compilation, options) => analyser.EndInitialize(compilerArguments, options, compilation, cwd, args), diff --git a/csharp/extractor/Semmle.Util/Logging/PidStreamWriter.cs b/csharp/extractor/Semmle.Util/Logging/PidStreamWriter.cs index 7d9599298d6..cf4d8be52e5 100644 --- a/csharp/extractor/Semmle.Util/Logging/PidStreamWriter.cs +++ b/csharp/extractor/Semmle.Util/Logging/PidStreamWriter.cs @@ -1,5 +1,5 @@ using System.IO; -using System.Diagnostics; +using System.Threading; namespace Semmle.Util.Logging { @@ -33,6 +33,6 @@ namespace Semmle.Util.Logging WriteLine(format is null ? format : string.Format(format, args)); } - private readonly object mutex = new object(); + private readonly Lock mutex = new(); } } diff --git a/csharp/extractor/Testrunner/Testrunner.cs b/csharp/extractor/Testrunner/Testrunner.cs index 6280a8c1be2..d772ca903f7 100644 --- a/csharp/extractor/Testrunner/Testrunner.cs +++ b/csharp/extractor/Testrunner/Testrunner.cs @@ -14,7 +14,7 @@ using System; /// public class Testrunner { - private static readonly object ConsoleLock = new(); + private static readonly Lock ConsoleLock = new(); private static readonly ManualResetEvent Finished = new(false); diff --git a/csharp/paket.dependencies b/csharp/paket.dependencies index f07d495f7db..d3e2988bba6 100644 --- a/csharp/paket.dependencies +++ b/csharp/paket.dependencies @@ -4,6 +4,7 @@ source https://api.nuget.org/v3/index.json # behave like nuget in choosing transitive dependency versions strategy: min +nuget MessagePack >= 2.5.187 nuget Basic.CompilerLog.Util nuget Mono.Posix.NETStandard nuget Newtonsoft.Json diff --git a/csharp/paket.lock b/csharp/paket.lock index d0cd1517b41..1bfc7465d12 100644 --- a/csharp/paket.lock +++ b/csharp/paket.lock @@ -11,11 +11,10 @@ NUGET Microsoft.Extensions.ObjectPool (>= 7.0.13) MSBuild.StructuredLogger (>= 2.2.235) Humanizer.Core (2.14.1) - MessagePack (2.5.129) - MessagePack.Annotations (>= 2.5.129) + MessagePack (2.5.192) + MessagePack.Annotations (>= 2.5.192) Microsoft.NET.StringTools (>= 17.6.3) - System.Runtime.CompilerServices.Unsafe (>= 6.0) - MessagePack.Annotations (2.5.129) + MessagePack.Annotations (2.5.192) Microsoft.Build (17.8.3) Microsoft.Build.Framework (>= 17.8.3) Microsoft.NET.StringTools (>= 17.8.3) @@ -59,18 +58,18 @@ NUGET System.Composition (>= 8.0) System.IO.Pipelines (>= 8.0) System.Threading.Channels (>= 8.0) - Microsoft.CodeCoverage (17.11.1) + Microsoft.CodeCoverage (17.12) Microsoft.Extensions.ObjectPool (7.0.13) Microsoft.NET.StringTools (17.8.3) - Microsoft.NET.Test.Sdk (17.11.1) - Microsoft.CodeCoverage (>= 17.11.1) - Microsoft.TestPlatform.TestHost (>= 17.11.1) + Microsoft.NET.Test.Sdk (17.12) + Microsoft.CodeCoverage (>= 17.12) + Microsoft.TestPlatform.TestHost (>= 17.12) Microsoft.NETCore.Platforms (1.1.1) Microsoft.NETCore.Targets (1.1.3) - Microsoft.TestPlatform.ObjectModel (17.11.1) + Microsoft.TestPlatform.ObjectModel (17.12) System.Reflection.Metadata (>= 1.6) - Microsoft.TestPlatform.TestHost (17.11.1) - Microsoft.TestPlatform.ObjectModel (>= 17.11.1) + Microsoft.TestPlatform.TestHost (17.12) + Microsoft.TestPlatform.ObjectModel (>= 17.12) Newtonsoft.Json (>= 13.0.1) Microsoft.Win32.Primitives (4.3) Microsoft.NETCore.Platforms (>= 1.1) diff --git a/csharp/paket.main.bzl b/csharp/paket.main.bzl index c8e6dbf2c8d..2ec4e25c5f9 100644 --- a/csharp/paket.main.bzl +++ b/csharp/paket.main.bzl @@ -9,8 +9,8 @@ def main(): packages = [ {"name": "Basic.CompilerLog.Util", "id": "Basic.CompilerLog.Util", "version": "0.7.9", "sha512": "sha512-Z50VRWQIXO0E8GM3ZFdL+Mq+YdmPh+OEJ7bDXPIsp1TQJB07i09WdlEb4MucSz9wG4exeLC3HGt23O3NOFL30g==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": ["MSBuild.StructuredLogger", "MessagePack", "Microsoft.CodeAnalysis", "Microsoft.CodeAnalysis.CSharp", "Microsoft.CodeAnalysis.VisualBasic", "Microsoft.Extensions.ObjectPool"], "net462": ["MSBuild.StructuredLogger", "MessagePack", "Microsoft.CodeAnalysis", "Microsoft.CodeAnalysis.CSharp", "Microsoft.CodeAnalysis.VisualBasic", "Microsoft.Extensions.ObjectPool"], "net47": ["MSBuild.StructuredLogger", "MessagePack", "Microsoft.CodeAnalysis", "Microsoft.CodeAnalysis.CSharp", "Microsoft.CodeAnalysis.VisualBasic", "Microsoft.Extensions.ObjectPool"], "net471": ["MSBuild.StructuredLogger", "MessagePack", "Microsoft.CodeAnalysis", "Microsoft.CodeAnalysis.CSharp", "Microsoft.CodeAnalysis.VisualBasic", "Microsoft.Extensions.ObjectPool"], "net472": ["MSBuild.StructuredLogger", "MessagePack", "Microsoft.CodeAnalysis", "Microsoft.CodeAnalysis.CSharp", "Microsoft.CodeAnalysis.VisualBasic", "Microsoft.Extensions.ObjectPool"], "net48": ["MSBuild.StructuredLogger", "MessagePack", "Microsoft.CodeAnalysis", "Microsoft.CodeAnalysis.CSharp", "Microsoft.CodeAnalysis.VisualBasic", "Microsoft.Extensions.ObjectPool"], "net5.0": ["MSBuild.StructuredLogger", "MessagePack", "Microsoft.CodeAnalysis", "Microsoft.CodeAnalysis.CSharp", "Microsoft.CodeAnalysis.VisualBasic", "Microsoft.Extensions.ObjectPool"], "net6.0": ["MSBuild.StructuredLogger", "MessagePack", "Microsoft.CodeAnalysis", "Microsoft.CodeAnalysis.CSharp", "Microsoft.CodeAnalysis.VisualBasic", "Microsoft.Extensions.ObjectPool"], "net7.0": ["MSBuild.StructuredLogger", "MessagePack", "Microsoft.CodeAnalysis", "Microsoft.CodeAnalysis.CSharp", "Microsoft.CodeAnalysis.VisualBasic", "Microsoft.Extensions.ObjectPool"], "net8.0": ["MSBuild.StructuredLogger", "MessagePack", "Microsoft.CodeAnalysis", "Microsoft.CodeAnalysis.CSharp", "Microsoft.CodeAnalysis.VisualBasic", "Microsoft.Extensions.ObjectPool"], "net9.0": ["MSBuild.StructuredLogger", "MessagePack", "Microsoft.CodeAnalysis", "Microsoft.CodeAnalysis.CSharp", "Microsoft.CodeAnalysis.VisualBasic", "Microsoft.Extensions.ObjectPool"], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": ["MSBuild.StructuredLogger", "MessagePack", "Microsoft.CodeAnalysis", "Microsoft.CodeAnalysis.CSharp", "Microsoft.CodeAnalysis.VisualBasic", "Microsoft.Extensions.ObjectPool"], "netcoreapp2.1": ["MSBuild.StructuredLogger", "MessagePack", "Microsoft.CodeAnalysis", "Microsoft.CodeAnalysis.CSharp", "Microsoft.CodeAnalysis.VisualBasic", "Microsoft.Extensions.ObjectPool"], "netcoreapp2.2": ["MSBuild.StructuredLogger", "MessagePack", "Microsoft.CodeAnalysis", "Microsoft.CodeAnalysis.CSharp", "Microsoft.CodeAnalysis.VisualBasic", "Microsoft.Extensions.ObjectPool"], "netcoreapp3.0": ["MSBuild.StructuredLogger", "MessagePack", "Microsoft.CodeAnalysis", "Microsoft.CodeAnalysis.CSharp", "Microsoft.CodeAnalysis.VisualBasic", "Microsoft.Extensions.ObjectPool"], "netcoreapp3.1": ["MSBuild.StructuredLogger", "MessagePack", "Microsoft.CodeAnalysis", "Microsoft.CodeAnalysis.CSharp", "Microsoft.CodeAnalysis.VisualBasic", "Microsoft.Extensions.ObjectPool"], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": ["MSBuild.StructuredLogger", "MessagePack", "Microsoft.CodeAnalysis", "Microsoft.CodeAnalysis.CSharp", "Microsoft.CodeAnalysis.VisualBasic", "Microsoft.Extensions.ObjectPool"], "netstandard2.1": ["MSBuild.StructuredLogger", "MessagePack", "Microsoft.CodeAnalysis", "Microsoft.CodeAnalysis.CSharp", "Microsoft.CodeAnalysis.VisualBasic", "Microsoft.Extensions.ObjectPool"]}, "targeting_pack_overrides": [], "framework_list": []}, {"name": "Humanizer.Core", "id": "Humanizer.Core", "version": "2.14.1", "sha512": "sha512-yzqGU/HKNLZ9Uvr6kvSc3wYV/S5O/IvklIUW5WF7MuivGLY8wS5IZnLPkt7D1KW8Et2Enl0I3Lzg2vGWM24Xsw==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": [], "net462": [], "net47": [], "net471": [], "net472": [], "net48": [], "net5.0": [], "net6.0": [], "net7.0": [], "net8.0": [], "net9.0": [], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": [], "netcoreapp2.1": [], "netcoreapp2.2": [], "netcoreapp3.0": [], "netcoreapp3.1": [], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": [], "netstandard2.1": []}, "targeting_pack_overrides": [], "framework_list": []}, - {"name": "MessagePack", "id": "MessagePack", "version": "2.5.129", "sha512": "sha512-wpw2dHkE5AcvMYKE4MrWuoeZ2jeaneDlqAgplxm6yKqPXeUVI2h5DPrKjsljnJSNRZOm3tunasw18Q9xj/3UoA==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": ["MessagePack.Annotations", "Microsoft.NET.StringTools", "System.Collections.Immutable", "System.Runtime.CompilerServices.Unsafe"], "net462": ["MessagePack.Annotations", "Microsoft.NET.StringTools", "System.Collections.Immutable", "System.Runtime.CompilerServices.Unsafe"], "net47": ["MessagePack.Annotations", "Microsoft.NET.StringTools", "System.Collections.Immutable", "System.Runtime.CompilerServices.Unsafe"], "net471": ["MessagePack.Annotations", "Microsoft.NET.StringTools", "System.Collections.Immutable", "System.Runtime.CompilerServices.Unsafe"], "net472": ["MessagePack.Annotations", "Microsoft.NET.StringTools", "System.Collections.Immutable", "System.Runtime.CompilerServices.Unsafe"], "net48": ["MessagePack.Annotations", "Microsoft.NET.StringTools", "System.Collections.Immutable", "System.Runtime.CompilerServices.Unsafe"], "net5.0": ["MessagePack.Annotations", "Microsoft.NET.StringTools", "System.Collections.Immutable", "System.Runtime.CompilerServices.Unsafe"], "net6.0": ["MessagePack.Annotations", "Microsoft.NET.StringTools", "System.Runtime.CompilerServices.Unsafe"], "net7.0": ["MessagePack.Annotations", "Microsoft.NET.StringTools", "System.Runtime.CompilerServices.Unsafe"], "net8.0": ["MessagePack.Annotations", "Microsoft.NET.StringTools", "System.Runtime.CompilerServices.Unsafe"], "net9.0": ["MessagePack.Annotations", "Microsoft.NET.StringTools", "System.Runtime.CompilerServices.Unsafe"], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": ["MessagePack.Annotations", "Microsoft.NET.StringTools", "System.Collections.Immutable", "System.Runtime.CompilerServices.Unsafe"], "netcoreapp2.1": ["MessagePack.Annotations", "Microsoft.NET.StringTools", "System.Collections.Immutable", "System.Runtime.CompilerServices.Unsafe"], "netcoreapp2.2": ["MessagePack.Annotations", "Microsoft.NET.StringTools", "System.Collections.Immutable", "System.Runtime.CompilerServices.Unsafe"], "netcoreapp3.0": ["MessagePack.Annotations", "Microsoft.NET.StringTools", "System.Collections.Immutable", "System.Runtime.CompilerServices.Unsafe"], "netcoreapp3.1": ["MessagePack.Annotations", "Microsoft.NET.StringTools", "System.Collections.Immutable", "System.Runtime.CompilerServices.Unsafe"], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": ["MessagePack.Annotations", "Microsoft.NET.StringTools", "System.Collections.Immutable", "System.Runtime.CompilerServices.Unsafe"], "netstandard2.1": ["MessagePack.Annotations", "Microsoft.NET.StringTools", "System.Collections.Immutable", "System.Runtime.CompilerServices.Unsafe"]}, "targeting_pack_overrides": [], "framework_list": []}, - {"name": "MessagePack.Annotations", "id": "MessagePack.Annotations", "version": "2.5.129", "sha512": "sha512-mr12dLr06Kp7Ra7+GUXHbuxt/gbi6RPGPw1mpSvZsubs7hJxzHDtYTb5KKuseu5cpzOUDfsGcaW+Bo0+lqCFAA==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": [], "net462": [], "net47": [], "net471": [], "net472": [], "net48": [], "net5.0": [], "net6.0": [], "net7.0": [], "net8.0": [], "net9.0": [], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": [], "netcoreapp2.1": [], "netcoreapp2.2": [], "netcoreapp3.0": [], "netcoreapp3.1": [], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": [], "netstandard2.1": []}, "targeting_pack_overrides": [], "framework_list": []}, + {"name": "MessagePack", "id": "MessagePack", "version": "2.5.192", "sha512": "sha512-SnrwSQIKWfxcQvzE1TCUPvJ7A/44KFBDcmCc+YUDIq8QalCf0bGAjiBoAFewhJ81QuS5FsCNCOcKn+IURYlbAQ==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": ["MessagePack.Annotations", "Microsoft.NET.StringTools", "System.Collections.Immutable", "System.Runtime.CompilerServices.Unsafe"], "net462": ["MessagePack.Annotations", "Microsoft.NET.StringTools", "System.Collections.Immutable", "System.Runtime.CompilerServices.Unsafe"], "net47": ["MessagePack.Annotations", "Microsoft.NET.StringTools", "System.Collections.Immutable", "System.Runtime.CompilerServices.Unsafe"], "net471": ["MessagePack.Annotations", "Microsoft.NET.StringTools", "System.Collections.Immutable", "System.Runtime.CompilerServices.Unsafe"], "net472": ["MessagePack.Annotations", "Microsoft.NET.StringTools", "System.Collections.Immutable", "System.Runtime.CompilerServices.Unsafe"], "net48": ["MessagePack.Annotations", "Microsoft.NET.StringTools", "System.Collections.Immutable", "System.Runtime.CompilerServices.Unsafe"], "net5.0": ["MessagePack.Annotations", "Microsoft.NET.StringTools", "System.Collections.Immutable", "System.Runtime.CompilerServices.Unsafe"], "net6.0": ["MessagePack.Annotations", "Microsoft.NET.StringTools"], "net7.0": ["MessagePack.Annotations", "Microsoft.NET.StringTools"], "net8.0": ["MessagePack.Annotations", "Microsoft.NET.StringTools"], "net9.0": ["MessagePack.Annotations", "Microsoft.NET.StringTools"], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": ["MessagePack.Annotations", "Microsoft.NET.StringTools", "System.Collections.Immutable", "System.Runtime.CompilerServices.Unsafe"], "netcoreapp2.1": ["MessagePack.Annotations", "Microsoft.NET.StringTools", "System.Collections.Immutable", "System.Runtime.CompilerServices.Unsafe"], "netcoreapp2.2": ["MessagePack.Annotations", "Microsoft.NET.StringTools", "System.Collections.Immutable", "System.Runtime.CompilerServices.Unsafe"], "netcoreapp3.0": ["MessagePack.Annotations", "Microsoft.NET.StringTools", "System.Collections.Immutable", "System.Runtime.CompilerServices.Unsafe"], "netcoreapp3.1": ["MessagePack.Annotations", "Microsoft.NET.StringTools", "System.Collections.Immutable", "System.Runtime.CompilerServices.Unsafe"], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": ["MessagePack.Annotations", "Microsoft.NET.StringTools", "System.Collections.Immutable", "System.Runtime.CompilerServices.Unsafe"], "netstandard2.1": ["MessagePack.Annotations", "Microsoft.NET.StringTools", "System.Collections.Immutable", "System.Runtime.CompilerServices.Unsafe"]}, "targeting_pack_overrides": [], "framework_list": []}, + {"name": "MessagePack.Annotations", "id": "MessagePack.Annotations", "version": "2.5.192", "sha512": "sha512-pE/SD2N0+nDAU8BtTHqjyIhLM2L5Mb0NiO4hW0ybiv2I+BbK0JEaGtbKpeEmOvKT+5s2hds0gvk/GrAHhgcpdw==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": [], "net462": [], "net47": [], "net471": [], "net472": [], "net48": [], "net5.0": [], "net6.0": [], "net7.0": [], "net8.0": [], "net9.0": [], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": [], "netcoreapp2.1": [], "netcoreapp2.2": [], "netcoreapp3.0": [], "netcoreapp3.1": [], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": [], "netstandard2.1": []}, "targeting_pack_overrides": [], "framework_list": []}, {"name": "Microsoft.Build", "id": "Microsoft.Build", "version": "17.8.3", "sha512": "sha512-jRz++ltVTU9xGAYSnI7fGwLIsg/AwINaxlXaJrcMszO+fyh1xJ8gKZkDz10foT/5y26jZC6G93wyp85NVHc+lA==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": [], "net462": [], "net47": [], "net471": [], "net472": ["Microsoft.Build.Framework", "Microsoft.NET.StringTools", "System.Collections.Immutable", "System.Configuration.ConfigurationManager", "System.Reflection.MetadataLoadContext", "System.Security.Principal.Windows", "System.Threading.Tasks.Dataflow", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe"], "net48": ["Microsoft.Build.Framework", "Microsoft.NET.StringTools", "System.Collections.Immutable", "System.Configuration.ConfigurationManager", "System.Reflection.MetadataLoadContext", "System.Security.Principal.Windows", "System.Threading.Tasks.Dataflow", "System.Reflection.Metadata", "System.Runtime.CompilerServices.Unsafe"], "net5.0": [], "net6.0": [], "net7.0": [], "net8.0": ["Microsoft.Build.Framework", "Microsoft.NET.StringTools", "System.Collections.Immutable", "System.Configuration.ConfigurationManager", "System.Reflection.MetadataLoadContext", "System.Security.Principal.Windows", "System.Threading.Tasks.Dataflow", "System.Reflection.Metadata"], "net9.0": ["Microsoft.Build.Framework", "Microsoft.NET.StringTools", "System.Collections.Immutable", "System.Configuration.ConfigurationManager", "System.Reflection.MetadataLoadContext", "System.Security.Principal.Windows", "System.Threading.Tasks.Dataflow", "System.Reflection.Metadata"], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": [], "netcoreapp2.1": [], "netcoreapp2.2": [], "netcoreapp3.0": [], "netcoreapp3.1": [], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": [], "netstandard2.1": []}, "targeting_pack_overrides": [], "framework_list": []}, {"name": "Microsoft.Build.Framework", "id": "Microsoft.Build.Framework", "version": "17.8.3", "sha512": "sha512-xDOoj8lpNohM0Sieo4sJ47m/3SAquclF8wFZeAYYuDRHc8hII4XWPhSafFmw5A4TMGOyV08Z1TrrqES9HxMB3Q==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": ["System.Runtime.CompilerServices.Unsafe", "System.Security.Principal.Windows"], "net462": ["System.Runtime.CompilerServices.Unsafe", "System.Security.Principal.Windows"], "net47": ["System.Runtime.CompilerServices.Unsafe", "System.Security.Principal.Windows"], "net471": ["System.Runtime.CompilerServices.Unsafe", "System.Security.Principal.Windows"], "net472": ["System.Runtime.CompilerServices.Unsafe"], "net48": ["System.Runtime.CompilerServices.Unsafe"], "net5.0": ["System.Runtime.CompilerServices.Unsafe", "System.Security.Principal.Windows"], "net6.0": ["System.Runtime.CompilerServices.Unsafe", "System.Security.Principal.Windows"], "net7.0": ["System.Runtime.CompilerServices.Unsafe", "System.Security.Principal.Windows"], "net8.0": [], "net9.0": [], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": ["System.Runtime.CompilerServices.Unsafe", "System.Security.Principal.Windows"], "netcoreapp2.1": ["System.Runtime.CompilerServices.Unsafe", "System.Security.Principal.Windows"], "netcoreapp2.2": ["System.Runtime.CompilerServices.Unsafe", "System.Security.Principal.Windows"], "netcoreapp3.0": ["System.Runtime.CompilerServices.Unsafe", "System.Security.Principal.Windows"], "netcoreapp3.1": ["System.Runtime.CompilerServices.Unsafe", "System.Security.Principal.Windows"], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": ["System.Runtime.CompilerServices.Unsafe", "System.Security.Principal.Windows"], "netstandard2.1": ["System.Runtime.CompilerServices.Unsafe", "System.Security.Principal.Windows"]}, "targeting_pack_overrides": [], "framework_list": []}, {"name": "Microsoft.Build.Utilities.Core", "id": "Microsoft.Build.Utilities.Core", "version": "17.5.0", "sha512": "sha512-La1NFQ7SVz1pVGEUnG15BQG26jJkRMCiitySBXLhuTYf9IG6eZ5j5UFjnM4EFKSVKbictRv+D/F0dQtsCiK9ag==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": ["Microsoft.Build.Framework", "Microsoft.NET.StringTools", "System.Collections.Immutable", "System.Configuration.ConfigurationManager", "System.Security.Permissions"], "net462": ["Microsoft.Build.Framework", "Microsoft.NET.StringTools", "System.Collections.Immutable", "System.Configuration.ConfigurationManager", "System.Security.Permissions"], "net47": ["Microsoft.Build.Framework", "Microsoft.NET.StringTools", "System.Collections.Immutable", "System.Configuration.ConfigurationManager", "System.Security.Permissions"], "net471": ["Microsoft.Build.Framework", "Microsoft.NET.StringTools", "System.Collections.Immutable", "System.Configuration.ConfigurationManager", "System.Security.Permissions"], "net472": ["Microsoft.Build.Framework", "Microsoft.NET.StringTools", "System.Collections.Immutable", "System.Configuration.ConfigurationManager"], "net48": ["Microsoft.Build.Framework", "Microsoft.NET.StringTools", "System.Collections.Immutable", "System.Configuration.ConfigurationManager"], "net5.0": ["Microsoft.Build.Framework", "Microsoft.NET.StringTools", "System.Collections.Immutable", "System.Configuration.ConfigurationManager", "System.Security.Permissions"], "net6.0": ["Microsoft.Build.Framework", "Microsoft.NET.StringTools", "System.Collections.Immutable", "System.Configuration.ConfigurationManager", "System.Security.Permissions"], "net7.0": ["Microsoft.Build.Framework", "Microsoft.NET.StringTools", "System.Collections.Immutable", "System.Configuration.ConfigurationManager"], "net8.0": ["Microsoft.Build.Framework", "Microsoft.NET.StringTools", "System.Collections.Immutable", "System.Configuration.ConfigurationManager"], "net9.0": ["Microsoft.Build.Framework", "Microsoft.NET.StringTools", "System.Collections.Immutable", "System.Configuration.ConfigurationManager"], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": ["Microsoft.Build.Framework", "Microsoft.NET.StringTools", "System.Collections.Immutable", "System.Configuration.ConfigurationManager", "System.Security.Permissions"], "netcoreapp2.1": ["Microsoft.Build.Framework", "Microsoft.NET.StringTools", "System.Collections.Immutable", "System.Configuration.ConfigurationManager", "System.Security.Permissions"], "netcoreapp2.2": ["Microsoft.Build.Framework", "Microsoft.NET.StringTools", "System.Collections.Immutable", "System.Configuration.ConfigurationManager", "System.Security.Permissions"], "netcoreapp3.0": ["Microsoft.Build.Framework", "Microsoft.NET.StringTools", "System.Collections.Immutable", "System.Configuration.ConfigurationManager", "System.Security.Permissions"], "netcoreapp3.1": ["Microsoft.Build.Framework", "Microsoft.NET.StringTools", "System.Collections.Immutable", "System.Configuration.ConfigurationManager", "System.Security.Permissions"], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": ["Microsoft.Build.Framework", "Microsoft.NET.StringTools", "System.Collections.Immutable", "System.Configuration.ConfigurationManager", "System.Security.Permissions"], "netstandard2.1": ["Microsoft.Build.Framework", "Microsoft.NET.StringTools", "System.Collections.Immutable", "System.Configuration.ConfigurationManager", "System.Security.Permissions"]}, "targeting_pack_overrides": [], "framework_list": []}, @@ -22,14 +22,14 @@ def main(): {"name": "Microsoft.CodeAnalysis.VisualBasic", "id": "Microsoft.CodeAnalysis.VisualBasic", "version": "4.9.2", "sha512": "sha512-Jx3d7jpZ2bdCb/FzVBPD2a4P8jFDhdoEugGoxLxVKtBDzHA5+RdQL0BWvzwrP1Tdw3YPshrUelNlZXmcNXqZyA==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": ["Microsoft.CodeAnalysis.Common"], "net462": ["Microsoft.CodeAnalysis.Common"], "net47": ["Microsoft.CodeAnalysis.Common"], "net471": ["Microsoft.CodeAnalysis.Common"], "net472": ["Microsoft.CodeAnalysis.Common"], "net48": ["Microsoft.CodeAnalysis.Common"], "net5.0": ["Microsoft.CodeAnalysis.Common"], "net6.0": ["Microsoft.CodeAnalysis.Common"], "net7.0": ["Microsoft.CodeAnalysis.Common"], "net8.0": ["Microsoft.CodeAnalysis.Common"], "net9.0": ["Microsoft.CodeAnalysis.Common"], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": ["Microsoft.CodeAnalysis.Common"], "netcoreapp2.1": ["Microsoft.CodeAnalysis.Common"], "netcoreapp2.2": ["Microsoft.CodeAnalysis.Common"], "netcoreapp3.0": ["Microsoft.CodeAnalysis.Common"], "netcoreapp3.1": ["Microsoft.CodeAnalysis.Common"], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": ["Microsoft.CodeAnalysis.Common"], "netstandard2.1": ["Microsoft.CodeAnalysis.Common"]}, "targeting_pack_overrides": [], "framework_list": []}, {"name": "Microsoft.CodeAnalysis.VisualBasic.Workspaces", "id": "Microsoft.CodeAnalysis.VisualBasic.Workspaces", "version": "4.9.2", "sha512": "sha512-v07rvZvckHiPLDzKXFs9AXfEGsDeTvR+N9YHO9wQqboXgms4HCv0fTrZOOgqM/aVS7racJKRo1tf62UfjqMeEw==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.VisualBasic", "Microsoft.CodeAnalysis.Workspaces.Common"], "net462": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.VisualBasic", "Microsoft.CodeAnalysis.Workspaces.Common"], "net47": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.VisualBasic", "Microsoft.CodeAnalysis.Workspaces.Common"], "net471": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.VisualBasic", "Microsoft.CodeAnalysis.Workspaces.Common"], "net472": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.VisualBasic", "Microsoft.CodeAnalysis.Workspaces.Common"], "net48": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.VisualBasic", "Microsoft.CodeAnalysis.Workspaces.Common"], "net5.0": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.VisualBasic", "Microsoft.CodeAnalysis.Workspaces.Common"], "net6.0": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.VisualBasic", "Microsoft.CodeAnalysis.Workspaces.Common"], "net7.0": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.VisualBasic", "Microsoft.CodeAnalysis.Workspaces.Common"], "net8.0": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.VisualBasic", "Microsoft.CodeAnalysis.Workspaces.Common"], "net9.0": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.VisualBasic", "Microsoft.CodeAnalysis.Workspaces.Common"], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.VisualBasic", "Microsoft.CodeAnalysis.Workspaces.Common"], "netcoreapp2.1": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.VisualBasic", "Microsoft.CodeAnalysis.Workspaces.Common"], "netcoreapp2.2": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.VisualBasic", "Microsoft.CodeAnalysis.Workspaces.Common"], "netcoreapp3.0": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.VisualBasic", "Microsoft.CodeAnalysis.Workspaces.Common"], "netcoreapp3.1": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.VisualBasic", "Microsoft.CodeAnalysis.Workspaces.Common"], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.VisualBasic", "Microsoft.CodeAnalysis.Workspaces.Common"], "netstandard2.1": ["Microsoft.CodeAnalysis.Common", "Microsoft.CodeAnalysis.VisualBasic", "Microsoft.CodeAnalysis.Workspaces.Common"]}, "targeting_pack_overrides": [], "framework_list": []}, {"name": "Microsoft.CodeAnalysis.Workspaces.Common", "id": "Microsoft.CodeAnalysis.Workspaces.Common", "version": "4.9.2", "sha512": "sha512-DieswZYcYVGDPeT6m7M4i+0aKkjSgyjmI9z9HJEDSRZdvXfKYLEKwmlFGUTyzFS4brnyMCwLSiw2KWVAydpzVA==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": ["Microsoft.CodeAnalysis.Common", "Humanizer.Core", "System.Composition", "System.IO.Pipelines", "System.Threading.Channels"], "net462": ["Microsoft.CodeAnalysis.Common", "Humanizer.Core", "System.Composition", "System.IO.Pipelines", "System.Threading.Channels"], "net47": ["Microsoft.CodeAnalysis.Common", "Humanizer.Core", "System.Composition", "System.IO.Pipelines", "System.Threading.Channels"], "net471": ["Microsoft.CodeAnalysis.Common", "Humanizer.Core", "System.Composition", "System.IO.Pipelines", "System.Threading.Channels"], "net472": ["Microsoft.CodeAnalysis.Common", "Humanizer.Core", "System.Composition", "System.IO.Pipelines", "System.Threading.Channels"], "net48": ["Microsoft.CodeAnalysis.Common", "Humanizer.Core", "System.Composition", "System.IO.Pipelines", "System.Threading.Channels"], "net5.0": ["Microsoft.CodeAnalysis.Common", "Humanizer.Core", "System.Composition", "System.IO.Pipelines", "System.Threading.Channels"], "net6.0": ["Microsoft.CodeAnalysis.Common", "Humanizer.Core", "System.Composition", "System.IO.Pipelines", "System.Threading.Channels"], "net7.0": ["Microsoft.CodeAnalysis.Common", "Humanizer.Core", "System.Composition", "System.IO.Pipelines", "System.Threading.Channels"], "net8.0": ["Microsoft.CodeAnalysis.Common", "Humanizer.Core", "System.Composition", "System.IO.Pipelines", "System.Threading.Channels"], "net9.0": ["Microsoft.CodeAnalysis.Common", "Humanizer.Core", "System.Composition", "System.IO.Pipelines", "System.Threading.Channels"], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": ["Microsoft.CodeAnalysis.Common", "Humanizer.Core", "System.Composition", "System.IO.Pipelines", "System.Threading.Channels"], "netcoreapp2.1": ["Microsoft.CodeAnalysis.Common", "Humanizer.Core", "System.Composition", "System.IO.Pipelines", "System.Threading.Channels"], "netcoreapp2.2": ["Microsoft.CodeAnalysis.Common", "Humanizer.Core", "System.Composition", "System.IO.Pipelines", "System.Threading.Channels"], "netcoreapp3.0": ["Microsoft.CodeAnalysis.Common", "Humanizer.Core", "System.Composition", "System.IO.Pipelines", "System.Threading.Channels"], "netcoreapp3.1": ["Microsoft.CodeAnalysis.Common", "Humanizer.Core", "System.Composition", "System.IO.Pipelines", "System.Threading.Channels"], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": ["Microsoft.CodeAnalysis.Common", "Humanizer.Core", "System.Composition", "System.IO.Pipelines", "System.Threading.Channels"], "netstandard2.1": ["Microsoft.CodeAnalysis.Common", "Humanizer.Core", "System.Composition", "System.IO.Pipelines", "System.Threading.Channels"]}, "targeting_pack_overrides": [], "framework_list": []}, - {"name": "Microsoft.CodeCoverage", "id": "Microsoft.CodeCoverage", "version": "17.11.1", "sha512": "sha512-ZJ4Ch1u7AemIzNpc0BbLoysJ0dJildIvAybL2vBUfbqho86N2VqzX9PGNc9a9pemZ//1Y6AOJ7SJxi/pCvLhHA==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": [], "net462": [], "net47": [], "net471": [], "net472": [], "net48": [], "net5.0": [], "net6.0": [], "net7.0": [], "net8.0": [], "net9.0": [], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": [], "netcoreapp2.1": [], "netcoreapp2.2": [], "netcoreapp3.0": [], "netcoreapp3.1": [], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": [], "netstandard2.1": []}, "targeting_pack_overrides": [], "framework_list": []}, + {"name": "Microsoft.CodeCoverage", "id": "Microsoft.CodeCoverage", "version": "17.12.0", "sha512": "sha512-POBqg788rrLApvncy8rvtyJ3ynsBdU0/SGUXD+vPqyRDM/aUJbPZWx01qalGJRK1GcArSku8QDd9AVMa0TkCkA==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": [], "net462": [], "net47": [], "net471": [], "net472": [], "net48": [], "net5.0": [], "net6.0": [], "net7.0": [], "net8.0": [], "net9.0": [], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": [], "netcoreapp2.1": [], "netcoreapp2.2": [], "netcoreapp3.0": [], "netcoreapp3.1": [], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": [], "netstandard2.1": []}, "targeting_pack_overrides": [], "framework_list": []}, {"name": "Microsoft.Extensions.ObjectPool", "id": "Microsoft.Extensions.ObjectPool", "version": "7.0.13", "sha512": "sha512-N66kAzKBfcs4zIX/iVMUOhfn8Xv3Ye1QpLGS8IUSpCHa+Vxh2ZsdDiqd0Y2m7ryPU6FU2LOTnZ+0ymmm83vC6w==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": [], "net462": [], "net47": [], "net471": [], "net472": [], "net48": [], "net5.0": [], "net6.0": [], "net7.0": [], "net8.0": [], "net9.0": [], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": [], "netcoreapp2.1": [], "netcoreapp2.2": [], "netcoreapp3.0": [], "netcoreapp3.1": [], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": [], "netstandard2.1": []}, "targeting_pack_overrides": [], "framework_list": []}, {"name": "Microsoft.NET.StringTools", "id": "Microsoft.NET.StringTools", "version": "17.8.3", "sha512": "sha512-3N/Ika66JZeORrIZ68fap6M0LSQ9+SQz277NxjA/dxETnR3dZwJXj67jAAc4FkijG6w//QzrC5NEregtIVjz1w==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": [], "net462": [], "net47": [], "net471": [], "net472": ["System.Runtime.CompilerServices.Unsafe"], "net48": ["System.Runtime.CompilerServices.Unsafe"], "net5.0": ["System.Runtime.CompilerServices.Unsafe"], "net6.0": ["System.Runtime.CompilerServices.Unsafe"], "net7.0": ["System.Runtime.CompilerServices.Unsafe"], "net8.0": [], "net9.0": [], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": ["System.Runtime.CompilerServices.Unsafe"], "netcoreapp2.1": ["System.Runtime.CompilerServices.Unsafe"], "netcoreapp2.2": ["System.Runtime.CompilerServices.Unsafe"], "netcoreapp3.0": ["System.Runtime.CompilerServices.Unsafe"], "netcoreapp3.1": ["System.Runtime.CompilerServices.Unsafe"], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": ["System.Runtime.CompilerServices.Unsafe"], "netstandard2.1": ["System.Runtime.CompilerServices.Unsafe"]}, "targeting_pack_overrides": [], "framework_list": []}, - {"name": "Microsoft.NET.Test.Sdk", "id": "Microsoft.NET.Test.Sdk", "version": "17.11.1", "sha512": "sha512-k3ULrpyrTHKhVeKqdFwiUDOwqKVRtVTcyjmfKqKw/NrIHJ54mkTaGlU5ARUakDC894X1wTyXtdmzzaDZqelliA==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": [], "net462": ["Microsoft.CodeCoverage"], "net47": ["Microsoft.CodeCoverage"], "net471": ["Microsoft.CodeCoverage"], "net472": ["Microsoft.CodeCoverage"], "net48": ["Microsoft.CodeCoverage"], "net5.0": ["Microsoft.TestPlatform.TestHost", "Microsoft.CodeCoverage"], "net6.0": ["Microsoft.TestPlatform.TestHost", "Microsoft.CodeCoverage"], "net7.0": ["Microsoft.TestPlatform.TestHost", "Microsoft.CodeCoverage"], "net8.0": ["Microsoft.TestPlatform.TestHost", "Microsoft.CodeCoverage"], "net9.0": ["Microsoft.TestPlatform.TestHost", "Microsoft.CodeCoverage"], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": [], "netcoreapp2.1": [], "netcoreapp2.2": [], "netcoreapp3.0": [], "netcoreapp3.1": ["Microsoft.TestPlatform.TestHost", "Microsoft.CodeCoverage"], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": [], "netstandard2.1": []}, "targeting_pack_overrides": [], "framework_list": []}, + {"name": "Microsoft.NET.Test.Sdk", "id": "Microsoft.NET.Test.Sdk", "version": "17.12.0", "sha512": "sha512-hGf8I8+yo15etavoMd+7OXcOG6/G7HYPDEJg5aQnhMzsxaUpq+udNZzSxmEN9rGTWMZOAVFcyNXNL7YBsN6chw==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": [], "net462": ["Microsoft.CodeCoverage"], "net47": ["Microsoft.CodeCoverage"], "net471": ["Microsoft.CodeCoverage"], "net472": ["Microsoft.CodeCoverage"], "net48": ["Microsoft.CodeCoverage"], "net5.0": ["Microsoft.TestPlatform.TestHost", "Microsoft.CodeCoverage"], "net6.0": ["Microsoft.TestPlatform.TestHost", "Microsoft.CodeCoverage"], "net7.0": ["Microsoft.TestPlatform.TestHost", "Microsoft.CodeCoverage"], "net8.0": ["Microsoft.TestPlatform.TestHost", "Microsoft.CodeCoverage"], "net9.0": ["Microsoft.TestPlatform.TestHost", "Microsoft.CodeCoverage"], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": [], "netcoreapp2.1": [], "netcoreapp2.2": [], "netcoreapp3.0": [], "netcoreapp3.1": ["Microsoft.TestPlatform.TestHost", "Microsoft.CodeCoverage"], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": [], "netstandard2.1": []}, "targeting_pack_overrides": [], "framework_list": []}, {"name": "Microsoft.NETCore.Platforms", "id": "Microsoft.NETCore.Platforms", "version": "1.1.1", "sha512": "sha512-mDUJD1eLXIzmUnWCzWlmNQZGDp/cVGT8KyhzMcJNk2nlfdFUOoZai9idT8/FacJr8Nv8zhAmdf39FHm5qWUoGQ==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": [], "net462": [], "net47": [], "net471": [], "net472": [], "net48": [], "net5.0": [], "net6.0": [], "net7.0": [], "net8.0": [], "net9.0": [], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": [], "netcoreapp2.1": [], "netcoreapp2.2": [], "netcoreapp3.0": [], "netcoreapp3.1": [], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": [], "netstandard2.1": []}, "targeting_pack_overrides": [], "framework_list": []}, {"name": "Microsoft.NETCore.Targets", "id": "Microsoft.NETCore.Targets", "version": "1.1.3", "sha512": "sha512-pxwq8g2PYRiEF5KXVjmZFMNTqsg2Gr1puv/pR1sqAduAKHAGbaCuJ6+yc3pAJseClQUD29S2Ubrm7n/ZD78dUg==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": [], "net462": [], "net47": [], "net471": [], "net472": [], "net48": [], "net5.0": [], "net6.0": [], "net7.0": [], "net8.0": [], "net9.0": [], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": [], "netcoreapp2.1": [], "netcoreapp2.2": [], "netcoreapp3.0": [], "netcoreapp3.1": [], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": [], "netstandard2.1": []}, "targeting_pack_overrides": [], "framework_list": []}, - {"name": "Microsoft.TestPlatform.ObjectModel", "id": "Microsoft.TestPlatform.ObjectModel", "version": "17.11.1", "sha512": "sha512-9hJ6Gbf3IaPwOP2qgdADYLEk9NXtAsp5y3szBogAe0lj7zaBWU0n8GiCVxpJL8RaoPee46qlJBfZcu1z9DQgAA==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": ["System.Reflection.Metadata"], "net462": ["System.Reflection.Metadata"], "net47": ["System.Reflection.Metadata"], "net471": ["System.Reflection.Metadata"], "net472": ["System.Reflection.Metadata"], "net48": ["System.Reflection.Metadata"], "net5.0": ["System.Reflection.Metadata"], "net6.0": ["System.Reflection.Metadata"], "net7.0": ["System.Reflection.Metadata"], "net8.0": ["System.Reflection.Metadata"], "net9.0": ["System.Reflection.Metadata"], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": ["System.Reflection.Metadata"], "netcoreapp2.1": ["System.Reflection.Metadata"], "netcoreapp2.2": ["System.Reflection.Metadata"], "netcoreapp3.0": ["System.Reflection.Metadata"], "netcoreapp3.1": ["System.Reflection.Metadata"], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": ["System.Reflection.Metadata"], "netstandard2.1": ["System.Reflection.Metadata"]}, "targeting_pack_overrides": [], "framework_list": []}, - {"name": "Microsoft.TestPlatform.TestHost", "id": "Microsoft.TestPlatform.TestHost", "version": "17.11.1", "sha512": "sha512-deRHZRRzHUWbCu31aoFmFt9qelMkDmuBsgJ3jgqQt8KEIj2Tx0R1Qe7nDRZ3YUF84YGICMXMBd+BABtWRw3Wxg==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": [], "net462": [], "net47": [], "net471": [], "net472": [], "net48": [], "net5.0": ["Microsoft.TestPlatform.ObjectModel", "Newtonsoft.Json"], "net6.0": ["Microsoft.TestPlatform.ObjectModel", "Newtonsoft.Json"], "net7.0": ["Microsoft.TestPlatform.ObjectModel", "Newtonsoft.Json"], "net8.0": ["Microsoft.TestPlatform.ObjectModel", "Newtonsoft.Json"], "net9.0": ["Microsoft.TestPlatform.ObjectModel", "Newtonsoft.Json"], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": [], "netcoreapp2.1": [], "netcoreapp2.2": [], "netcoreapp3.0": [], "netcoreapp3.1": ["Microsoft.TestPlatform.ObjectModel", "Newtonsoft.Json"], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": [], "netstandard2.1": []}, "targeting_pack_overrides": [], "framework_list": []}, + {"name": "Microsoft.TestPlatform.ObjectModel", "id": "Microsoft.TestPlatform.ObjectModel", "version": "17.12.0", "sha512": "sha512-klsXMgAPNWYo3ceakLkod4wYrk4lAV2Ehi676zUKgiVpQ5Yj6q3vsMhk/3pm97Ltk/hdcSW0rJKJvcQvTzPgYA==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": ["System.Reflection.Metadata"], "net462": ["System.Reflection.Metadata"], "net47": ["System.Reflection.Metadata"], "net471": ["System.Reflection.Metadata"], "net472": ["System.Reflection.Metadata"], "net48": ["System.Reflection.Metadata"], "net5.0": ["System.Reflection.Metadata"], "net6.0": ["System.Reflection.Metadata"], "net7.0": ["System.Reflection.Metadata"], "net8.0": ["System.Reflection.Metadata"], "net9.0": ["System.Reflection.Metadata"], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": ["System.Reflection.Metadata"], "netcoreapp2.1": ["System.Reflection.Metadata"], "netcoreapp2.2": ["System.Reflection.Metadata"], "netcoreapp3.0": ["System.Reflection.Metadata"], "netcoreapp3.1": ["System.Reflection.Metadata"], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": ["System.Reflection.Metadata"], "netstandard2.1": ["System.Reflection.Metadata"]}, "targeting_pack_overrides": [], "framework_list": []}, + {"name": "Microsoft.TestPlatform.TestHost", "id": "Microsoft.TestPlatform.TestHost", "version": "17.12.0", "sha512": "sha512-gYM2BOGQvFEP2fZt61f3f5Gu+imL1G1bvGUrbJjpYcl66R6uzs5yESg0XMn8IgUgldz8RldOOaYmjk2KcSeG1Q==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": [], "net462": [], "net47": [], "net471": [], "net472": [], "net48": [], "net5.0": ["Microsoft.TestPlatform.ObjectModel", "Newtonsoft.Json"], "net6.0": ["Microsoft.TestPlatform.ObjectModel", "Newtonsoft.Json"], "net7.0": ["Microsoft.TestPlatform.ObjectModel", "Newtonsoft.Json"], "net8.0": ["Microsoft.TestPlatform.ObjectModel", "Newtonsoft.Json"], "net9.0": ["Microsoft.TestPlatform.ObjectModel", "Newtonsoft.Json"], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": [], "netcoreapp2.1": [], "netcoreapp2.2": [], "netcoreapp3.0": [], "netcoreapp3.1": ["Microsoft.TestPlatform.ObjectModel", "Newtonsoft.Json"], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": [], "netstandard2.1": []}, "targeting_pack_overrides": [], "framework_list": []}, {"name": "Microsoft.Win32.Primitives", "id": "Microsoft.Win32.Primitives", "version": "4.3.0", "sha512": "sha512-Nm8Hp51y9tYcK3xD6qk43Wjftrg1mdH24CCJsTb6gr7HS21U1uA+CKPGEtUcVZbjU1y8Kynzm5eoJ7Pnx5gm8A==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": [], "net462": [], "net47": [], "net471": [], "net472": [], "net48": [], "net5.0": ["Microsoft.NETCore.Platforms", "Microsoft.NETCore.Targets", "System.Runtime"], "net6.0": ["Microsoft.NETCore.Platforms", "Microsoft.NETCore.Targets", "System.Runtime"], "net7.0": ["Microsoft.NETCore.Platforms", "Microsoft.NETCore.Targets", "System.Runtime"], "net8.0": ["Microsoft.NETCore.Platforms", "Microsoft.NETCore.Targets", "System.Runtime"], "net9.0": ["Microsoft.NETCore.Platforms", "Microsoft.NETCore.Targets", "System.Runtime"], "netcoreapp1.0": ["Microsoft.NETCore.Platforms", "Microsoft.NETCore.Targets", "System.Runtime"], "netcoreapp1.1": ["Microsoft.NETCore.Platforms", "Microsoft.NETCore.Targets", "System.Runtime"], "netcoreapp2.0": ["Microsoft.NETCore.Platforms", "Microsoft.NETCore.Targets", "System.Runtime"], "netcoreapp2.1": ["Microsoft.NETCore.Platforms", "Microsoft.NETCore.Targets", "System.Runtime"], "netcoreapp2.2": ["Microsoft.NETCore.Platforms", "Microsoft.NETCore.Targets", "System.Runtime"], "netcoreapp3.0": ["Microsoft.NETCore.Platforms", "Microsoft.NETCore.Targets", "System.Runtime"], "netcoreapp3.1": ["Microsoft.NETCore.Platforms", "Microsoft.NETCore.Targets", "System.Runtime"], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": ["Microsoft.NETCore.Platforms", "Microsoft.NETCore.Targets", "System.Runtime"], "netstandard1.4": ["Microsoft.NETCore.Platforms", "Microsoft.NETCore.Targets", "System.Runtime"], "netstandard1.5": ["Microsoft.NETCore.Platforms", "Microsoft.NETCore.Targets", "System.Runtime"], "netstandard1.6": ["Microsoft.NETCore.Platforms", "Microsoft.NETCore.Targets", "System.Runtime"], "netstandard2.0": ["Microsoft.NETCore.Platforms", "Microsoft.NETCore.Targets", "System.Runtime"], "netstandard2.1": ["Microsoft.NETCore.Platforms", "Microsoft.NETCore.Targets", "System.Runtime"]}, "targeting_pack_overrides": [], "framework_list": []}, {"name": "Microsoft.Win32.SystemEvents", "id": "Microsoft.Win32.SystemEvents", "version": "7.0.0", "sha512": "sha512-GO6SWx/wSZIFvxOn67Y6OiIGdz9JGCg5CRDDbSAAvBDQeZFbybu9sEOUb9w/vUlQv+A2XakTFZg9Ug1w+tgbWQ==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": [], "net462": [], "net47": [], "net471": [], "net472": [], "net48": [], "net5.0": [], "net6.0": [], "net7.0": [], "net8.0": [], "net9.0": [], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": [], "netcoreapp2.1": [], "netcoreapp2.2": [], "netcoreapp3.0": [], "netcoreapp3.1": [], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": [], "netstandard2.1": []}, "targeting_pack_overrides": [], "framework_list": []}, {"name": "Mono.Posix.NETStandard", "id": "Mono.Posix.NETStandard", "version": "1.0.0", "sha512": "sha512-RtGiutQZJAmajvQ0QvBvh73VJye85iW9f9tjZlzF88idLxNMo4lAktP/4Y9ilCpais0LDO0tpoICt9Hdv6wooA==", "sources": ["https://api.nuget.org/v3/index.json"], "dependencies": {"net11": [], "net20": [], "net30": [], "net35": [], "net40": [], "net403": [], "net45": [], "net451": [], "net452": [], "net46": [], "net461": [], "net462": [], "net47": [], "net471": [], "net472": [], "net48": [], "net5.0": [], "net6.0": [], "net7.0": [], "net8.0": [], "net9.0": [], "netcoreapp1.0": [], "netcoreapp1.1": [], "netcoreapp2.0": [], "netcoreapp2.1": [], "netcoreapp2.2": [], "netcoreapp3.0": [], "netcoreapp3.1": [], "netstandard": [], "netstandard1.0": [], "netstandard1.1": [], "netstandard1.2": [], "netstandard1.3": [], "netstandard1.4": [], "netstandard1.5": [], "netstandard1.6": [], "netstandard2.0": [], "netstandard2.1": []}, "targeting_pack_overrides": [], "framework_list": []}, diff --git a/csharp/ql/campaigns/Solorigate/lib/CHANGELOG.md b/csharp/ql/campaigns/Solorigate/lib/CHANGELOG.md index 7b5cb257096..a71f93aacd4 100644 --- a/csharp/ql/campaigns/Solorigate/lib/CHANGELOG.md +++ b/csharp/ql/campaigns/Solorigate/lib/CHANGELOG.md @@ -1,3 +1,11 @@ +## 1.7.30 + +No user-facing changes. + +## 1.7.29 + +No user-facing changes. + ## 1.7.28 No user-facing changes. diff --git a/csharp/ql/campaigns/Solorigate/lib/change-notes/released/1.7.29.md b/csharp/ql/campaigns/Solorigate/lib/change-notes/released/1.7.29.md new file mode 100644 index 00000000000..6ff68866478 --- /dev/null +++ b/csharp/ql/campaigns/Solorigate/lib/change-notes/released/1.7.29.md @@ -0,0 +1,3 @@ +## 1.7.29 + +No user-facing changes. diff --git a/csharp/ql/campaigns/Solorigate/lib/change-notes/released/1.7.30.md b/csharp/ql/campaigns/Solorigate/lib/change-notes/released/1.7.30.md new file mode 100644 index 00000000000..8fb79827401 --- /dev/null +++ b/csharp/ql/campaigns/Solorigate/lib/change-notes/released/1.7.30.md @@ -0,0 +1,3 @@ +## 1.7.30 + +No user-facing changes. diff --git a/csharp/ql/campaigns/Solorigate/lib/codeql-pack.release.yml b/csharp/ql/campaigns/Solorigate/lib/codeql-pack.release.yml index ff17fbaf982..c0346e526b9 100644 --- a/csharp/ql/campaigns/Solorigate/lib/codeql-pack.release.yml +++ b/csharp/ql/campaigns/Solorigate/lib/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.7.28 +lastReleaseVersion: 1.7.30 diff --git a/csharp/ql/campaigns/Solorigate/lib/qlpack.yml b/csharp/ql/campaigns/Solorigate/lib/qlpack.yml index cccebfc4f3f..781915bf1a1 100644 --- a/csharp/ql/campaigns/Solorigate/lib/qlpack.yml +++ b/csharp/ql/campaigns/Solorigate/lib/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/csharp-solorigate-all -version: 1.7.29-dev +version: 1.7.31-dev groups: - csharp - solorigate diff --git a/csharp/ql/campaigns/Solorigate/src/CHANGELOG.md b/csharp/ql/campaigns/Solorigate/src/CHANGELOG.md index 7b5cb257096..a71f93aacd4 100644 --- a/csharp/ql/campaigns/Solorigate/src/CHANGELOG.md +++ b/csharp/ql/campaigns/Solorigate/src/CHANGELOG.md @@ -1,3 +1,11 @@ +## 1.7.30 + +No user-facing changes. + +## 1.7.29 + +No user-facing changes. + ## 1.7.28 No user-facing changes. diff --git a/csharp/ql/campaigns/Solorigate/src/change-notes/released/1.7.29.md b/csharp/ql/campaigns/Solorigate/src/change-notes/released/1.7.29.md new file mode 100644 index 00000000000..6ff68866478 --- /dev/null +++ b/csharp/ql/campaigns/Solorigate/src/change-notes/released/1.7.29.md @@ -0,0 +1,3 @@ +## 1.7.29 + +No user-facing changes. diff --git a/csharp/ql/campaigns/Solorigate/src/change-notes/released/1.7.30.md b/csharp/ql/campaigns/Solorigate/src/change-notes/released/1.7.30.md new file mode 100644 index 00000000000..8fb79827401 --- /dev/null +++ b/csharp/ql/campaigns/Solorigate/src/change-notes/released/1.7.30.md @@ -0,0 +1,3 @@ +## 1.7.30 + +No user-facing changes. diff --git a/csharp/ql/campaigns/Solorigate/src/codeql-pack.release.yml b/csharp/ql/campaigns/Solorigate/src/codeql-pack.release.yml index ff17fbaf982..c0346e526b9 100644 --- a/csharp/ql/campaigns/Solorigate/src/codeql-pack.release.yml +++ b/csharp/ql/campaigns/Solorigate/src/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.7.28 +lastReleaseVersion: 1.7.30 diff --git a/csharp/ql/campaigns/Solorigate/src/qlpack.yml b/csharp/ql/campaigns/Solorigate/src/qlpack.yml index 4e5b51ed11a..979d8e6c661 100644 --- a/csharp/ql/campaigns/Solorigate/src/qlpack.yml +++ b/csharp/ql/campaigns/Solorigate/src/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/csharp-solorigate-queries -version: 1.7.29-dev +version: 1.7.31-dev groups: - csharp - solorigate diff --git a/csharp/ql/lib/CHANGELOG.md b/csharp/ql/lib/CHANGELOG.md index 39a75db1b5f..86f279365f0 100644 --- a/csharp/ql/lib/CHANGELOG.md +++ b/csharp/ql/lib/CHANGELOG.md @@ -1,3 +1,27 @@ +## 4.0.0 + +### Breaking Changes + +* Deleted the old deprecated data flow API that was based on extending a configuration class. See https://github.blog/changelog/2023-08-14-new-dataflow-api-for-writing-custom-codeql-queries for instructions on migrating your queries to use the new API. + +### Minor Analysis Improvements + +* Added support for data-flow through member accesses of objects with `dynamic` types. +* Only extract *public* and *protected* members from reference assemblies. This yields an approximate average speed-up of around 10% for extraction and query execution. Custom MaD rows using `Field`-based summaries may need to be changed to `SyntheticField`-based flows if they reference private fields. +* Added `Microsoft.AspNetCore.Components.NagivationManager::Uri` as a remote flow source, since this value may contain user-specified values. +* Added the following URI-parsing methods as summaries, as they may be tainted with user-specified values: + - `System.Web.HttpUtility::ParseQueryString` + - `Microsoft.AspNetCore.WebUtilities.QueryHelpers::ParseQuery` + - `Microsoft.AspNetCore.WebUtilities.QueryHelpers::ParseNullableQuery` +* Added `js-interop` sinks for the `InvokeAsync` and `InvokeVoidAsync` methods of `Microsoft.JSInterop.IJSRuntime`, which can run arbitrary JavaScript. + +## 3.1.1 + +### Minor Analysis Improvements + +* .NET 9 is now required to build the C# extractor. +* The Models as Data models for .NET 8 Runtime now include generated models for higher order methods. + ## 3.1.0 ### Major Analysis Improvements diff --git a/csharp/ql/lib/change-notes/2024-11-19-extractor-dotnet.md b/csharp/ql/lib/change-notes/2024-11-19-extractor-dotnet.md deleted file mode 100644 index 58185aa0b0e..00000000000 --- a/csharp/ql/lib/change-notes/2024-11-19-extractor-dotnet.md +++ /dev/null @@ -1,4 +0,0 @@ ---- -category: minorAnalysis ---- -* .NET 9 is now required to build the C# extractor. diff --git a/csharp/ql/lib/change-notes/2024-11-26-model-microsoft.jsinterop.ijsruntime.md b/csharp/ql/lib/change-notes/2024-11-26-model-microsoft.jsinterop.ijsruntime.md deleted file mode 100644 index a99f9c8e0fd..00000000000 --- a/csharp/ql/lib/change-notes/2024-11-26-model-microsoft.jsinterop.ijsruntime.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -category: minorAnalysis ---- -* Added `js-interop` sinks for the `InvokeAsync` and `InvokeVoidAsync` methods of `Microsoft.JSInterop.IJSRuntime`, which can run arbitrary JavaScript. - diff --git a/csharp/ql/lib/change-notes/2024-11-27-navigationmanager.uri-and-uri-parsing-utilities.md b/csharp/ql/lib/change-notes/2024-11-27-navigationmanager.uri-and-uri-parsing-utilities.md deleted file mode 100644 index 2d9866c2e15..00000000000 --- a/csharp/ql/lib/change-notes/2024-11-27-navigationmanager.uri-and-uri-parsing-utilities.md +++ /dev/null @@ -1,8 +0,0 @@ ---- -category: minorAnalysis ---- -* Added `Microsoft.AspNetCore.Components.NagivationManager::Uri` as a remote flow source, since this value may contain user-specified values. -* Added the following URI-parsing methods as summaries, as they may be tainted with user-specified values: - - `System.Web.HttpUtility::ParseQueryString` - - `Microsoft.AspNetCore.WebUtilities.QueryHelpers::ParseQuery` - - `Microsoft.AspNetCore.WebUtilities.QueryHelpers::ParseNullableQuery` diff --git a/csharp/ql/lib/change-notes/2024-12-04-dataflow-type-pruning-tweak.md b/csharp/ql/lib/change-notes/2024-12-04-dataflow-type-pruning-tweak.md new file mode 100644 index 00000000000..258c0e5326b --- /dev/null +++ b/csharp/ql/lib/change-notes/2024-12-04-dataflow-type-pruning-tweak.md @@ -0,0 +1,4 @@ +--- +category: minorAnalysis +--- +* The data flow library has been updated to track types in a slightly different way: The type of the tainted data (which may be stored into fields, etc.) is tracked more precisely, while the types of intermediate containers for nested contents is tracked less precisely. This may have a slight effect on false positives for complex flow paths. diff --git a/csharp/ql/lib/change-notes/2024-11-07-net8-runtime-models.md b/csharp/ql/lib/change-notes/released/3.1.1.md similarity index 51% rename from csharp/ql/lib/change-notes/2024-11-07-net8-runtime-models.md rename to csharp/ql/lib/change-notes/released/3.1.1.md index 89574208e40..a2a912341fe 100644 --- a/csharp/ql/lib/change-notes/2024-11-07-net8-runtime-models.md +++ b/csharp/ql/lib/change-notes/released/3.1.1.md @@ -1,4 +1,6 @@ ---- -category: minorAnalysis ---- +## 3.1.1 + +### Minor Analysis Improvements + +* .NET 9 is now required to build the C# extractor. * The Models as Data models for .NET 8 Runtime now include generated models for higher order methods. diff --git a/csharp/ql/lib/change-notes/released/4.0.0.md b/csharp/ql/lib/change-notes/released/4.0.0.md new file mode 100644 index 00000000000..2a64ac00232 --- /dev/null +++ b/csharp/ql/lib/change-notes/released/4.0.0.md @@ -0,0 +1,16 @@ +## 4.0.0 + +### Breaking Changes + +* Deleted the old deprecated data flow API that was based on extending a configuration class. See https://github.blog/changelog/2023-08-14-new-dataflow-api-for-writing-custom-codeql-queries for instructions on migrating your queries to use the new API. + +### Minor Analysis Improvements + +* Added support for data-flow through member accesses of objects with `dynamic` types. +* Only extract *public* and *protected* members from reference assemblies. This yields an approximate average speed-up of around 10% for extraction and query execution. Custom MaD rows using `Field`-based summaries may need to be changed to `SyntheticField`-based flows if they reference private fields. +* Added `Microsoft.AspNetCore.Components.NagivationManager::Uri` as a remote flow source, since this value may contain user-specified values. +* Added the following URI-parsing methods as summaries, as they may be tainted with user-specified values: + - `System.Web.HttpUtility::ParseQueryString` + - `Microsoft.AspNetCore.WebUtilities.QueryHelpers::ParseQuery` + - `Microsoft.AspNetCore.WebUtilities.QueryHelpers::ParseNullableQuery` +* Added `js-interop` sinks for the `InvokeAsync` and `InvokeVoidAsync` methods of `Microsoft.JSInterop.IJSRuntime`, which can run arbitrary JavaScript. diff --git a/csharp/ql/lib/codeql-pack.release.yml b/csharp/ql/lib/codeql-pack.release.yml index 82f62960aa3..49fe3eef697 100644 --- a/csharp/ql/lib/codeql-pack.release.yml +++ b/csharp/ql/lib/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 3.1.0 +lastReleaseVersion: 4.0.0 diff --git a/csharp/ql/lib/experimental/code/csharp/Cryptography/NonCryptographicHashes.qll b/csharp/ql/lib/experimental/code/csharp/Cryptography/NonCryptographicHashes.qll index 0f22f772620..49dd011658d 100644 --- a/csharp/ql/lib/experimental/code/csharp/Cryptography/NonCryptographicHashes.qll +++ b/csharp/ql/lib/experimental/code/csharp/Cryptography/NonCryptographicHashes.qll @@ -8,7 +8,6 @@ import csharp private import DataFlow -private import semmle.code.csharp.dataflow.TaintTracking2 predicate maybeANonCryptographicHash( Callable callable, Variable v, Expr xor, Expr mul, LoopStmt loop diff --git a/csharp/ql/lib/qlpack.yml b/csharp/ql/lib/qlpack.yml index f750b06e392..81a55470a4d 100644 --- a/csharp/ql/lib/qlpack.yml +++ b/csharp/ql/lib/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/csharp-all -version: 3.1.1-dev +version: 4.0.1-dev groups: csharp dbscheme: semmlecode.csharp.dbscheme extractor: csharp diff --git a/csharp/ql/lib/semmle/code/csharp/dataflow/DataFlow.qll b/csharp/ql/lib/semmle/code/csharp/dataflow/DataFlow.qll index 0fc12debaa8..9c1c8c2fee3 100644 --- a/csharp/ql/lib/semmle/code/csharp/dataflow/DataFlow.qll +++ b/csharp/ql/lib/semmle/code/csharp/dataflow/DataFlow.qll @@ -9,5 +9,5 @@ module DataFlow { private import semmle.code.csharp.dataflow.internal.DataFlowImplSpecific private import codeql.dataflow.DataFlow import DataFlowMake - import semmle.code.csharp.dataflow.internal.DataFlowImpl1 + import Public } diff --git a/csharp/ql/lib/semmle/code/csharp/dataflow/DataFlow2.qll b/csharp/ql/lib/semmle/code/csharp/dataflow/DataFlow2.qll deleted file mode 100644 index 60525016d31..00000000000 --- a/csharp/ql/lib/semmle/code/csharp/dataflow/DataFlow2.qll +++ /dev/null @@ -1,10 +0,0 @@ -/** - * Provides classes for performing local (intra-procedural) and - * global (inter-procedural) data flow analyses. - */ - -import csharp - -module DataFlow2 { - import semmle.code.csharp.dataflow.internal.DataFlowImpl2 -} diff --git a/csharp/ql/lib/semmle/code/csharp/dataflow/DataFlow3.qll b/csharp/ql/lib/semmle/code/csharp/dataflow/DataFlow3.qll deleted file mode 100644 index 7f3b9469449..00000000000 --- a/csharp/ql/lib/semmle/code/csharp/dataflow/DataFlow3.qll +++ /dev/null @@ -1,10 +0,0 @@ -/** - * Provides classes for performing local (intra-procedural) and - * global (inter-procedural) data flow analyses. - */ - -import csharp - -module DataFlow3 { - import semmle.code.csharp.dataflow.internal.DataFlowImpl3 -} diff --git a/csharp/ql/lib/semmle/code/csharp/dataflow/DataFlow4.qll b/csharp/ql/lib/semmle/code/csharp/dataflow/DataFlow4.qll deleted file mode 100644 index 29c994a2eec..00000000000 --- a/csharp/ql/lib/semmle/code/csharp/dataflow/DataFlow4.qll +++ /dev/null @@ -1,10 +0,0 @@ -/** - * Provides classes for performing local (intra-procedural) and - * global (inter-procedural) data flow analyses. - */ - -import csharp - -module DataFlow4 { - import semmle.code.csharp.dataflow.internal.DataFlowImpl4 -} diff --git a/csharp/ql/lib/semmle/code/csharp/dataflow/DataFlow5.qll b/csharp/ql/lib/semmle/code/csharp/dataflow/DataFlow5.qll deleted file mode 100644 index 48148117166..00000000000 --- a/csharp/ql/lib/semmle/code/csharp/dataflow/DataFlow5.qll +++ /dev/null @@ -1,10 +0,0 @@ -/** - * Provides classes for performing local (intra-procedural) and - * global (inter-procedural) data flow analyses. - */ - -import csharp - -module DataFlow5 { - import semmle.code.csharp.dataflow.internal.DataFlowImpl5 -} diff --git a/csharp/ql/lib/semmle/code/csharp/dataflow/TaintTracking.qll b/csharp/ql/lib/semmle/code/csharp/dataflow/TaintTracking.qll index fb39294ed23..781953a8348 100644 --- a/csharp/ql/lib/semmle/code/csharp/dataflow/TaintTracking.qll +++ b/csharp/ql/lib/semmle/code/csharp/dataflow/TaintTracking.qll @@ -6,10 +6,9 @@ import csharp module TaintTracking { - import semmle.code.csharp.dataflow.internal.tainttracking1.TaintTrackingParameter::Public + import semmle.code.csharp.dataflow.internal.TaintTrackingPublic private import semmle.code.csharp.dataflow.internal.DataFlowImplSpecific private import semmle.code.csharp.dataflow.internal.TaintTrackingImplSpecific private import codeql.dataflow.TaintTracking import TaintFlowMake - import semmle.code.csharp.dataflow.internal.tainttracking1.TaintTrackingImpl } diff --git a/csharp/ql/lib/semmle/code/csharp/dataflow/TaintTracking2.qll b/csharp/ql/lib/semmle/code/csharp/dataflow/TaintTracking2.qll deleted file mode 100644 index 9ee798ed9fd..00000000000 --- a/csharp/ql/lib/semmle/code/csharp/dataflow/TaintTracking2.qll +++ /dev/null @@ -1,10 +0,0 @@ -/** - * Provides classes for performing local (intra-procedural) and - * global (inter-procedural) taint-tracking analyses. - */ - -import csharp - -module TaintTracking2 { - import semmle.code.csharp.dataflow.internal.tainttracking2.TaintTrackingImpl -} diff --git a/csharp/ql/lib/semmle/code/csharp/dataflow/TaintTracking3.qll b/csharp/ql/lib/semmle/code/csharp/dataflow/TaintTracking3.qll deleted file mode 100644 index 476d7bf7dd7..00000000000 --- a/csharp/ql/lib/semmle/code/csharp/dataflow/TaintTracking3.qll +++ /dev/null @@ -1,10 +0,0 @@ -/** - * Provides classes for performing local (intra-procedural) and - * global (inter-procedural) taint-tracking analyses. - */ - -import csharp - -module TaintTracking3 { - import semmle.code.csharp.dataflow.internal.tainttracking3.TaintTrackingImpl -} diff --git a/csharp/ql/lib/semmle/code/csharp/dataflow/TaintTracking4.qll b/csharp/ql/lib/semmle/code/csharp/dataflow/TaintTracking4.qll deleted file mode 100644 index 45b8f12be5c..00000000000 --- a/csharp/ql/lib/semmle/code/csharp/dataflow/TaintTracking4.qll +++ /dev/null @@ -1,10 +0,0 @@ -/** - * Provides classes for performing local (intra-procedural) and - * global (inter-procedural) taint-tracking analyses. - */ - -import csharp - -module TaintTracking4 { - import semmle.code.csharp.dataflow.internal.tainttracking4.TaintTrackingImpl -} diff --git a/csharp/ql/lib/semmle/code/csharp/dataflow/TaintTracking5.qll b/csharp/ql/lib/semmle/code/csharp/dataflow/TaintTracking5.qll deleted file mode 100644 index 7a75ce532bc..00000000000 --- a/csharp/ql/lib/semmle/code/csharp/dataflow/TaintTracking5.qll +++ /dev/null @@ -1,10 +0,0 @@ -/** - * Provides classes for performing local (intra-procedural) and - * global (inter-procedural) taint-tracking analyses. - */ - -import csharp - -module TaintTracking5 { - import semmle.code.csharp.dataflow.internal.tainttracking5.TaintTrackingImpl -} diff --git a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowImpl1.qll b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowImpl1.qll deleted file mode 100644 index 17def0c431d..00000000000 --- a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowImpl1.qll +++ /dev/null @@ -1,361 +0,0 @@ -/** - * DEPRECATED: Use `Global` and `GlobalWithState` instead. - * - * Provides a `Configuration` class backwards-compatible interface to the data - * flow library. - */ - -private import DataFlowImplCommon -private import DataFlowImplSpecific::Private -import DataFlowImplSpecific::Public -private import DataFlowImpl -import DataFlowImplCommonPublic -deprecated import FlowStateString -private import codeql.util.Unit - -/** - * DEPRECATED: Use `Global` and `GlobalWithState` instead. - * - * A configuration of interprocedural data flow analysis. This defines - * sources, sinks, and any other configurable aspect of the analysis. Each - * use of the global data flow library must define its own unique extension - * of this abstract class. To create a configuration, extend this class with - * a subclass whose characteristic predicate is a unique singleton string. - * For example, write - * - * ```ql - * class MyAnalysisConfiguration extends DataFlow::Configuration { - * MyAnalysisConfiguration() { this = "MyAnalysisConfiguration" } - * // Override `isSource` and `isSink`. - * // Optionally override `isBarrier`. - * // Optionally override `isAdditionalFlowStep`. - * } - * ``` - * Conceptually, this defines a graph where the nodes are `DataFlow::Node`s and - * the edges are those data-flow steps that preserve the value of the node - * along with any additional edges defined by `isAdditionalFlowStep`. - * Specifying nodes in `isBarrier` will remove those nodes from the graph, and - * specifying nodes in `isBarrierIn` and/or `isBarrierOut` will remove in-going - * and/or out-going edges from those nodes, respectively. - * - * Then, to query whether there is flow between some `source` and `sink`, - * write - * - * ```ql - * exists(MyAnalysisConfiguration cfg | cfg.hasFlow(source, sink)) - * ``` - * - * Multiple configurations can coexist, but two classes extending - * `DataFlow::Configuration` should never depend on each other. One of them - * should instead depend on a `DataFlow2::Configuration`, a - * `DataFlow3::Configuration`, or a `DataFlow4::Configuration`. - */ -abstract deprecated class Configuration extends string { - bindingset[this] - Configuration() { any() } - - /** - * Holds if `source` is a relevant data flow source. - */ - predicate isSource(Node source) { none() } - - /** - * Holds if `source` is a relevant data flow source with the given initial - * `state`. - */ - predicate isSource(Node source, FlowState state) { none() } - - /** - * Holds if `sink` is a relevant data flow sink. - */ - predicate isSink(Node sink) { none() } - - /** - * Holds if `sink` is a relevant data flow sink accepting `state`. - */ - predicate isSink(Node sink, FlowState state) { none() } - - /** - * Holds if data flow through `node` is prohibited. This completely removes - * `node` from the data flow graph. - */ - predicate isBarrier(Node node) { none() } - - /** - * Holds if data flow through `node` is prohibited when the flow state is - * `state`. - */ - predicate isBarrier(Node node, FlowState state) { none() } - - /** Holds if data flow into `node` is prohibited. */ - predicate isBarrierIn(Node node) { none() } - - /** Holds if data flow out of `node` is prohibited. */ - predicate isBarrierOut(Node node) { none() } - - /** - * Holds if data may flow from `node1` to `node2` in addition to the normal data-flow steps. - */ - predicate isAdditionalFlowStep(Node node1, Node node2) { none() } - - /** - * Holds if data may flow from `node1` to `node2` in addition to the normal data-flow steps. - * This step is only applicable in `state1` and updates the flow state to `state2`. - */ - predicate isAdditionalFlowStep(Node node1, FlowState state1, Node node2, FlowState state2) { - none() - } - - /** - * Holds if an arbitrary number of implicit read steps of content `c` may be - * taken at `node`. - */ - predicate allowImplicitRead(Node node, ContentSet c) { none() } - - /** - * Gets the virtual dispatch branching limit when calculating field flow. - * This can be overridden to a smaller value to improve performance (a - * value of 0 disables field flow), or a larger value to get more results. - */ - int fieldFlowBranchLimit() { result = 2 } - - /** - * Gets a data flow configuration feature to add restrictions to the set of - * valid flow paths. - * - * - `FeatureHasSourceCallContext`: - * Assume that sources have some existing call context to disallow - * conflicting return-flow directly following the source. - * - `FeatureHasSinkCallContext`: - * Assume that sinks have some existing call context to disallow - * conflicting argument-to-parameter flow directly preceding the sink. - * - `FeatureEqualSourceSinkCallContext`: - * Implies both of the above and additionally ensures that the entire flow - * path preserves the call context. - * - * These features are generally not relevant for typical end-to-end data flow - * queries, but should only be used for constructing paths that need to - * somehow be pluggable in another path context. - */ - FlowFeature getAFeature() { none() } - - /** Holds if sources should be grouped in the result of `hasFlowPath`. */ - predicate sourceGrouping(Node source, string sourceGroup) { none() } - - /** Holds if sinks should be grouped in the result of `hasFlowPath`. */ - predicate sinkGrouping(Node sink, string sinkGroup) { none() } - - /** - * Holds if data may flow from `source` to `sink` for this configuration. - */ - predicate hasFlow(Node source, Node sink) { hasFlow(source, sink, this) } - - /** - * Holds if data may flow from `source` to `sink` for this configuration. - * - * The corresponding paths are generated from the end-points and the graph - * included in the module `PathGraph`. - */ - predicate hasFlowPath(PathNode source, PathNode sink) { hasFlowPath(source, sink, this) } - - /** - * Holds if data may flow from some source to `sink` for this configuration. - */ - predicate hasFlowTo(Node sink) { hasFlowTo(sink, this) } - - /** - * Holds if data may flow from some source to `sink` for this configuration. - */ - predicate hasFlowToExpr(DataFlowExpr sink) { this.hasFlowTo(exprNode(sink)) } - - /** - * Holds if hidden nodes should be included in the data flow graph. - * - * This feature should only be used for debugging or when the data flow graph - * is not visualized (for example in a `path-problem` query). - */ - predicate includeHiddenNodes() { none() } -} - -/** - * This class exists to prevent mutual recursion between the user-overridden - * member predicates of `Configuration` and the rest of the data-flow library. - * Good performance cannot be guaranteed in the presence of such recursion, so - * it should be replaced by using more than one copy of the data flow library. - */ -abstract deprecated private class ConfigurationRecursionPrevention extends Configuration { - bindingset[this] - ConfigurationRecursionPrevention() { any() } - - override predicate hasFlow(Node source, Node sink) { - strictcount(Node n | this.isSource(n)) < 0 - or - strictcount(Node n | this.isSource(n, _)) < 0 - or - strictcount(Node n | this.isSink(n)) < 0 - or - strictcount(Node n | this.isSink(n, _)) < 0 - or - strictcount(Node n1, Node n2 | this.isAdditionalFlowStep(n1, n2)) < 0 - or - strictcount(Node n1, Node n2 | this.isAdditionalFlowStep(n1, _, n2, _)) < 0 - or - super.hasFlow(source, sink) - } -} - -deprecated private FlowState relevantState(Configuration config) { - config.isSource(_, result) or - config.isSink(_, result) or - config.isBarrier(_, result) or - config.isAdditionalFlowStep(_, result, _, _) or - config.isAdditionalFlowStep(_, _, _, result) -} - -private newtype TConfigState = - deprecated TMkConfigState(Configuration config, FlowState state) { - state = relevantState(config) or state instanceof FlowStateEmpty - } - -deprecated private Configuration getConfig(TConfigState state) { state = TMkConfigState(result, _) } - -deprecated private FlowState getState(TConfigState state) { state = TMkConfigState(_, result) } - -deprecated private predicate singleConfiguration() { 1 = strictcount(Configuration c) } - -deprecated private module Config implements FullStateConfigSig { - class FlowState = TConfigState; - - predicate isSource(Node source, FlowState state) { - getConfig(state).isSource(source, getState(state)) - or - getConfig(state).isSource(source) and getState(state) instanceof FlowStateEmpty - } - - predicate isSink(Node sink) { none() } - - predicate isSink(Node sink, FlowState state) { - getConfig(state).isSink(sink, getState(state)) - or - getConfig(state).isSink(sink) and getState(state) instanceof FlowStateEmpty - } - - predicate isBarrier(Node node) { none() } - - predicate isBarrier(Node node, FlowState state) { - getConfig(state).isBarrier(node, getState(state)) or - getConfig(state).isBarrier(node) - } - - predicate isBarrierIn(Node node) { any(Configuration config).isBarrierIn(node) } - - predicate isBarrierOut(Node node) { any(Configuration config).isBarrierOut(node) } - - predicate isBarrierIn(Node node, FlowState state) { none() } - - predicate isBarrierOut(Node node, FlowState state) { none() } - - predicate isAdditionalFlowStep(Node node1, Node node2, string model) { - singleConfiguration() and - any(Configuration config).isAdditionalFlowStep(node1, node2) and - model = "" - } - - predicate isAdditionalFlowStep( - Node node1, FlowState state1, Node node2, FlowState state2, string model - ) { - getConfig(state1).isAdditionalFlowStep(node1, getState(state1), node2, getState(state2)) and - getConfig(state2) = getConfig(state1) and - model = "" - or - not singleConfiguration() and - getConfig(state1).isAdditionalFlowStep(node1, node2) and - state2 = state1 and - model = "" - } - - predicate allowImplicitRead(Node node, ContentSet c) { - any(Configuration config).allowImplicitRead(node, c) - } - - predicate neverSkip(Node node) { none() } - - int fieldFlowBranchLimit() { result = min(any(Configuration config).fieldFlowBranchLimit()) } - - int accessPathLimit() { result = 5 } - - FlowFeature getAFeature() { result = any(Configuration config).getAFeature() } - - predicate includeHiddenNodes() { any(Configuration config).includeHiddenNodes() } - - predicate observeDiffInformedIncrementalMode() { none() } -} - -deprecated private import Impl as I - -/** - * A `Node` augmented with a call context (except for sinks), an access path, and a configuration. - * Only those `PathNode`s that are reachable from a source, and which can reach a sink, are generated. - */ -deprecated class PathNode instanceof I::PathNode { - /** Gets a textual representation of this element. */ - final string toString() { result = super.toString() } - - /** - * Gets a textual representation of this element, including a textual - * representation of the call context. - */ - final string toStringWithContext() { result = super.toStringWithContext() } - - /** - * Holds if this element is at the specified location. - * The location spans column `startcolumn` of line `startline` to - * column `endcolumn` of line `endline` in file `filepath`. - * For more information, see - * [Locations](https://codeql.github.com/docs/writing-codeql-queries/providing-locations-in-codeql-queries/). - */ - final predicate hasLocationInfo( - string filepath, int startline, int startcolumn, int endline, int endcolumn - ) { - super.hasLocationInfo(filepath, startline, startcolumn, endline, endcolumn) - } - - /** Gets the underlying `Node`. */ - final Node getNode() { result = super.getNode() } - - /** Gets the `FlowState` of this node. */ - deprecated final FlowState getState() { result = getState(super.getState()) } - - /** Gets the associated configuration. */ - deprecated final Configuration getConfiguration() { result = getConfig(super.getState()) } - - /** Gets a successor of this node, if any. */ - final PathNode getASuccessor() { result = super.getASuccessor() } - - /** Holds if this node is a source. */ - final predicate isSource() { super.isSource() } - - /** Holds if this node is a grouping of source nodes. */ - final predicate isSourceGroup(string group) { super.isSourceGroup(group) } - - /** Holds if this node is a grouping of sink nodes. */ - final predicate isSinkGroup(string group) { super.isSinkGroup(group) } -} - -deprecated module PathGraph = I::PathGraph; - -deprecated private predicate hasFlow(Node source, Node sink, Configuration config) { - exists(PathNode source0, PathNode sink0 | - hasFlowPath(source0, sink0, config) and - source0.getNode() = source and - sink0.getNode() = sink - ) -} - -deprecated private predicate hasFlowPath(PathNode source, PathNode sink, Configuration config) { - I::flowPath(source, sink) and source.getConfiguration() = config -} - -deprecated private predicate hasFlowTo(Node sink, Configuration config) { hasFlow(_, sink, config) } - -deprecated predicate flowsTo = hasFlow/3; diff --git a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowImpl2.qll b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowImpl2.qll deleted file mode 100644 index 17def0c431d..00000000000 --- a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowImpl2.qll +++ /dev/null @@ -1,361 +0,0 @@ -/** - * DEPRECATED: Use `Global` and `GlobalWithState` instead. - * - * Provides a `Configuration` class backwards-compatible interface to the data - * flow library. - */ - -private import DataFlowImplCommon -private import DataFlowImplSpecific::Private -import DataFlowImplSpecific::Public -private import DataFlowImpl -import DataFlowImplCommonPublic -deprecated import FlowStateString -private import codeql.util.Unit - -/** - * DEPRECATED: Use `Global` and `GlobalWithState` instead. - * - * A configuration of interprocedural data flow analysis. This defines - * sources, sinks, and any other configurable aspect of the analysis. Each - * use of the global data flow library must define its own unique extension - * of this abstract class. To create a configuration, extend this class with - * a subclass whose characteristic predicate is a unique singleton string. - * For example, write - * - * ```ql - * class MyAnalysisConfiguration extends DataFlow::Configuration { - * MyAnalysisConfiguration() { this = "MyAnalysisConfiguration" } - * // Override `isSource` and `isSink`. - * // Optionally override `isBarrier`. - * // Optionally override `isAdditionalFlowStep`. - * } - * ``` - * Conceptually, this defines a graph where the nodes are `DataFlow::Node`s and - * the edges are those data-flow steps that preserve the value of the node - * along with any additional edges defined by `isAdditionalFlowStep`. - * Specifying nodes in `isBarrier` will remove those nodes from the graph, and - * specifying nodes in `isBarrierIn` and/or `isBarrierOut` will remove in-going - * and/or out-going edges from those nodes, respectively. - * - * Then, to query whether there is flow between some `source` and `sink`, - * write - * - * ```ql - * exists(MyAnalysisConfiguration cfg | cfg.hasFlow(source, sink)) - * ``` - * - * Multiple configurations can coexist, but two classes extending - * `DataFlow::Configuration` should never depend on each other. One of them - * should instead depend on a `DataFlow2::Configuration`, a - * `DataFlow3::Configuration`, or a `DataFlow4::Configuration`. - */ -abstract deprecated class Configuration extends string { - bindingset[this] - Configuration() { any() } - - /** - * Holds if `source` is a relevant data flow source. - */ - predicate isSource(Node source) { none() } - - /** - * Holds if `source` is a relevant data flow source with the given initial - * `state`. - */ - predicate isSource(Node source, FlowState state) { none() } - - /** - * Holds if `sink` is a relevant data flow sink. - */ - predicate isSink(Node sink) { none() } - - /** - * Holds if `sink` is a relevant data flow sink accepting `state`. - */ - predicate isSink(Node sink, FlowState state) { none() } - - /** - * Holds if data flow through `node` is prohibited. This completely removes - * `node` from the data flow graph. - */ - predicate isBarrier(Node node) { none() } - - /** - * Holds if data flow through `node` is prohibited when the flow state is - * `state`. - */ - predicate isBarrier(Node node, FlowState state) { none() } - - /** Holds if data flow into `node` is prohibited. */ - predicate isBarrierIn(Node node) { none() } - - /** Holds if data flow out of `node` is prohibited. */ - predicate isBarrierOut(Node node) { none() } - - /** - * Holds if data may flow from `node1` to `node2` in addition to the normal data-flow steps. - */ - predicate isAdditionalFlowStep(Node node1, Node node2) { none() } - - /** - * Holds if data may flow from `node1` to `node2` in addition to the normal data-flow steps. - * This step is only applicable in `state1` and updates the flow state to `state2`. - */ - predicate isAdditionalFlowStep(Node node1, FlowState state1, Node node2, FlowState state2) { - none() - } - - /** - * Holds if an arbitrary number of implicit read steps of content `c` may be - * taken at `node`. - */ - predicate allowImplicitRead(Node node, ContentSet c) { none() } - - /** - * Gets the virtual dispatch branching limit when calculating field flow. - * This can be overridden to a smaller value to improve performance (a - * value of 0 disables field flow), or a larger value to get more results. - */ - int fieldFlowBranchLimit() { result = 2 } - - /** - * Gets a data flow configuration feature to add restrictions to the set of - * valid flow paths. - * - * - `FeatureHasSourceCallContext`: - * Assume that sources have some existing call context to disallow - * conflicting return-flow directly following the source. - * - `FeatureHasSinkCallContext`: - * Assume that sinks have some existing call context to disallow - * conflicting argument-to-parameter flow directly preceding the sink. - * - `FeatureEqualSourceSinkCallContext`: - * Implies both of the above and additionally ensures that the entire flow - * path preserves the call context. - * - * These features are generally not relevant for typical end-to-end data flow - * queries, but should only be used for constructing paths that need to - * somehow be pluggable in another path context. - */ - FlowFeature getAFeature() { none() } - - /** Holds if sources should be grouped in the result of `hasFlowPath`. */ - predicate sourceGrouping(Node source, string sourceGroup) { none() } - - /** Holds if sinks should be grouped in the result of `hasFlowPath`. */ - predicate sinkGrouping(Node sink, string sinkGroup) { none() } - - /** - * Holds if data may flow from `source` to `sink` for this configuration. - */ - predicate hasFlow(Node source, Node sink) { hasFlow(source, sink, this) } - - /** - * Holds if data may flow from `source` to `sink` for this configuration. - * - * The corresponding paths are generated from the end-points and the graph - * included in the module `PathGraph`. - */ - predicate hasFlowPath(PathNode source, PathNode sink) { hasFlowPath(source, sink, this) } - - /** - * Holds if data may flow from some source to `sink` for this configuration. - */ - predicate hasFlowTo(Node sink) { hasFlowTo(sink, this) } - - /** - * Holds if data may flow from some source to `sink` for this configuration. - */ - predicate hasFlowToExpr(DataFlowExpr sink) { this.hasFlowTo(exprNode(sink)) } - - /** - * Holds if hidden nodes should be included in the data flow graph. - * - * This feature should only be used for debugging or when the data flow graph - * is not visualized (for example in a `path-problem` query). - */ - predicate includeHiddenNodes() { none() } -} - -/** - * This class exists to prevent mutual recursion between the user-overridden - * member predicates of `Configuration` and the rest of the data-flow library. - * Good performance cannot be guaranteed in the presence of such recursion, so - * it should be replaced by using more than one copy of the data flow library. - */ -abstract deprecated private class ConfigurationRecursionPrevention extends Configuration { - bindingset[this] - ConfigurationRecursionPrevention() { any() } - - override predicate hasFlow(Node source, Node sink) { - strictcount(Node n | this.isSource(n)) < 0 - or - strictcount(Node n | this.isSource(n, _)) < 0 - or - strictcount(Node n | this.isSink(n)) < 0 - or - strictcount(Node n | this.isSink(n, _)) < 0 - or - strictcount(Node n1, Node n2 | this.isAdditionalFlowStep(n1, n2)) < 0 - or - strictcount(Node n1, Node n2 | this.isAdditionalFlowStep(n1, _, n2, _)) < 0 - or - super.hasFlow(source, sink) - } -} - -deprecated private FlowState relevantState(Configuration config) { - config.isSource(_, result) or - config.isSink(_, result) or - config.isBarrier(_, result) or - config.isAdditionalFlowStep(_, result, _, _) or - config.isAdditionalFlowStep(_, _, _, result) -} - -private newtype TConfigState = - deprecated TMkConfigState(Configuration config, FlowState state) { - state = relevantState(config) or state instanceof FlowStateEmpty - } - -deprecated private Configuration getConfig(TConfigState state) { state = TMkConfigState(result, _) } - -deprecated private FlowState getState(TConfigState state) { state = TMkConfigState(_, result) } - -deprecated private predicate singleConfiguration() { 1 = strictcount(Configuration c) } - -deprecated private module Config implements FullStateConfigSig { - class FlowState = TConfigState; - - predicate isSource(Node source, FlowState state) { - getConfig(state).isSource(source, getState(state)) - or - getConfig(state).isSource(source) and getState(state) instanceof FlowStateEmpty - } - - predicate isSink(Node sink) { none() } - - predicate isSink(Node sink, FlowState state) { - getConfig(state).isSink(sink, getState(state)) - or - getConfig(state).isSink(sink) and getState(state) instanceof FlowStateEmpty - } - - predicate isBarrier(Node node) { none() } - - predicate isBarrier(Node node, FlowState state) { - getConfig(state).isBarrier(node, getState(state)) or - getConfig(state).isBarrier(node) - } - - predicate isBarrierIn(Node node) { any(Configuration config).isBarrierIn(node) } - - predicate isBarrierOut(Node node) { any(Configuration config).isBarrierOut(node) } - - predicate isBarrierIn(Node node, FlowState state) { none() } - - predicate isBarrierOut(Node node, FlowState state) { none() } - - predicate isAdditionalFlowStep(Node node1, Node node2, string model) { - singleConfiguration() and - any(Configuration config).isAdditionalFlowStep(node1, node2) and - model = "" - } - - predicate isAdditionalFlowStep( - Node node1, FlowState state1, Node node2, FlowState state2, string model - ) { - getConfig(state1).isAdditionalFlowStep(node1, getState(state1), node2, getState(state2)) and - getConfig(state2) = getConfig(state1) and - model = "" - or - not singleConfiguration() and - getConfig(state1).isAdditionalFlowStep(node1, node2) and - state2 = state1 and - model = "" - } - - predicate allowImplicitRead(Node node, ContentSet c) { - any(Configuration config).allowImplicitRead(node, c) - } - - predicate neverSkip(Node node) { none() } - - int fieldFlowBranchLimit() { result = min(any(Configuration config).fieldFlowBranchLimit()) } - - int accessPathLimit() { result = 5 } - - FlowFeature getAFeature() { result = any(Configuration config).getAFeature() } - - predicate includeHiddenNodes() { any(Configuration config).includeHiddenNodes() } - - predicate observeDiffInformedIncrementalMode() { none() } -} - -deprecated private import Impl as I - -/** - * A `Node` augmented with a call context (except for sinks), an access path, and a configuration. - * Only those `PathNode`s that are reachable from a source, and which can reach a sink, are generated. - */ -deprecated class PathNode instanceof I::PathNode { - /** Gets a textual representation of this element. */ - final string toString() { result = super.toString() } - - /** - * Gets a textual representation of this element, including a textual - * representation of the call context. - */ - final string toStringWithContext() { result = super.toStringWithContext() } - - /** - * Holds if this element is at the specified location. - * The location spans column `startcolumn` of line `startline` to - * column `endcolumn` of line `endline` in file `filepath`. - * For more information, see - * [Locations](https://codeql.github.com/docs/writing-codeql-queries/providing-locations-in-codeql-queries/). - */ - final predicate hasLocationInfo( - string filepath, int startline, int startcolumn, int endline, int endcolumn - ) { - super.hasLocationInfo(filepath, startline, startcolumn, endline, endcolumn) - } - - /** Gets the underlying `Node`. */ - final Node getNode() { result = super.getNode() } - - /** Gets the `FlowState` of this node. */ - deprecated final FlowState getState() { result = getState(super.getState()) } - - /** Gets the associated configuration. */ - deprecated final Configuration getConfiguration() { result = getConfig(super.getState()) } - - /** Gets a successor of this node, if any. */ - final PathNode getASuccessor() { result = super.getASuccessor() } - - /** Holds if this node is a source. */ - final predicate isSource() { super.isSource() } - - /** Holds if this node is a grouping of source nodes. */ - final predicate isSourceGroup(string group) { super.isSourceGroup(group) } - - /** Holds if this node is a grouping of sink nodes. */ - final predicate isSinkGroup(string group) { super.isSinkGroup(group) } -} - -deprecated module PathGraph = I::PathGraph; - -deprecated private predicate hasFlow(Node source, Node sink, Configuration config) { - exists(PathNode source0, PathNode sink0 | - hasFlowPath(source0, sink0, config) and - source0.getNode() = source and - sink0.getNode() = sink - ) -} - -deprecated private predicate hasFlowPath(PathNode source, PathNode sink, Configuration config) { - I::flowPath(source, sink) and source.getConfiguration() = config -} - -deprecated private predicate hasFlowTo(Node sink, Configuration config) { hasFlow(_, sink, config) } - -deprecated predicate flowsTo = hasFlow/3; diff --git a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowImpl3.qll b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowImpl3.qll deleted file mode 100644 index 17def0c431d..00000000000 --- a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowImpl3.qll +++ /dev/null @@ -1,361 +0,0 @@ -/** - * DEPRECATED: Use `Global` and `GlobalWithState` instead. - * - * Provides a `Configuration` class backwards-compatible interface to the data - * flow library. - */ - -private import DataFlowImplCommon -private import DataFlowImplSpecific::Private -import DataFlowImplSpecific::Public -private import DataFlowImpl -import DataFlowImplCommonPublic -deprecated import FlowStateString -private import codeql.util.Unit - -/** - * DEPRECATED: Use `Global` and `GlobalWithState` instead. - * - * A configuration of interprocedural data flow analysis. This defines - * sources, sinks, and any other configurable aspect of the analysis. Each - * use of the global data flow library must define its own unique extension - * of this abstract class. To create a configuration, extend this class with - * a subclass whose characteristic predicate is a unique singleton string. - * For example, write - * - * ```ql - * class MyAnalysisConfiguration extends DataFlow::Configuration { - * MyAnalysisConfiguration() { this = "MyAnalysisConfiguration" } - * // Override `isSource` and `isSink`. - * // Optionally override `isBarrier`. - * // Optionally override `isAdditionalFlowStep`. - * } - * ``` - * Conceptually, this defines a graph where the nodes are `DataFlow::Node`s and - * the edges are those data-flow steps that preserve the value of the node - * along with any additional edges defined by `isAdditionalFlowStep`. - * Specifying nodes in `isBarrier` will remove those nodes from the graph, and - * specifying nodes in `isBarrierIn` and/or `isBarrierOut` will remove in-going - * and/or out-going edges from those nodes, respectively. - * - * Then, to query whether there is flow between some `source` and `sink`, - * write - * - * ```ql - * exists(MyAnalysisConfiguration cfg | cfg.hasFlow(source, sink)) - * ``` - * - * Multiple configurations can coexist, but two classes extending - * `DataFlow::Configuration` should never depend on each other. One of them - * should instead depend on a `DataFlow2::Configuration`, a - * `DataFlow3::Configuration`, or a `DataFlow4::Configuration`. - */ -abstract deprecated class Configuration extends string { - bindingset[this] - Configuration() { any() } - - /** - * Holds if `source` is a relevant data flow source. - */ - predicate isSource(Node source) { none() } - - /** - * Holds if `source` is a relevant data flow source with the given initial - * `state`. - */ - predicate isSource(Node source, FlowState state) { none() } - - /** - * Holds if `sink` is a relevant data flow sink. - */ - predicate isSink(Node sink) { none() } - - /** - * Holds if `sink` is a relevant data flow sink accepting `state`. - */ - predicate isSink(Node sink, FlowState state) { none() } - - /** - * Holds if data flow through `node` is prohibited. This completely removes - * `node` from the data flow graph. - */ - predicate isBarrier(Node node) { none() } - - /** - * Holds if data flow through `node` is prohibited when the flow state is - * `state`. - */ - predicate isBarrier(Node node, FlowState state) { none() } - - /** Holds if data flow into `node` is prohibited. */ - predicate isBarrierIn(Node node) { none() } - - /** Holds if data flow out of `node` is prohibited. */ - predicate isBarrierOut(Node node) { none() } - - /** - * Holds if data may flow from `node1` to `node2` in addition to the normal data-flow steps. - */ - predicate isAdditionalFlowStep(Node node1, Node node2) { none() } - - /** - * Holds if data may flow from `node1` to `node2` in addition to the normal data-flow steps. - * This step is only applicable in `state1` and updates the flow state to `state2`. - */ - predicate isAdditionalFlowStep(Node node1, FlowState state1, Node node2, FlowState state2) { - none() - } - - /** - * Holds if an arbitrary number of implicit read steps of content `c` may be - * taken at `node`. - */ - predicate allowImplicitRead(Node node, ContentSet c) { none() } - - /** - * Gets the virtual dispatch branching limit when calculating field flow. - * This can be overridden to a smaller value to improve performance (a - * value of 0 disables field flow), or a larger value to get more results. - */ - int fieldFlowBranchLimit() { result = 2 } - - /** - * Gets a data flow configuration feature to add restrictions to the set of - * valid flow paths. - * - * - `FeatureHasSourceCallContext`: - * Assume that sources have some existing call context to disallow - * conflicting return-flow directly following the source. - * - `FeatureHasSinkCallContext`: - * Assume that sinks have some existing call context to disallow - * conflicting argument-to-parameter flow directly preceding the sink. - * - `FeatureEqualSourceSinkCallContext`: - * Implies both of the above and additionally ensures that the entire flow - * path preserves the call context. - * - * These features are generally not relevant for typical end-to-end data flow - * queries, but should only be used for constructing paths that need to - * somehow be pluggable in another path context. - */ - FlowFeature getAFeature() { none() } - - /** Holds if sources should be grouped in the result of `hasFlowPath`. */ - predicate sourceGrouping(Node source, string sourceGroup) { none() } - - /** Holds if sinks should be grouped in the result of `hasFlowPath`. */ - predicate sinkGrouping(Node sink, string sinkGroup) { none() } - - /** - * Holds if data may flow from `source` to `sink` for this configuration. - */ - predicate hasFlow(Node source, Node sink) { hasFlow(source, sink, this) } - - /** - * Holds if data may flow from `source` to `sink` for this configuration. - * - * The corresponding paths are generated from the end-points and the graph - * included in the module `PathGraph`. - */ - predicate hasFlowPath(PathNode source, PathNode sink) { hasFlowPath(source, sink, this) } - - /** - * Holds if data may flow from some source to `sink` for this configuration. - */ - predicate hasFlowTo(Node sink) { hasFlowTo(sink, this) } - - /** - * Holds if data may flow from some source to `sink` for this configuration. - */ - predicate hasFlowToExpr(DataFlowExpr sink) { this.hasFlowTo(exprNode(sink)) } - - /** - * Holds if hidden nodes should be included in the data flow graph. - * - * This feature should only be used for debugging or when the data flow graph - * is not visualized (for example in a `path-problem` query). - */ - predicate includeHiddenNodes() { none() } -} - -/** - * This class exists to prevent mutual recursion between the user-overridden - * member predicates of `Configuration` and the rest of the data-flow library. - * Good performance cannot be guaranteed in the presence of such recursion, so - * it should be replaced by using more than one copy of the data flow library. - */ -abstract deprecated private class ConfigurationRecursionPrevention extends Configuration { - bindingset[this] - ConfigurationRecursionPrevention() { any() } - - override predicate hasFlow(Node source, Node sink) { - strictcount(Node n | this.isSource(n)) < 0 - or - strictcount(Node n | this.isSource(n, _)) < 0 - or - strictcount(Node n | this.isSink(n)) < 0 - or - strictcount(Node n | this.isSink(n, _)) < 0 - or - strictcount(Node n1, Node n2 | this.isAdditionalFlowStep(n1, n2)) < 0 - or - strictcount(Node n1, Node n2 | this.isAdditionalFlowStep(n1, _, n2, _)) < 0 - or - super.hasFlow(source, sink) - } -} - -deprecated private FlowState relevantState(Configuration config) { - config.isSource(_, result) or - config.isSink(_, result) or - config.isBarrier(_, result) or - config.isAdditionalFlowStep(_, result, _, _) or - config.isAdditionalFlowStep(_, _, _, result) -} - -private newtype TConfigState = - deprecated TMkConfigState(Configuration config, FlowState state) { - state = relevantState(config) or state instanceof FlowStateEmpty - } - -deprecated private Configuration getConfig(TConfigState state) { state = TMkConfigState(result, _) } - -deprecated private FlowState getState(TConfigState state) { state = TMkConfigState(_, result) } - -deprecated private predicate singleConfiguration() { 1 = strictcount(Configuration c) } - -deprecated private module Config implements FullStateConfigSig { - class FlowState = TConfigState; - - predicate isSource(Node source, FlowState state) { - getConfig(state).isSource(source, getState(state)) - or - getConfig(state).isSource(source) and getState(state) instanceof FlowStateEmpty - } - - predicate isSink(Node sink) { none() } - - predicate isSink(Node sink, FlowState state) { - getConfig(state).isSink(sink, getState(state)) - or - getConfig(state).isSink(sink) and getState(state) instanceof FlowStateEmpty - } - - predicate isBarrier(Node node) { none() } - - predicate isBarrier(Node node, FlowState state) { - getConfig(state).isBarrier(node, getState(state)) or - getConfig(state).isBarrier(node) - } - - predicate isBarrierIn(Node node) { any(Configuration config).isBarrierIn(node) } - - predicate isBarrierOut(Node node) { any(Configuration config).isBarrierOut(node) } - - predicate isBarrierIn(Node node, FlowState state) { none() } - - predicate isBarrierOut(Node node, FlowState state) { none() } - - predicate isAdditionalFlowStep(Node node1, Node node2, string model) { - singleConfiguration() and - any(Configuration config).isAdditionalFlowStep(node1, node2) and - model = "" - } - - predicate isAdditionalFlowStep( - Node node1, FlowState state1, Node node2, FlowState state2, string model - ) { - getConfig(state1).isAdditionalFlowStep(node1, getState(state1), node2, getState(state2)) and - getConfig(state2) = getConfig(state1) and - model = "" - or - not singleConfiguration() and - getConfig(state1).isAdditionalFlowStep(node1, node2) and - state2 = state1 and - model = "" - } - - predicate allowImplicitRead(Node node, ContentSet c) { - any(Configuration config).allowImplicitRead(node, c) - } - - predicate neverSkip(Node node) { none() } - - int fieldFlowBranchLimit() { result = min(any(Configuration config).fieldFlowBranchLimit()) } - - int accessPathLimit() { result = 5 } - - FlowFeature getAFeature() { result = any(Configuration config).getAFeature() } - - predicate includeHiddenNodes() { any(Configuration config).includeHiddenNodes() } - - predicate observeDiffInformedIncrementalMode() { none() } -} - -deprecated private import Impl as I - -/** - * A `Node` augmented with a call context (except for sinks), an access path, and a configuration. - * Only those `PathNode`s that are reachable from a source, and which can reach a sink, are generated. - */ -deprecated class PathNode instanceof I::PathNode { - /** Gets a textual representation of this element. */ - final string toString() { result = super.toString() } - - /** - * Gets a textual representation of this element, including a textual - * representation of the call context. - */ - final string toStringWithContext() { result = super.toStringWithContext() } - - /** - * Holds if this element is at the specified location. - * The location spans column `startcolumn` of line `startline` to - * column `endcolumn` of line `endline` in file `filepath`. - * For more information, see - * [Locations](https://codeql.github.com/docs/writing-codeql-queries/providing-locations-in-codeql-queries/). - */ - final predicate hasLocationInfo( - string filepath, int startline, int startcolumn, int endline, int endcolumn - ) { - super.hasLocationInfo(filepath, startline, startcolumn, endline, endcolumn) - } - - /** Gets the underlying `Node`. */ - final Node getNode() { result = super.getNode() } - - /** Gets the `FlowState` of this node. */ - deprecated final FlowState getState() { result = getState(super.getState()) } - - /** Gets the associated configuration. */ - deprecated final Configuration getConfiguration() { result = getConfig(super.getState()) } - - /** Gets a successor of this node, if any. */ - final PathNode getASuccessor() { result = super.getASuccessor() } - - /** Holds if this node is a source. */ - final predicate isSource() { super.isSource() } - - /** Holds if this node is a grouping of source nodes. */ - final predicate isSourceGroup(string group) { super.isSourceGroup(group) } - - /** Holds if this node is a grouping of sink nodes. */ - final predicate isSinkGroup(string group) { super.isSinkGroup(group) } -} - -deprecated module PathGraph = I::PathGraph; - -deprecated private predicate hasFlow(Node source, Node sink, Configuration config) { - exists(PathNode source0, PathNode sink0 | - hasFlowPath(source0, sink0, config) and - source0.getNode() = source and - sink0.getNode() = sink - ) -} - -deprecated private predicate hasFlowPath(PathNode source, PathNode sink, Configuration config) { - I::flowPath(source, sink) and source.getConfiguration() = config -} - -deprecated private predicate hasFlowTo(Node sink, Configuration config) { hasFlow(_, sink, config) } - -deprecated predicate flowsTo = hasFlow/3; diff --git a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowImpl4.qll b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowImpl4.qll deleted file mode 100644 index 17def0c431d..00000000000 --- a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowImpl4.qll +++ /dev/null @@ -1,361 +0,0 @@ -/** - * DEPRECATED: Use `Global` and `GlobalWithState` instead. - * - * Provides a `Configuration` class backwards-compatible interface to the data - * flow library. - */ - -private import DataFlowImplCommon -private import DataFlowImplSpecific::Private -import DataFlowImplSpecific::Public -private import DataFlowImpl -import DataFlowImplCommonPublic -deprecated import FlowStateString -private import codeql.util.Unit - -/** - * DEPRECATED: Use `Global` and `GlobalWithState` instead. - * - * A configuration of interprocedural data flow analysis. This defines - * sources, sinks, and any other configurable aspect of the analysis. Each - * use of the global data flow library must define its own unique extension - * of this abstract class. To create a configuration, extend this class with - * a subclass whose characteristic predicate is a unique singleton string. - * For example, write - * - * ```ql - * class MyAnalysisConfiguration extends DataFlow::Configuration { - * MyAnalysisConfiguration() { this = "MyAnalysisConfiguration" } - * // Override `isSource` and `isSink`. - * // Optionally override `isBarrier`. - * // Optionally override `isAdditionalFlowStep`. - * } - * ``` - * Conceptually, this defines a graph where the nodes are `DataFlow::Node`s and - * the edges are those data-flow steps that preserve the value of the node - * along with any additional edges defined by `isAdditionalFlowStep`. - * Specifying nodes in `isBarrier` will remove those nodes from the graph, and - * specifying nodes in `isBarrierIn` and/or `isBarrierOut` will remove in-going - * and/or out-going edges from those nodes, respectively. - * - * Then, to query whether there is flow between some `source` and `sink`, - * write - * - * ```ql - * exists(MyAnalysisConfiguration cfg | cfg.hasFlow(source, sink)) - * ``` - * - * Multiple configurations can coexist, but two classes extending - * `DataFlow::Configuration` should never depend on each other. One of them - * should instead depend on a `DataFlow2::Configuration`, a - * `DataFlow3::Configuration`, or a `DataFlow4::Configuration`. - */ -abstract deprecated class Configuration extends string { - bindingset[this] - Configuration() { any() } - - /** - * Holds if `source` is a relevant data flow source. - */ - predicate isSource(Node source) { none() } - - /** - * Holds if `source` is a relevant data flow source with the given initial - * `state`. - */ - predicate isSource(Node source, FlowState state) { none() } - - /** - * Holds if `sink` is a relevant data flow sink. - */ - predicate isSink(Node sink) { none() } - - /** - * Holds if `sink` is a relevant data flow sink accepting `state`. - */ - predicate isSink(Node sink, FlowState state) { none() } - - /** - * Holds if data flow through `node` is prohibited. This completely removes - * `node` from the data flow graph. - */ - predicate isBarrier(Node node) { none() } - - /** - * Holds if data flow through `node` is prohibited when the flow state is - * `state`. - */ - predicate isBarrier(Node node, FlowState state) { none() } - - /** Holds if data flow into `node` is prohibited. */ - predicate isBarrierIn(Node node) { none() } - - /** Holds if data flow out of `node` is prohibited. */ - predicate isBarrierOut(Node node) { none() } - - /** - * Holds if data may flow from `node1` to `node2` in addition to the normal data-flow steps. - */ - predicate isAdditionalFlowStep(Node node1, Node node2) { none() } - - /** - * Holds if data may flow from `node1` to `node2` in addition to the normal data-flow steps. - * This step is only applicable in `state1` and updates the flow state to `state2`. - */ - predicate isAdditionalFlowStep(Node node1, FlowState state1, Node node2, FlowState state2) { - none() - } - - /** - * Holds if an arbitrary number of implicit read steps of content `c` may be - * taken at `node`. - */ - predicate allowImplicitRead(Node node, ContentSet c) { none() } - - /** - * Gets the virtual dispatch branching limit when calculating field flow. - * This can be overridden to a smaller value to improve performance (a - * value of 0 disables field flow), or a larger value to get more results. - */ - int fieldFlowBranchLimit() { result = 2 } - - /** - * Gets a data flow configuration feature to add restrictions to the set of - * valid flow paths. - * - * - `FeatureHasSourceCallContext`: - * Assume that sources have some existing call context to disallow - * conflicting return-flow directly following the source. - * - `FeatureHasSinkCallContext`: - * Assume that sinks have some existing call context to disallow - * conflicting argument-to-parameter flow directly preceding the sink. - * - `FeatureEqualSourceSinkCallContext`: - * Implies both of the above and additionally ensures that the entire flow - * path preserves the call context. - * - * These features are generally not relevant for typical end-to-end data flow - * queries, but should only be used for constructing paths that need to - * somehow be pluggable in another path context. - */ - FlowFeature getAFeature() { none() } - - /** Holds if sources should be grouped in the result of `hasFlowPath`. */ - predicate sourceGrouping(Node source, string sourceGroup) { none() } - - /** Holds if sinks should be grouped in the result of `hasFlowPath`. */ - predicate sinkGrouping(Node sink, string sinkGroup) { none() } - - /** - * Holds if data may flow from `source` to `sink` for this configuration. - */ - predicate hasFlow(Node source, Node sink) { hasFlow(source, sink, this) } - - /** - * Holds if data may flow from `source` to `sink` for this configuration. - * - * The corresponding paths are generated from the end-points and the graph - * included in the module `PathGraph`. - */ - predicate hasFlowPath(PathNode source, PathNode sink) { hasFlowPath(source, sink, this) } - - /** - * Holds if data may flow from some source to `sink` for this configuration. - */ - predicate hasFlowTo(Node sink) { hasFlowTo(sink, this) } - - /** - * Holds if data may flow from some source to `sink` for this configuration. - */ - predicate hasFlowToExpr(DataFlowExpr sink) { this.hasFlowTo(exprNode(sink)) } - - /** - * Holds if hidden nodes should be included in the data flow graph. - * - * This feature should only be used for debugging or when the data flow graph - * is not visualized (for example in a `path-problem` query). - */ - predicate includeHiddenNodes() { none() } -} - -/** - * This class exists to prevent mutual recursion between the user-overridden - * member predicates of `Configuration` and the rest of the data-flow library. - * Good performance cannot be guaranteed in the presence of such recursion, so - * it should be replaced by using more than one copy of the data flow library. - */ -abstract deprecated private class ConfigurationRecursionPrevention extends Configuration { - bindingset[this] - ConfigurationRecursionPrevention() { any() } - - override predicate hasFlow(Node source, Node sink) { - strictcount(Node n | this.isSource(n)) < 0 - or - strictcount(Node n | this.isSource(n, _)) < 0 - or - strictcount(Node n | this.isSink(n)) < 0 - or - strictcount(Node n | this.isSink(n, _)) < 0 - or - strictcount(Node n1, Node n2 | this.isAdditionalFlowStep(n1, n2)) < 0 - or - strictcount(Node n1, Node n2 | this.isAdditionalFlowStep(n1, _, n2, _)) < 0 - or - super.hasFlow(source, sink) - } -} - -deprecated private FlowState relevantState(Configuration config) { - config.isSource(_, result) or - config.isSink(_, result) or - config.isBarrier(_, result) or - config.isAdditionalFlowStep(_, result, _, _) or - config.isAdditionalFlowStep(_, _, _, result) -} - -private newtype TConfigState = - deprecated TMkConfigState(Configuration config, FlowState state) { - state = relevantState(config) or state instanceof FlowStateEmpty - } - -deprecated private Configuration getConfig(TConfigState state) { state = TMkConfigState(result, _) } - -deprecated private FlowState getState(TConfigState state) { state = TMkConfigState(_, result) } - -deprecated private predicate singleConfiguration() { 1 = strictcount(Configuration c) } - -deprecated private module Config implements FullStateConfigSig { - class FlowState = TConfigState; - - predicate isSource(Node source, FlowState state) { - getConfig(state).isSource(source, getState(state)) - or - getConfig(state).isSource(source) and getState(state) instanceof FlowStateEmpty - } - - predicate isSink(Node sink) { none() } - - predicate isSink(Node sink, FlowState state) { - getConfig(state).isSink(sink, getState(state)) - or - getConfig(state).isSink(sink) and getState(state) instanceof FlowStateEmpty - } - - predicate isBarrier(Node node) { none() } - - predicate isBarrier(Node node, FlowState state) { - getConfig(state).isBarrier(node, getState(state)) or - getConfig(state).isBarrier(node) - } - - predicate isBarrierIn(Node node) { any(Configuration config).isBarrierIn(node) } - - predicate isBarrierOut(Node node) { any(Configuration config).isBarrierOut(node) } - - predicate isBarrierIn(Node node, FlowState state) { none() } - - predicate isBarrierOut(Node node, FlowState state) { none() } - - predicate isAdditionalFlowStep(Node node1, Node node2, string model) { - singleConfiguration() and - any(Configuration config).isAdditionalFlowStep(node1, node2) and - model = "" - } - - predicate isAdditionalFlowStep( - Node node1, FlowState state1, Node node2, FlowState state2, string model - ) { - getConfig(state1).isAdditionalFlowStep(node1, getState(state1), node2, getState(state2)) and - getConfig(state2) = getConfig(state1) and - model = "" - or - not singleConfiguration() and - getConfig(state1).isAdditionalFlowStep(node1, node2) and - state2 = state1 and - model = "" - } - - predicate allowImplicitRead(Node node, ContentSet c) { - any(Configuration config).allowImplicitRead(node, c) - } - - predicate neverSkip(Node node) { none() } - - int fieldFlowBranchLimit() { result = min(any(Configuration config).fieldFlowBranchLimit()) } - - int accessPathLimit() { result = 5 } - - FlowFeature getAFeature() { result = any(Configuration config).getAFeature() } - - predicate includeHiddenNodes() { any(Configuration config).includeHiddenNodes() } - - predicate observeDiffInformedIncrementalMode() { none() } -} - -deprecated private import Impl as I - -/** - * A `Node` augmented with a call context (except for sinks), an access path, and a configuration. - * Only those `PathNode`s that are reachable from a source, and which can reach a sink, are generated. - */ -deprecated class PathNode instanceof I::PathNode { - /** Gets a textual representation of this element. */ - final string toString() { result = super.toString() } - - /** - * Gets a textual representation of this element, including a textual - * representation of the call context. - */ - final string toStringWithContext() { result = super.toStringWithContext() } - - /** - * Holds if this element is at the specified location. - * The location spans column `startcolumn` of line `startline` to - * column `endcolumn` of line `endline` in file `filepath`. - * For more information, see - * [Locations](https://codeql.github.com/docs/writing-codeql-queries/providing-locations-in-codeql-queries/). - */ - final predicate hasLocationInfo( - string filepath, int startline, int startcolumn, int endline, int endcolumn - ) { - super.hasLocationInfo(filepath, startline, startcolumn, endline, endcolumn) - } - - /** Gets the underlying `Node`. */ - final Node getNode() { result = super.getNode() } - - /** Gets the `FlowState` of this node. */ - deprecated final FlowState getState() { result = getState(super.getState()) } - - /** Gets the associated configuration. */ - deprecated final Configuration getConfiguration() { result = getConfig(super.getState()) } - - /** Gets a successor of this node, if any. */ - final PathNode getASuccessor() { result = super.getASuccessor() } - - /** Holds if this node is a source. */ - final predicate isSource() { super.isSource() } - - /** Holds if this node is a grouping of source nodes. */ - final predicate isSourceGroup(string group) { super.isSourceGroup(group) } - - /** Holds if this node is a grouping of sink nodes. */ - final predicate isSinkGroup(string group) { super.isSinkGroup(group) } -} - -deprecated module PathGraph = I::PathGraph; - -deprecated private predicate hasFlow(Node source, Node sink, Configuration config) { - exists(PathNode source0, PathNode sink0 | - hasFlowPath(source0, sink0, config) and - source0.getNode() = source and - sink0.getNode() = sink - ) -} - -deprecated private predicate hasFlowPath(PathNode source, PathNode sink, Configuration config) { - I::flowPath(source, sink) and source.getConfiguration() = config -} - -deprecated private predicate hasFlowTo(Node sink, Configuration config) { hasFlow(_, sink, config) } - -deprecated predicate flowsTo = hasFlow/3; diff --git a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowImpl5.qll b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowImpl5.qll deleted file mode 100644 index 17def0c431d..00000000000 --- a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowImpl5.qll +++ /dev/null @@ -1,361 +0,0 @@ -/** - * DEPRECATED: Use `Global` and `GlobalWithState` instead. - * - * Provides a `Configuration` class backwards-compatible interface to the data - * flow library. - */ - -private import DataFlowImplCommon -private import DataFlowImplSpecific::Private -import DataFlowImplSpecific::Public -private import DataFlowImpl -import DataFlowImplCommonPublic -deprecated import FlowStateString -private import codeql.util.Unit - -/** - * DEPRECATED: Use `Global` and `GlobalWithState` instead. - * - * A configuration of interprocedural data flow analysis. This defines - * sources, sinks, and any other configurable aspect of the analysis. Each - * use of the global data flow library must define its own unique extension - * of this abstract class. To create a configuration, extend this class with - * a subclass whose characteristic predicate is a unique singleton string. - * For example, write - * - * ```ql - * class MyAnalysisConfiguration extends DataFlow::Configuration { - * MyAnalysisConfiguration() { this = "MyAnalysisConfiguration" } - * // Override `isSource` and `isSink`. - * // Optionally override `isBarrier`. - * // Optionally override `isAdditionalFlowStep`. - * } - * ``` - * Conceptually, this defines a graph where the nodes are `DataFlow::Node`s and - * the edges are those data-flow steps that preserve the value of the node - * along with any additional edges defined by `isAdditionalFlowStep`. - * Specifying nodes in `isBarrier` will remove those nodes from the graph, and - * specifying nodes in `isBarrierIn` and/or `isBarrierOut` will remove in-going - * and/or out-going edges from those nodes, respectively. - * - * Then, to query whether there is flow between some `source` and `sink`, - * write - * - * ```ql - * exists(MyAnalysisConfiguration cfg | cfg.hasFlow(source, sink)) - * ``` - * - * Multiple configurations can coexist, but two classes extending - * `DataFlow::Configuration` should never depend on each other. One of them - * should instead depend on a `DataFlow2::Configuration`, a - * `DataFlow3::Configuration`, or a `DataFlow4::Configuration`. - */ -abstract deprecated class Configuration extends string { - bindingset[this] - Configuration() { any() } - - /** - * Holds if `source` is a relevant data flow source. - */ - predicate isSource(Node source) { none() } - - /** - * Holds if `source` is a relevant data flow source with the given initial - * `state`. - */ - predicate isSource(Node source, FlowState state) { none() } - - /** - * Holds if `sink` is a relevant data flow sink. - */ - predicate isSink(Node sink) { none() } - - /** - * Holds if `sink` is a relevant data flow sink accepting `state`. - */ - predicate isSink(Node sink, FlowState state) { none() } - - /** - * Holds if data flow through `node` is prohibited. This completely removes - * `node` from the data flow graph. - */ - predicate isBarrier(Node node) { none() } - - /** - * Holds if data flow through `node` is prohibited when the flow state is - * `state`. - */ - predicate isBarrier(Node node, FlowState state) { none() } - - /** Holds if data flow into `node` is prohibited. */ - predicate isBarrierIn(Node node) { none() } - - /** Holds if data flow out of `node` is prohibited. */ - predicate isBarrierOut(Node node) { none() } - - /** - * Holds if data may flow from `node1` to `node2` in addition to the normal data-flow steps. - */ - predicate isAdditionalFlowStep(Node node1, Node node2) { none() } - - /** - * Holds if data may flow from `node1` to `node2` in addition to the normal data-flow steps. - * This step is only applicable in `state1` and updates the flow state to `state2`. - */ - predicate isAdditionalFlowStep(Node node1, FlowState state1, Node node2, FlowState state2) { - none() - } - - /** - * Holds if an arbitrary number of implicit read steps of content `c` may be - * taken at `node`. - */ - predicate allowImplicitRead(Node node, ContentSet c) { none() } - - /** - * Gets the virtual dispatch branching limit when calculating field flow. - * This can be overridden to a smaller value to improve performance (a - * value of 0 disables field flow), or a larger value to get more results. - */ - int fieldFlowBranchLimit() { result = 2 } - - /** - * Gets a data flow configuration feature to add restrictions to the set of - * valid flow paths. - * - * - `FeatureHasSourceCallContext`: - * Assume that sources have some existing call context to disallow - * conflicting return-flow directly following the source. - * - `FeatureHasSinkCallContext`: - * Assume that sinks have some existing call context to disallow - * conflicting argument-to-parameter flow directly preceding the sink. - * - `FeatureEqualSourceSinkCallContext`: - * Implies both of the above and additionally ensures that the entire flow - * path preserves the call context. - * - * These features are generally not relevant for typical end-to-end data flow - * queries, but should only be used for constructing paths that need to - * somehow be pluggable in another path context. - */ - FlowFeature getAFeature() { none() } - - /** Holds if sources should be grouped in the result of `hasFlowPath`. */ - predicate sourceGrouping(Node source, string sourceGroup) { none() } - - /** Holds if sinks should be grouped in the result of `hasFlowPath`. */ - predicate sinkGrouping(Node sink, string sinkGroup) { none() } - - /** - * Holds if data may flow from `source` to `sink` for this configuration. - */ - predicate hasFlow(Node source, Node sink) { hasFlow(source, sink, this) } - - /** - * Holds if data may flow from `source` to `sink` for this configuration. - * - * The corresponding paths are generated from the end-points and the graph - * included in the module `PathGraph`. - */ - predicate hasFlowPath(PathNode source, PathNode sink) { hasFlowPath(source, sink, this) } - - /** - * Holds if data may flow from some source to `sink` for this configuration. - */ - predicate hasFlowTo(Node sink) { hasFlowTo(sink, this) } - - /** - * Holds if data may flow from some source to `sink` for this configuration. - */ - predicate hasFlowToExpr(DataFlowExpr sink) { this.hasFlowTo(exprNode(sink)) } - - /** - * Holds if hidden nodes should be included in the data flow graph. - * - * This feature should only be used for debugging or when the data flow graph - * is not visualized (for example in a `path-problem` query). - */ - predicate includeHiddenNodes() { none() } -} - -/** - * This class exists to prevent mutual recursion between the user-overridden - * member predicates of `Configuration` and the rest of the data-flow library. - * Good performance cannot be guaranteed in the presence of such recursion, so - * it should be replaced by using more than one copy of the data flow library. - */ -abstract deprecated private class ConfigurationRecursionPrevention extends Configuration { - bindingset[this] - ConfigurationRecursionPrevention() { any() } - - override predicate hasFlow(Node source, Node sink) { - strictcount(Node n | this.isSource(n)) < 0 - or - strictcount(Node n | this.isSource(n, _)) < 0 - or - strictcount(Node n | this.isSink(n)) < 0 - or - strictcount(Node n | this.isSink(n, _)) < 0 - or - strictcount(Node n1, Node n2 | this.isAdditionalFlowStep(n1, n2)) < 0 - or - strictcount(Node n1, Node n2 | this.isAdditionalFlowStep(n1, _, n2, _)) < 0 - or - super.hasFlow(source, sink) - } -} - -deprecated private FlowState relevantState(Configuration config) { - config.isSource(_, result) or - config.isSink(_, result) or - config.isBarrier(_, result) or - config.isAdditionalFlowStep(_, result, _, _) or - config.isAdditionalFlowStep(_, _, _, result) -} - -private newtype TConfigState = - deprecated TMkConfigState(Configuration config, FlowState state) { - state = relevantState(config) or state instanceof FlowStateEmpty - } - -deprecated private Configuration getConfig(TConfigState state) { state = TMkConfigState(result, _) } - -deprecated private FlowState getState(TConfigState state) { state = TMkConfigState(_, result) } - -deprecated private predicate singleConfiguration() { 1 = strictcount(Configuration c) } - -deprecated private module Config implements FullStateConfigSig { - class FlowState = TConfigState; - - predicate isSource(Node source, FlowState state) { - getConfig(state).isSource(source, getState(state)) - or - getConfig(state).isSource(source) and getState(state) instanceof FlowStateEmpty - } - - predicate isSink(Node sink) { none() } - - predicate isSink(Node sink, FlowState state) { - getConfig(state).isSink(sink, getState(state)) - or - getConfig(state).isSink(sink) and getState(state) instanceof FlowStateEmpty - } - - predicate isBarrier(Node node) { none() } - - predicate isBarrier(Node node, FlowState state) { - getConfig(state).isBarrier(node, getState(state)) or - getConfig(state).isBarrier(node) - } - - predicate isBarrierIn(Node node) { any(Configuration config).isBarrierIn(node) } - - predicate isBarrierOut(Node node) { any(Configuration config).isBarrierOut(node) } - - predicate isBarrierIn(Node node, FlowState state) { none() } - - predicate isBarrierOut(Node node, FlowState state) { none() } - - predicate isAdditionalFlowStep(Node node1, Node node2, string model) { - singleConfiguration() and - any(Configuration config).isAdditionalFlowStep(node1, node2) and - model = "" - } - - predicate isAdditionalFlowStep( - Node node1, FlowState state1, Node node2, FlowState state2, string model - ) { - getConfig(state1).isAdditionalFlowStep(node1, getState(state1), node2, getState(state2)) and - getConfig(state2) = getConfig(state1) and - model = "" - or - not singleConfiguration() and - getConfig(state1).isAdditionalFlowStep(node1, node2) and - state2 = state1 and - model = "" - } - - predicate allowImplicitRead(Node node, ContentSet c) { - any(Configuration config).allowImplicitRead(node, c) - } - - predicate neverSkip(Node node) { none() } - - int fieldFlowBranchLimit() { result = min(any(Configuration config).fieldFlowBranchLimit()) } - - int accessPathLimit() { result = 5 } - - FlowFeature getAFeature() { result = any(Configuration config).getAFeature() } - - predicate includeHiddenNodes() { any(Configuration config).includeHiddenNodes() } - - predicate observeDiffInformedIncrementalMode() { none() } -} - -deprecated private import Impl as I - -/** - * A `Node` augmented with a call context (except for sinks), an access path, and a configuration. - * Only those `PathNode`s that are reachable from a source, and which can reach a sink, are generated. - */ -deprecated class PathNode instanceof I::PathNode { - /** Gets a textual representation of this element. */ - final string toString() { result = super.toString() } - - /** - * Gets a textual representation of this element, including a textual - * representation of the call context. - */ - final string toStringWithContext() { result = super.toStringWithContext() } - - /** - * Holds if this element is at the specified location. - * The location spans column `startcolumn` of line `startline` to - * column `endcolumn` of line `endline` in file `filepath`. - * For more information, see - * [Locations](https://codeql.github.com/docs/writing-codeql-queries/providing-locations-in-codeql-queries/). - */ - final predicate hasLocationInfo( - string filepath, int startline, int startcolumn, int endline, int endcolumn - ) { - super.hasLocationInfo(filepath, startline, startcolumn, endline, endcolumn) - } - - /** Gets the underlying `Node`. */ - final Node getNode() { result = super.getNode() } - - /** Gets the `FlowState` of this node. */ - deprecated final FlowState getState() { result = getState(super.getState()) } - - /** Gets the associated configuration. */ - deprecated final Configuration getConfiguration() { result = getConfig(super.getState()) } - - /** Gets a successor of this node, if any. */ - final PathNode getASuccessor() { result = super.getASuccessor() } - - /** Holds if this node is a source. */ - final predicate isSource() { super.isSource() } - - /** Holds if this node is a grouping of source nodes. */ - final predicate isSourceGroup(string group) { super.isSourceGroup(group) } - - /** Holds if this node is a grouping of sink nodes. */ - final predicate isSinkGroup(string group) { super.isSinkGroup(group) } -} - -deprecated module PathGraph = I::PathGraph; - -deprecated private predicate hasFlow(Node source, Node sink, Configuration config) { - exists(PathNode source0, PathNode sink0 | - hasFlowPath(source0, sink0, config) and - source0.getNode() = source and - sink0.getNode() = sink - ) -} - -deprecated private predicate hasFlowPath(PathNode source, PathNode sink, Configuration config) { - I::flowPath(source, sink) and source.getConfiguration() = config -} - -deprecated private predicate hasFlowTo(Node sink, Configuration config) { hasFlow(_, sink, config) } - -deprecated predicate flowsTo = hasFlow/3; diff --git a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowPrivate.qll b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowPrivate.qll index cab164846e2..5b1342bacd5 100644 --- a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowPrivate.qll +++ b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowPrivate.qll @@ -731,11 +731,9 @@ module LocalFlow { or node2 = node1.(LocalFunctionCreationNode).getAnAccess(true) or - node1 = - unique(FlowSummaryNode n1 | - FlowSummaryImpl::Private::Steps::summaryLocalStep(n1.getSummaryNode(), - node2.(FlowSummaryNode).getSummaryNode(), true, _) - ) + FlowSummaryImpl::Private::Steps::summaryLocalMustFlowStep(node1 + .(FlowSummaryNode) + .getSummaryNode(), node2.(FlowSummaryNode).getSummaryNode()) } } @@ -885,6 +883,17 @@ private predicate fieldOrPropertyStore(Expr e, ContentSet c, Expr src, Expr q, b ) ) ) + or + // A write to a dynamic property + exists(DynamicMemberAccess dma, AssignableDefinition def, DynamicProperty dp | + def.getTargetAccess() = dma and + dp.getAnAccess() = dma and + c.isDynamicProperty(dp) and + src = def.getSource() and + q = dma.getQualifier() and + e = def.getExpr() and + postUpdate = true + ) } /** @@ -896,6 +905,18 @@ private predicate fieldOrPropertyRead(Expr e1, ContentSet c, FieldOrPropertyRead c = e2.getTarget().(FieldOrProperty).getContentSet() } +/** + * Holds if `e2` is an expression that reads the dynamic property `c` from + * expression `e1`. + */ +private predicate dynamicPropertyRead(Expr e1, ContentSet c, DynamicMemberRead e2) { + exists(DynamicPropertyContent dpc | + e1 = e2.getQualifier() and + dpc.getAnAccess() = e2 and + c.isDynamicProperty(dpc.getName()) + ) +} + /** * Holds if `ce` is a collection expression that adds `src` to the collection `ce`. */ @@ -1101,6 +1122,8 @@ private module Cached { | fieldOrPropertyRead(e, _, read) or + dynamicPropertyRead(e, _, read) + or arrayRead(e, read) ) ) @@ -1142,6 +1165,7 @@ private module Cached { newtype TContent = TFieldContent(Field f) { f.isUnboundDeclaration() } or TPropertyContent(Property p) { p.isUnboundDeclaration() } or + TDynamicPropertyContent(DynamicProperty dp) or TElementContent() or TSyntheticFieldContent(SyntheticField f) or TPrimaryConstructorParameterContent(Parameter p) { @@ -1156,12 +1180,16 @@ private module Cached { cached newtype TContentSet = TSingletonContent(Content c) { not c instanceof PropertyContent } or - TPropertyContentSet(Property p) { p.isUnboundDeclaration() } + TPropertyContentSet(Property p) { p.isUnboundDeclaration() } or + TDynamicPropertyContentSet(DynamicProperty dp) cached newtype TContentApprox = TFieldApproxContent(string firstChar) { firstChar = approximateFieldContent(_) } or TPropertyApproxContent(string firstChar) { firstChar = approximatePropertyContent(_) } or + TDynamicPropertyApproxContent(string firstChar) { + firstChar = approximateDynamicPropertyContent(_) + } or TElementApproxContent() or TSyntheticFieldApproxContent() or TPrimaryConstructorParameterApproxContent(string firstChar) { @@ -2086,6 +2114,18 @@ class FieldOrProperty extends Assignable, Modifiable { } } +/** A string that is a reference to a late-bound target of a dynamic member access. */ +class DynamicProperty extends string { + private DynamicMemberAccess dma; + + DynamicProperty() { this = dma.getLateBoundTargetName() } + + ContentSet getContentSet() { result.isDynamicProperty(this) } + + /** Gets an access of this dynamic property. */ + DynamicMemberAccess getAnAccess() { result = dma } +} + private class InstanceFieldOrProperty extends FieldOrProperty { InstanceFieldOrProperty() { not this.isStatic() } } @@ -2344,6 +2384,11 @@ private class ReadStepConfiguration extends ControlFlowReachabilityConfiguration or exactScope = false and isSuccessor = true and + dynamicPropertyRead(e1, _, e2) and + scope = e2 + or + exactScope = false and + isSuccessor = true and arrayRead(e1, e2) and scope = e2 or @@ -2476,6 +2521,8 @@ predicate readStep(Node node1, ContentSet c, Node node2) { exists(ReadStepConfiguration x | hasNodePath(x, node1, node2) | fieldOrPropertyRead(node1.asExpr(), c, node2.asExpr()) or + dynamicPropertyRead(node1.asExpr(), c, node2.asExpr()) + or node2.asExpr().(AwaitExpr).getExpr() = node1.asExpr() and c = getResultContent() ) @@ -3066,6 +3113,11 @@ class ContentApprox extends TContentApprox { this = TPropertyApproxContent(firstChar) and result = "approximated property " + firstChar ) or + exists(string firstChar | + this = TDynamicPropertyApproxContent(firstChar) and + result = "approximated dynamic property " + firstChar + ) + or this = TElementApproxContent() and result = "element" or this = TSyntheticFieldApproxContent() and result = "approximated synthetic field" @@ -3097,6 +3149,11 @@ private string approximatePropertyContent(PropertyContent pc) { result = pc.getProperty().getName().prefix(1) } +/** Gets a string for approximating the name of a dynamic property. */ +private string approximateDynamicPropertyContent(DynamicPropertyContent dpc) { + result = dpc.getName().prefix(1) +} + /** * Gets a string for approximating the name of a synthetic field corresponding * to a primary constructor parameter. @@ -3112,6 +3169,8 @@ ContentApprox getContentApprox(Content c) { or result = TPropertyApproxContent(approximatePropertyContent(c)) or + result = TDynamicPropertyApproxContent(approximateDynamicPropertyContent(c)) + or c instanceof ElementContent and result = TElementApproxContent() or c instanceof SyntheticFieldContent and result = TSyntheticFieldApproxContent() diff --git a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowPublic.qll b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowPublic.qll index c5460652746..877630359fd 100644 --- a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowPublic.qll +++ b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowPublic.qll @@ -239,6 +239,23 @@ class PropertyContent extends Content, TPropertyContent { override Location getLocation() { result = p.getLocation() } } +/** A reference to a dynamic property. */ +class DynamicPropertyContent extends Content, TDynamicPropertyContent { + private DynamicProperty name; + + DynamicPropertyContent() { this = TDynamicPropertyContent(name) } + + /** Gets an access of this dynamic property. */ + DynamicMemberAccess getAnAccess() { result = name.getAnAccess() } + + override string toString() { result = "dynamic property " + name } + + override EmptyLocation getLocation() { any() } + + /** Gets the name that is referenced. */ + string getName() { result = name } +} + /** * A reference to the index of an argument of a delegate call. */ @@ -324,6 +341,9 @@ class ContentSet extends TContentSet { */ predicate isProperty(Property p) { this = TPropertyContentSet(p) } + /** Holds if this content set represents the dynamic property `name`. */ + predicate isDynamicProperty(string name) { this = TDynamicPropertyContentSet(name) } + /** * Holds if this content set represents the `i`th argument of a delegate call. */ @@ -348,6 +368,8 @@ class ContentSet extends TContentSet { this.isSingleton(result) or this.isProperty(result.(PropertyContent).getProperty()) + or + this.isDynamicProperty(result.(DynamicPropertyContent).getName()) } /** Gets a content that may be read from when reading from this set. */ @@ -362,6 +384,17 @@ class ContentSet extends TContentSet { or overridesOrImplementsSourceDecl(p1, p2) ) + or + exists(FieldOrProperty p | + this = p.getContentSet() and + result.(DynamicPropertyContent).getName() = p.getName() + ) + or + this.isDynamicProperty([ + result.(DynamicPropertyContent).getName(), + result.(PropertyContent).getProperty().getName(), + result.(FieldContent).getField().getName() + ]) } /** Gets a textual representation of this content set. */ @@ -375,6 +408,11 @@ class ContentSet extends TContentSet { this.isProperty(p) and result = "property " + p.getName() ) + or + exists(string name | + this.isDynamicProperty(name) and + result = "dynamic property " + name + ) } /** Gets the location of this content set. */ @@ -388,5 +426,8 @@ class ContentSet extends TContentSet { this.isProperty(p) and result = p.getLocation() ) + or + this.isDynamicProperty(_) and + result instanceof EmptyLocation } } diff --git a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/tainttracking1/TaintTrackingImpl.qll b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/tainttracking1/TaintTrackingImpl.qll deleted file mode 100644 index 75e7856fd26..00000000000 --- a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/tainttracking1/TaintTrackingImpl.qll +++ /dev/null @@ -1,168 +0,0 @@ -/** - * DEPRECATED: Use `Global` and `GlobalWithState` instead. - * - * Provides an implementation of global (interprocedural) taint tracking. - * This file re-exports the local (intraprocedural) taint-tracking analysis - * from `TaintTrackingParameter::Public` and adds a global analysis, mainly - * exposed through the `Configuration` class. For some languages, this file - * exists in several identical copies, allowing queries to use multiple - * `Configuration` classes that depend on each other without introducing - * mutual recursion among those configurations. - */ - -import TaintTrackingParameter::Public -private import TaintTrackingParameter::Private - -/** - * DEPRECATED: Use `Global` and `GlobalWithState` instead. - * - * A configuration of interprocedural taint tracking analysis. This defines - * sources, sinks, and any other configurable aspect of the analysis. Each - * use of the taint tracking library must define its own unique extension of - * this abstract class. - * - * A taint-tracking configuration is a special data flow configuration - * (`DataFlow::Configuration`) that allows for flow through nodes that do not - * necessarily preserve values but are still relevant from a taint tracking - * perspective. (For example, string concatenation, where one of the operands - * is tainted.) - * - * To create a configuration, extend this class with a subclass whose - * characteristic predicate is a unique singleton string. For example, write - * - * ```ql - * class MyAnalysisConfiguration extends TaintTracking::Configuration { - * MyAnalysisConfiguration() { this = "MyAnalysisConfiguration" } - * // Override `isSource` and `isSink`. - * // Optionally override `isSanitizer`. - * // Optionally override `isSanitizerIn`. - * // Optionally override `isSanitizerOut`. - * // Optionally override `isSanitizerGuard`. - * // Optionally override `isAdditionalTaintStep`. - * } - * ``` - * - * Then, to query whether there is flow between some `source` and `sink`, - * write - * - * ```ql - * exists(MyAnalysisConfiguration cfg | cfg.hasFlow(source, sink)) - * ``` - * - * Multiple configurations can coexist, but it is unsupported to depend on - * another `TaintTracking::Configuration` or a `DataFlow::Configuration` in the - * overridden predicates that define sources, sinks, or additional steps. - * Instead, the dependency should go to a `TaintTracking2::Configuration` or a - * `DataFlow2::Configuration`, `DataFlow3::Configuration`, etc. - */ -abstract deprecated class Configuration extends DataFlow::Configuration { - bindingset[this] - Configuration() { any() } - - /** - * Holds if `source` is a relevant taint source. - * - * The smaller this predicate is, the faster `hasFlow()` will converge. - */ - // overridden to provide taint-tracking specific qldoc - override predicate isSource(DataFlow::Node source) { none() } - - /** - * Holds if `source` is a relevant taint source with the given initial - * `state`. - * - * The smaller this predicate is, the faster `hasFlow()` will converge. - */ - // overridden to provide taint-tracking specific qldoc - override predicate isSource(DataFlow::Node source, DataFlow::FlowState state) { none() } - - /** - * Holds if `sink` is a relevant taint sink - * - * The smaller this predicate is, the faster `hasFlow()` will converge. - */ - // overridden to provide taint-tracking specific qldoc - override predicate isSink(DataFlow::Node sink) { none() } - - /** - * Holds if `sink` is a relevant taint sink accepting `state`. - * - * The smaller this predicate is, the faster `hasFlow()` will converge. - */ - // overridden to provide taint-tracking specific qldoc - override predicate isSink(DataFlow::Node sink, DataFlow::FlowState state) { none() } - - /** Holds if the node `node` is a taint sanitizer. */ - predicate isSanitizer(DataFlow::Node node) { none() } - - final override predicate isBarrier(DataFlow::Node node) { - this.isSanitizer(node) or - defaultTaintSanitizer(node) - } - - /** - * Holds if the node `node` is a taint sanitizer when the flow state is - * `state`. - */ - predicate isSanitizer(DataFlow::Node node, DataFlow::FlowState state) { none() } - - final override predicate isBarrier(DataFlow::Node node, DataFlow::FlowState state) { - this.isSanitizer(node, state) - } - - /** Holds if taint propagation into `node` is prohibited. */ - predicate isSanitizerIn(DataFlow::Node node) { none() } - - final override predicate isBarrierIn(DataFlow::Node node) { this.isSanitizerIn(node) } - - /** Holds if taint propagation out of `node` is prohibited. */ - predicate isSanitizerOut(DataFlow::Node node) { none() } - - final override predicate isBarrierOut(DataFlow::Node node) { this.isSanitizerOut(node) } - - /** - * Holds if taint may propagate from `node1` to `node2` in addition to the normal data-flow and taint steps. - */ - predicate isAdditionalTaintStep(DataFlow::Node node1, DataFlow::Node node2) { none() } - - final override predicate isAdditionalFlowStep(DataFlow::Node node1, DataFlow::Node node2) { - this.isAdditionalTaintStep(node1, node2) or - defaultAdditionalTaintStep(node1, node2, _) - } - - /** - * Holds if taint may propagate from `node1` to `node2` in addition to the normal data-flow and taint steps. - * This step is only applicable in `state1` and updates the flow state to `state2`. - */ - predicate isAdditionalTaintStep( - DataFlow::Node node1, DataFlow::FlowState state1, DataFlow::Node node2, - DataFlow::FlowState state2 - ) { - none() - } - - final override predicate isAdditionalFlowStep( - DataFlow::Node node1, DataFlow::FlowState state1, DataFlow::Node node2, - DataFlow::FlowState state2 - ) { - this.isAdditionalTaintStep(node1, state1, node2, state2) - } - - override predicate allowImplicitRead(DataFlow::Node node, DataFlow::ContentSet c) { - ( - this.isSink(node) or - this.isSink(node, _) or - this.isAdditionalTaintStep(node, _) or - this.isAdditionalTaintStep(node, _, _, _) - ) and - defaultImplicitTaintRead(node, c) - } - - /** - * Holds if taint may flow from `source` to `sink` for this configuration. - */ - // overridden to provide taint-tracking specific qldoc - override predicate hasFlow(DataFlow::Node source, DataFlow::Node sink) { - super.hasFlow(source, sink) - } -} diff --git a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/tainttracking1/TaintTrackingParameter.qll b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/tainttracking1/TaintTrackingParameter.qll deleted file mode 100644 index 6fa484bea77..00000000000 --- a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/tainttracking1/TaintTrackingParameter.qll +++ /dev/null @@ -1,7 +0,0 @@ -import semmle.code.csharp.dataflow.internal.TaintTrackingPublic as Public - -module Private { - import semmle.code.csharp.dataflow.DataFlow::DataFlow as DataFlow - import semmle.code.csharp.dataflow.internal.DataFlowImpl as DataFlowInternal - import semmle.code.csharp.dataflow.internal.TaintTrackingPrivate -} diff --git a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/tainttracking2/TaintTrackingImpl.qll b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/tainttracking2/TaintTrackingImpl.qll deleted file mode 100644 index 75e7856fd26..00000000000 --- a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/tainttracking2/TaintTrackingImpl.qll +++ /dev/null @@ -1,168 +0,0 @@ -/** - * DEPRECATED: Use `Global` and `GlobalWithState` instead. - * - * Provides an implementation of global (interprocedural) taint tracking. - * This file re-exports the local (intraprocedural) taint-tracking analysis - * from `TaintTrackingParameter::Public` and adds a global analysis, mainly - * exposed through the `Configuration` class. For some languages, this file - * exists in several identical copies, allowing queries to use multiple - * `Configuration` classes that depend on each other without introducing - * mutual recursion among those configurations. - */ - -import TaintTrackingParameter::Public -private import TaintTrackingParameter::Private - -/** - * DEPRECATED: Use `Global` and `GlobalWithState` instead. - * - * A configuration of interprocedural taint tracking analysis. This defines - * sources, sinks, and any other configurable aspect of the analysis. Each - * use of the taint tracking library must define its own unique extension of - * this abstract class. - * - * A taint-tracking configuration is a special data flow configuration - * (`DataFlow::Configuration`) that allows for flow through nodes that do not - * necessarily preserve values but are still relevant from a taint tracking - * perspective. (For example, string concatenation, where one of the operands - * is tainted.) - * - * To create a configuration, extend this class with a subclass whose - * characteristic predicate is a unique singleton string. For example, write - * - * ```ql - * class MyAnalysisConfiguration extends TaintTracking::Configuration { - * MyAnalysisConfiguration() { this = "MyAnalysisConfiguration" } - * // Override `isSource` and `isSink`. - * // Optionally override `isSanitizer`. - * // Optionally override `isSanitizerIn`. - * // Optionally override `isSanitizerOut`. - * // Optionally override `isSanitizerGuard`. - * // Optionally override `isAdditionalTaintStep`. - * } - * ``` - * - * Then, to query whether there is flow between some `source` and `sink`, - * write - * - * ```ql - * exists(MyAnalysisConfiguration cfg | cfg.hasFlow(source, sink)) - * ``` - * - * Multiple configurations can coexist, but it is unsupported to depend on - * another `TaintTracking::Configuration` or a `DataFlow::Configuration` in the - * overridden predicates that define sources, sinks, or additional steps. - * Instead, the dependency should go to a `TaintTracking2::Configuration` or a - * `DataFlow2::Configuration`, `DataFlow3::Configuration`, etc. - */ -abstract deprecated class Configuration extends DataFlow::Configuration { - bindingset[this] - Configuration() { any() } - - /** - * Holds if `source` is a relevant taint source. - * - * The smaller this predicate is, the faster `hasFlow()` will converge. - */ - // overridden to provide taint-tracking specific qldoc - override predicate isSource(DataFlow::Node source) { none() } - - /** - * Holds if `source` is a relevant taint source with the given initial - * `state`. - * - * The smaller this predicate is, the faster `hasFlow()` will converge. - */ - // overridden to provide taint-tracking specific qldoc - override predicate isSource(DataFlow::Node source, DataFlow::FlowState state) { none() } - - /** - * Holds if `sink` is a relevant taint sink - * - * The smaller this predicate is, the faster `hasFlow()` will converge. - */ - // overridden to provide taint-tracking specific qldoc - override predicate isSink(DataFlow::Node sink) { none() } - - /** - * Holds if `sink` is a relevant taint sink accepting `state`. - * - * The smaller this predicate is, the faster `hasFlow()` will converge. - */ - // overridden to provide taint-tracking specific qldoc - override predicate isSink(DataFlow::Node sink, DataFlow::FlowState state) { none() } - - /** Holds if the node `node` is a taint sanitizer. */ - predicate isSanitizer(DataFlow::Node node) { none() } - - final override predicate isBarrier(DataFlow::Node node) { - this.isSanitizer(node) or - defaultTaintSanitizer(node) - } - - /** - * Holds if the node `node` is a taint sanitizer when the flow state is - * `state`. - */ - predicate isSanitizer(DataFlow::Node node, DataFlow::FlowState state) { none() } - - final override predicate isBarrier(DataFlow::Node node, DataFlow::FlowState state) { - this.isSanitizer(node, state) - } - - /** Holds if taint propagation into `node` is prohibited. */ - predicate isSanitizerIn(DataFlow::Node node) { none() } - - final override predicate isBarrierIn(DataFlow::Node node) { this.isSanitizerIn(node) } - - /** Holds if taint propagation out of `node` is prohibited. */ - predicate isSanitizerOut(DataFlow::Node node) { none() } - - final override predicate isBarrierOut(DataFlow::Node node) { this.isSanitizerOut(node) } - - /** - * Holds if taint may propagate from `node1` to `node2` in addition to the normal data-flow and taint steps. - */ - predicate isAdditionalTaintStep(DataFlow::Node node1, DataFlow::Node node2) { none() } - - final override predicate isAdditionalFlowStep(DataFlow::Node node1, DataFlow::Node node2) { - this.isAdditionalTaintStep(node1, node2) or - defaultAdditionalTaintStep(node1, node2, _) - } - - /** - * Holds if taint may propagate from `node1` to `node2` in addition to the normal data-flow and taint steps. - * This step is only applicable in `state1` and updates the flow state to `state2`. - */ - predicate isAdditionalTaintStep( - DataFlow::Node node1, DataFlow::FlowState state1, DataFlow::Node node2, - DataFlow::FlowState state2 - ) { - none() - } - - final override predicate isAdditionalFlowStep( - DataFlow::Node node1, DataFlow::FlowState state1, DataFlow::Node node2, - DataFlow::FlowState state2 - ) { - this.isAdditionalTaintStep(node1, state1, node2, state2) - } - - override predicate allowImplicitRead(DataFlow::Node node, DataFlow::ContentSet c) { - ( - this.isSink(node) or - this.isSink(node, _) or - this.isAdditionalTaintStep(node, _) or - this.isAdditionalTaintStep(node, _, _, _) - ) and - defaultImplicitTaintRead(node, c) - } - - /** - * Holds if taint may flow from `source` to `sink` for this configuration. - */ - // overridden to provide taint-tracking specific qldoc - override predicate hasFlow(DataFlow::Node source, DataFlow::Node sink) { - super.hasFlow(source, sink) - } -} diff --git a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/tainttracking2/TaintTrackingParameter.qll b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/tainttracking2/TaintTrackingParameter.qll deleted file mode 100644 index 6a8fa23ef31..00000000000 --- a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/tainttracking2/TaintTrackingParameter.qll +++ /dev/null @@ -1,6 +0,0 @@ -import semmle.code.csharp.dataflow.internal.TaintTrackingPublic as Public - -module Private { - import semmle.code.csharp.dataflow.DataFlow2::DataFlow2 as DataFlow - import semmle.code.csharp.dataflow.internal.TaintTrackingPrivate -} diff --git a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/tainttracking3/TaintTrackingImpl.qll b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/tainttracking3/TaintTrackingImpl.qll deleted file mode 100644 index 75e7856fd26..00000000000 --- a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/tainttracking3/TaintTrackingImpl.qll +++ /dev/null @@ -1,168 +0,0 @@ -/** - * DEPRECATED: Use `Global` and `GlobalWithState` instead. - * - * Provides an implementation of global (interprocedural) taint tracking. - * This file re-exports the local (intraprocedural) taint-tracking analysis - * from `TaintTrackingParameter::Public` and adds a global analysis, mainly - * exposed through the `Configuration` class. For some languages, this file - * exists in several identical copies, allowing queries to use multiple - * `Configuration` classes that depend on each other without introducing - * mutual recursion among those configurations. - */ - -import TaintTrackingParameter::Public -private import TaintTrackingParameter::Private - -/** - * DEPRECATED: Use `Global` and `GlobalWithState` instead. - * - * A configuration of interprocedural taint tracking analysis. This defines - * sources, sinks, and any other configurable aspect of the analysis. Each - * use of the taint tracking library must define its own unique extension of - * this abstract class. - * - * A taint-tracking configuration is a special data flow configuration - * (`DataFlow::Configuration`) that allows for flow through nodes that do not - * necessarily preserve values but are still relevant from a taint tracking - * perspective. (For example, string concatenation, where one of the operands - * is tainted.) - * - * To create a configuration, extend this class with a subclass whose - * characteristic predicate is a unique singleton string. For example, write - * - * ```ql - * class MyAnalysisConfiguration extends TaintTracking::Configuration { - * MyAnalysisConfiguration() { this = "MyAnalysisConfiguration" } - * // Override `isSource` and `isSink`. - * // Optionally override `isSanitizer`. - * // Optionally override `isSanitizerIn`. - * // Optionally override `isSanitizerOut`. - * // Optionally override `isSanitizerGuard`. - * // Optionally override `isAdditionalTaintStep`. - * } - * ``` - * - * Then, to query whether there is flow between some `source` and `sink`, - * write - * - * ```ql - * exists(MyAnalysisConfiguration cfg | cfg.hasFlow(source, sink)) - * ``` - * - * Multiple configurations can coexist, but it is unsupported to depend on - * another `TaintTracking::Configuration` or a `DataFlow::Configuration` in the - * overridden predicates that define sources, sinks, or additional steps. - * Instead, the dependency should go to a `TaintTracking2::Configuration` or a - * `DataFlow2::Configuration`, `DataFlow3::Configuration`, etc. - */ -abstract deprecated class Configuration extends DataFlow::Configuration { - bindingset[this] - Configuration() { any() } - - /** - * Holds if `source` is a relevant taint source. - * - * The smaller this predicate is, the faster `hasFlow()` will converge. - */ - // overridden to provide taint-tracking specific qldoc - override predicate isSource(DataFlow::Node source) { none() } - - /** - * Holds if `source` is a relevant taint source with the given initial - * `state`. - * - * The smaller this predicate is, the faster `hasFlow()` will converge. - */ - // overridden to provide taint-tracking specific qldoc - override predicate isSource(DataFlow::Node source, DataFlow::FlowState state) { none() } - - /** - * Holds if `sink` is a relevant taint sink - * - * The smaller this predicate is, the faster `hasFlow()` will converge. - */ - // overridden to provide taint-tracking specific qldoc - override predicate isSink(DataFlow::Node sink) { none() } - - /** - * Holds if `sink` is a relevant taint sink accepting `state`. - * - * The smaller this predicate is, the faster `hasFlow()` will converge. - */ - // overridden to provide taint-tracking specific qldoc - override predicate isSink(DataFlow::Node sink, DataFlow::FlowState state) { none() } - - /** Holds if the node `node` is a taint sanitizer. */ - predicate isSanitizer(DataFlow::Node node) { none() } - - final override predicate isBarrier(DataFlow::Node node) { - this.isSanitizer(node) or - defaultTaintSanitizer(node) - } - - /** - * Holds if the node `node` is a taint sanitizer when the flow state is - * `state`. - */ - predicate isSanitizer(DataFlow::Node node, DataFlow::FlowState state) { none() } - - final override predicate isBarrier(DataFlow::Node node, DataFlow::FlowState state) { - this.isSanitizer(node, state) - } - - /** Holds if taint propagation into `node` is prohibited. */ - predicate isSanitizerIn(DataFlow::Node node) { none() } - - final override predicate isBarrierIn(DataFlow::Node node) { this.isSanitizerIn(node) } - - /** Holds if taint propagation out of `node` is prohibited. */ - predicate isSanitizerOut(DataFlow::Node node) { none() } - - final override predicate isBarrierOut(DataFlow::Node node) { this.isSanitizerOut(node) } - - /** - * Holds if taint may propagate from `node1` to `node2` in addition to the normal data-flow and taint steps. - */ - predicate isAdditionalTaintStep(DataFlow::Node node1, DataFlow::Node node2) { none() } - - final override predicate isAdditionalFlowStep(DataFlow::Node node1, DataFlow::Node node2) { - this.isAdditionalTaintStep(node1, node2) or - defaultAdditionalTaintStep(node1, node2, _) - } - - /** - * Holds if taint may propagate from `node1` to `node2` in addition to the normal data-flow and taint steps. - * This step is only applicable in `state1` and updates the flow state to `state2`. - */ - predicate isAdditionalTaintStep( - DataFlow::Node node1, DataFlow::FlowState state1, DataFlow::Node node2, - DataFlow::FlowState state2 - ) { - none() - } - - final override predicate isAdditionalFlowStep( - DataFlow::Node node1, DataFlow::FlowState state1, DataFlow::Node node2, - DataFlow::FlowState state2 - ) { - this.isAdditionalTaintStep(node1, state1, node2, state2) - } - - override predicate allowImplicitRead(DataFlow::Node node, DataFlow::ContentSet c) { - ( - this.isSink(node) or - this.isSink(node, _) or - this.isAdditionalTaintStep(node, _) or - this.isAdditionalTaintStep(node, _, _, _) - ) and - defaultImplicitTaintRead(node, c) - } - - /** - * Holds if taint may flow from `source` to `sink` for this configuration. - */ - // overridden to provide taint-tracking specific qldoc - override predicate hasFlow(DataFlow::Node source, DataFlow::Node sink) { - super.hasFlow(source, sink) - } -} diff --git a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/tainttracking3/TaintTrackingParameter.qll b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/tainttracking3/TaintTrackingParameter.qll deleted file mode 100644 index 6c73b6ceda6..00000000000 --- a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/tainttracking3/TaintTrackingParameter.qll +++ /dev/null @@ -1,6 +0,0 @@ -import semmle.code.csharp.dataflow.internal.TaintTrackingPublic as Public - -module Private { - import semmle.code.csharp.dataflow.DataFlow3::DataFlow3 as DataFlow - import semmle.code.csharp.dataflow.internal.TaintTrackingPrivate -} diff --git a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/tainttracking4/TaintTrackingImpl.qll b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/tainttracking4/TaintTrackingImpl.qll deleted file mode 100644 index 75e7856fd26..00000000000 --- a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/tainttracking4/TaintTrackingImpl.qll +++ /dev/null @@ -1,168 +0,0 @@ -/** - * DEPRECATED: Use `Global` and `GlobalWithState` instead. - * - * Provides an implementation of global (interprocedural) taint tracking. - * This file re-exports the local (intraprocedural) taint-tracking analysis - * from `TaintTrackingParameter::Public` and adds a global analysis, mainly - * exposed through the `Configuration` class. For some languages, this file - * exists in several identical copies, allowing queries to use multiple - * `Configuration` classes that depend on each other without introducing - * mutual recursion among those configurations. - */ - -import TaintTrackingParameter::Public -private import TaintTrackingParameter::Private - -/** - * DEPRECATED: Use `Global` and `GlobalWithState` instead. - * - * A configuration of interprocedural taint tracking analysis. This defines - * sources, sinks, and any other configurable aspect of the analysis. Each - * use of the taint tracking library must define its own unique extension of - * this abstract class. - * - * A taint-tracking configuration is a special data flow configuration - * (`DataFlow::Configuration`) that allows for flow through nodes that do not - * necessarily preserve values but are still relevant from a taint tracking - * perspective. (For example, string concatenation, where one of the operands - * is tainted.) - * - * To create a configuration, extend this class with a subclass whose - * characteristic predicate is a unique singleton string. For example, write - * - * ```ql - * class MyAnalysisConfiguration extends TaintTracking::Configuration { - * MyAnalysisConfiguration() { this = "MyAnalysisConfiguration" } - * // Override `isSource` and `isSink`. - * // Optionally override `isSanitizer`. - * // Optionally override `isSanitizerIn`. - * // Optionally override `isSanitizerOut`. - * // Optionally override `isSanitizerGuard`. - * // Optionally override `isAdditionalTaintStep`. - * } - * ``` - * - * Then, to query whether there is flow between some `source` and `sink`, - * write - * - * ```ql - * exists(MyAnalysisConfiguration cfg | cfg.hasFlow(source, sink)) - * ``` - * - * Multiple configurations can coexist, but it is unsupported to depend on - * another `TaintTracking::Configuration` or a `DataFlow::Configuration` in the - * overridden predicates that define sources, sinks, or additional steps. - * Instead, the dependency should go to a `TaintTracking2::Configuration` or a - * `DataFlow2::Configuration`, `DataFlow3::Configuration`, etc. - */ -abstract deprecated class Configuration extends DataFlow::Configuration { - bindingset[this] - Configuration() { any() } - - /** - * Holds if `source` is a relevant taint source. - * - * The smaller this predicate is, the faster `hasFlow()` will converge. - */ - // overridden to provide taint-tracking specific qldoc - override predicate isSource(DataFlow::Node source) { none() } - - /** - * Holds if `source` is a relevant taint source with the given initial - * `state`. - * - * The smaller this predicate is, the faster `hasFlow()` will converge. - */ - // overridden to provide taint-tracking specific qldoc - override predicate isSource(DataFlow::Node source, DataFlow::FlowState state) { none() } - - /** - * Holds if `sink` is a relevant taint sink - * - * The smaller this predicate is, the faster `hasFlow()` will converge. - */ - // overridden to provide taint-tracking specific qldoc - override predicate isSink(DataFlow::Node sink) { none() } - - /** - * Holds if `sink` is a relevant taint sink accepting `state`. - * - * The smaller this predicate is, the faster `hasFlow()` will converge. - */ - // overridden to provide taint-tracking specific qldoc - override predicate isSink(DataFlow::Node sink, DataFlow::FlowState state) { none() } - - /** Holds if the node `node` is a taint sanitizer. */ - predicate isSanitizer(DataFlow::Node node) { none() } - - final override predicate isBarrier(DataFlow::Node node) { - this.isSanitizer(node) or - defaultTaintSanitizer(node) - } - - /** - * Holds if the node `node` is a taint sanitizer when the flow state is - * `state`. - */ - predicate isSanitizer(DataFlow::Node node, DataFlow::FlowState state) { none() } - - final override predicate isBarrier(DataFlow::Node node, DataFlow::FlowState state) { - this.isSanitizer(node, state) - } - - /** Holds if taint propagation into `node` is prohibited. */ - predicate isSanitizerIn(DataFlow::Node node) { none() } - - final override predicate isBarrierIn(DataFlow::Node node) { this.isSanitizerIn(node) } - - /** Holds if taint propagation out of `node` is prohibited. */ - predicate isSanitizerOut(DataFlow::Node node) { none() } - - final override predicate isBarrierOut(DataFlow::Node node) { this.isSanitizerOut(node) } - - /** - * Holds if taint may propagate from `node1` to `node2` in addition to the normal data-flow and taint steps. - */ - predicate isAdditionalTaintStep(DataFlow::Node node1, DataFlow::Node node2) { none() } - - final override predicate isAdditionalFlowStep(DataFlow::Node node1, DataFlow::Node node2) { - this.isAdditionalTaintStep(node1, node2) or - defaultAdditionalTaintStep(node1, node2, _) - } - - /** - * Holds if taint may propagate from `node1` to `node2` in addition to the normal data-flow and taint steps. - * This step is only applicable in `state1` and updates the flow state to `state2`. - */ - predicate isAdditionalTaintStep( - DataFlow::Node node1, DataFlow::FlowState state1, DataFlow::Node node2, - DataFlow::FlowState state2 - ) { - none() - } - - final override predicate isAdditionalFlowStep( - DataFlow::Node node1, DataFlow::FlowState state1, DataFlow::Node node2, - DataFlow::FlowState state2 - ) { - this.isAdditionalTaintStep(node1, state1, node2, state2) - } - - override predicate allowImplicitRead(DataFlow::Node node, DataFlow::ContentSet c) { - ( - this.isSink(node) or - this.isSink(node, _) or - this.isAdditionalTaintStep(node, _) or - this.isAdditionalTaintStep(node, _, _, _) - ) and - defaultImplicitTaintRead(node, c) - } - - /** - * Holds if taint may flow from `source` to `sink` for this configuration. - */ - // overridden to provide taint-tracking specific qldoc - override predicate hasFlow(DataFlow::Node source, DataFlow::Node sink) { - super.hasFlow(source, sink) - } -} diff --git a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/tainttracking4/TaintTrackingParameter.qll b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/tainttracking4/TaintTrackingParameter.qll deleted file mode 100644 index e394e27a50c..00000000000 --- a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/tainttracking4/TaintTrackingParameter.qll +++ /dev/null @@ -1,6 +0,0 @@ -import semmle.code.csharp.dataflow.internal.TaintTrackingPublic as Public - -module Private { - import semmle.code.csharp.dataflow.DataFlow4::DataFlow4 as DataFlow - import semmle.code.csharp.dataflow.internal.TaintTrackingPrivate -} diff --git a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/tainttracking5/TaintTrackingImpl.qll b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/tainttracking5/TaintTrackingImpl.qll deleted file mode 100644 index 75e7856fd26..00000000000 --- a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/tainttracking5/TaintTrackingImpl.qll +++ /dev/null @@ -1,168 +0,0 @@ -/** - * DEPRECATED: Use `Global` and `GlobalWithState` instead. - * - * Provides an implementation of global (interprocedural) taint tracking. - * This file re-exports the local (intraprocedural) taint-tracking analysis - * from `TaintTrackingParameter::Public` and adds a global analysis, mainly - * exposed through the `Configuration` class. For some languages, this file - * exists in several identical copies, allowing queries to use multiple - * `Configuration` classes that depend on each other without introducing - * mutual recursion among those configurations. - */ - -import TaintTrackingParameter::Public -private import TaintTrackingParameter::Private - -/** - * DEPRECATED: Use `Global` and `GlobalWithState` instead. - * - * A configuration of interprocedural taint tracking analysis. This defines - * sources, sinks, and any other configurable aspect of the analysis. Each - * use of the taint tracking library must define its own unique extension of - * this abstract class. - * - * A taint-tracking configuration is a special data flow configuration - * (`DataFlow::Configuration`) that allows for flow through nodes that do not - * necessarily preserve values but are still relevant from a taint tracking - * perspective. (For example, string concatenation, where one of the operands - * is tainted.) - * - * To create a configuration, extend this class with a subclass whose - * characteristic predicate is a unique singleton string. For example, write - * - * ```ql - * class MyAnalysisConfiguration extends TaintTracking::Configuration { - * MyAnalysisConfiguration() { this = "MyAnalysisConfiguration" } - * // Override `isSource` and `isSink`. - * // Optionally override `isSanitizer`. - * // Optionally override `isSanitizerIn`. - * // Optionally override `isSanitizerOut`. - * // Optionally override `isSanitizerGuard`. - * // Optionally override `isAdditionalTaintStep`. - * } - * ``` - * - * Then, to query whether there is flow between some `source` and `sink`, - * write - * - * ```ql - * exists(MyAnalysisConfiguration cfg | cfg.hasFlow(source, sink)) - * ``` - * - * Multiple configurations can coexist, but it is unsupported to depend on - * another `TaintTracking::Configuration` or a `DataFlow::Configuration` in the - * overridden predicates that define sources, sinks, or additional steps. - * Instead, the dependency should go to a `TaintTracking2::Configuration` or a - * `DataFlow2::Configuration`, `DataFlow3::Configuration`, etc. - */ -abstract deprecated class Configuration extends DataFlow::Configuration { - bindingset[this] - Configuration() { any() } - - /** - * Holds if `source` is a relevant taint source. - * - * The smaller this predicate is, the faster `hasFlow()` will converge. - */ - // overridden to provide taint-tracking specific qldoc - override predicate isSource(DataFlow::Node source) { none() } - - /** - * Holds if `source` is a relevant taint source with the given initial - * `state`. - * - * The smaller this predicate is, the faster `hasFlow()` will converge. - */ - // overridden to provide taint-tracking specific qldoc - override predicate isSource(DataFlow::Node source, DataFlow::FlowState state) { none() } - - /** - * Holds if `sink` is a relevant taint sink - * - * The smaller this predicate is, the faster `hasFlow()` will converge. - */ - // overridden to provide taint-tracking specific qldoc - override predicate isSink(DataFlow::Node sink) { none() } - - /** - * Holds if `sink` is a relevant taint sink accepting `state`. - * - * The smaller this predicate is, the faster `hasFlow()` will converge. - */ - // overridden to provide taint-tracking specific qldoc - override predicate isSink(DataFlow::Node sink, DataFlow::FlowState state) { none() } - - /** Holds if the node `node` is a taint sanitizer. */ - predicate isSanitizer(DataFlow::Node node) { none() } - - final override predicate isBarrier(DataFlow::Node node) { - this.isSanitizer(node) or - defaultTaintSanitizer(node) - } - - /** - * Holds if the node `node` is a taint sanitizer when the flow state is - * `state`. - */ - predicate isSanitizer(DataFlow::Node node, DataFlow::FlowState state) { none() } - - final override predicate isBarrier(DataFlow::Node node, DataFlow::FlowState state) { - this.isSanitizer(node, state) - } - - /** Holds if taint propagation into `node` is prohibited. */ - predicate isSanitizerIn(DataFlow::Node node) { none() } - - final override predicate isBarrierIn(DataFlow::Node node) { this.isSanitizerIn(node) } - - /** Holds if taint propagation out of `node` is prohibited. */ - predicate isSanitizerOut(DataFlow::Node node) { none() } - - final override predicate isBarrierOut(DataFlow::Node node) { this.isSanitizerOut(node) } - - /** - * Holds if taint may propagate from `node1` to `node2` in addition to the normal data-flow and taint steps. - */ - predicate isAdditionalTaintStep(DataFlow::Node node1, DataFlow::Node node2) { none() } - - final override predicate isAdditionalFlowStep(DataFlow::Node node1, DataFlow::Node node2) { - this.isAdditionalTaintStep(node1, node2) or - defaultAdditionalTaintStep(node1, node2, _) - } - - /** - * Holds if taint may propagate from `node1` to `node2` in addition to the normal data-flow and taint steps. - * This step is only applicable in `state1` and updates the flow state to `state2`. - */ - predicate isAdditionalTaintStep( - DataFlow::Node node1, DataFlow::FlowState state1, DataFlow::Node node2, - DataFlow::FlowState state2 - ) { - none() - } - - final override predicate isAdditionalFlowStep( - DataFlow::Node node1, DataFlow::FlowState state1, DataFlow::Node node2, - DataFlow::FlowState state2 - ) { - this.isAdditionalTaintStep(node1, state1, node2, state2) - } - - override predicate allowImplicitRead(DataFlow::Node node, DataFlow::ContentSet c) { - ( - this.isSink(node) or - this.isSink(node, _) or - this.isAdditionalTaintStep(node, _) or - this.isAdditionalTaintStep(node, _, _, _) - ) and - defaultImplicitTaintRead(node, c) - } - - /** - * Holds if taint may flow from `source` to `sink` for this configuration. - */ - // overridden to provide taint-tracking specific qldoc - override predicate hasFlow(DataFlow::Node source, DataFlow::Node sink) { - super.hasFlow(source, sink) - } -} diff --git a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/tainttracking5/TaintTrackingParameter.qll b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/tainttracking5/TaintTrackingParameter.qll deleted file mode 100644 index 2668be3b376..00000000000 --- a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/tainttracking5/TaintTrackingParameter.qll +++ /dev/null @@ -1,6 +0,0 @@ -import semmle.code.csharp.dataflow.internal.TaintTrackingPublic as Public - -module Private { - import semmle.code.csharp.dataflow.DataFlow5::DataFlow5 as DataFlow - import semmle.code.csharp.dataflow.internal.TaintTrackingPrivate -} diff --git a/csharp/ql/lib/semmle/code/csharp/frameworks/Format.qll b/csharp/ql/lib/semmle/code/csharp/frameworks/Format.qll index f0666b921b2..6cef58990b0 100644 --- a/csharp/ql/lib/semmle/code/csharp/frameworks/Format.qll +++ b/csharp/ql/lib/semmle/code/csharp/frameworks/Format.qll @@ -5,7 +5,6 @@ import csharp private import semmle.code.csharp.frameworks.System private import semmle.code.csharp.frameworks.system.Text -private import semmle.code.csharp.dataflow.DataFlow2 /** A method that formats a string, for example `string.Format()`. */ class FormatMethod extends Method { diff --git a/csharp/ql/lib/semmle/code/csharp/frameworks/Sql.qll b/csharp/ql/lib/semmle/code/csharp/frameworks/Sql.qll index b3b85299c69..75f72352deb 100644 --- a/csharp/ql/lib/semmle/code/csharp/frameworks/Sql.qll +++ b/csharp/ql/lib/semmle/code/csharp/frameworks/Sql.qll @@ -6,7 +6,6 @@ private import semmle.code.csharp.frameworks.system.data.SqlClient private import semmle.code.csharp.frameworks.EntityFramework private import semmle.code.csharp.frameworks.NHibernate private import semmle.code.csharp.frameworks.Dapper -private import semmle.code.csharp.dataflow.DataFlow4 /** An expression containing a SQL command. */ abstract class SqlExpr extends Expr { diff --git a/csharp/ql/lib/semmle/code/csharp/frameworks/system/Xml.qll b/csharp/ql/lib/semmle/code/csharp/frameworks/system/Xml.qll index 0644e75c3df..c0edf9e110e 100644 --- a/csharp/ql/lib/semmle/code/csharp/frameworks/system/Xml.qll +++ b/csharp/ql/lib/semmle/code/csharp/frameworks/system/Xml.qll @@ -2,7 +2,6 @@ import csharp private import semmle.code.csharp.frameworks.System -private import semmle.code.csharp.dataflow.DataFlow3 /** The `System.Xml` namespace. */ class SystemXmlNamespace extends Namespace { diff --git a/csharp/ql/lib/semmle/code/csharp/security/dataflow/ReDoSQuery.qll b/csharp/ql/lib/semmle/code/csharp/security/dataflow/ReDoSQuery.qll index 5addc03bd88..94dbf1d4cdc 100644 --- a/csharp/ql/lib/semmle/code/csharp/security/dataflow/ReDoSQuery.qll +++ b/csharp/ql/lib/semmle/code/csharp/security/dataflow/ReDoSQuery.qll @@ -4,7 +4,6 @@ */ import csharp -private import semmle.code.csharp.dataflow.DataFlow2 private import semmle.code.csharp.security.dataflow.flowsinks.FlowSinks private import semmle.code.csharp.security.dataflow.flowsources.FlowSources private import semmle.code.csharp.frameworks.system.text.RegularExpressions diff --git a/csharp/ql/lib/semmle/code/csharp/security/dataflow/UnsafeDeserializationQuery.qll b/csharp/ql/lib/semmle/code/csharp/security/dataflow/UnsafeDeserializationQuery.qll index 009e1ab73c1..5d9d18dcbac 100644 --- a/csharp/ql/lib/semmle/code/csharp/security/dataflow/UnsafeDeserializationQuery.qll +++ b/csharp/ql/lib/semmle/code/csharp/security/dataflow/UnsafeDeserializationQuery.qll @@ -5,7 +5,6 @@ import csharp private import semmle.code.csharp.serialization.Deserializers -private import semmle.code.csharp.dataflow.TaintTracking2 private import semmle.code.csharp.security.dataflow.flowsinks.FlowSinks private import semmle.code.csharp.security.dataflow.flowsources.FlowSources diff --git a/csharp/ql/lib/semmle/code/csharp/security/dataflow/XSSQuery.qll b/csharp/ql/lib/semmle/code/csharp/security/dataflow/XSSQuery.qll index 81029cc6572..2d687b51d67 100644 --- a/csharp/ql/lib/semmle/code/csharp/security/dataflow/XSSQuery.qll +++ b/csharp/ql/lib/semmle/code/csharp/security/dataflow/XSSQuery.qll @@ -7,8 +7,6 @@ import csharp private import XSSSinks private import semmle.code.csharp.security.Sanitizers private import semmle.code.csharp.security.dataflow.flowsources.FlowSources -private import semmle.code.csharp.dataflow.DataFlow2 -private import semmle.code.csharp.dataflow.TaintTracking2 /** * Holds if there is tainted flow from `source` to `sink` that may lead to a diff --git a/csharp/ql/lib/semmle/code/csharp/security/xml/InsecureXMLQuery.qll b/csharp/ql/lib/semmle/code/csharp/security/xml/InsecureXMLQuery.qll index ba98888fa6f..1abeaf797b0 100644 --- a/csharp/ql/lib/semmle/code/csharp/security/xml/InsecureXMLQuery.qll +++ b/csharp/ql/lib/semmle/code/csharp/security/xml/InsecureXMLQuery.qll @@ -150,8 +150,6 @@ module XmlSettings { /** Provides predicates related to `System.Xml.XmlReader`. */ module XmlReader { - private import semmle.code.csharp.dataflow.DataFlow2 - private class InsecureXmlReaderCreate extends InsecureXmlProcessing, MethodCall { InsecureXmlReaderCreate() { this.getTarget().hasFullyQualifiedName("System.Xml.XmlReader", "Create") diff --git a/csharp/ql/src/CHANGELOG.md b/csharp/ql/src/CHANGELOG.md index fe0765a3b18..370a9cf4a6a 100644 --- a/csharp/ql/src/CHANGELOG.md +++ b/csharp/ql/src/CHANGELOG.md @@ -1,3 +1,13 @@ +## 1.0.13 + +### Minor Analysis Improvements + +* `csharp/diagnostic/database-quality` has been changed to exclude various property access expressions from database quality evaluation. The excluded property access expressions are expected to have no target callables even in manual or autobuilt databases. + +## 1.0.12 + +No user-facing changes. + ## 1.0.11 ### Minor Analysis Improvements diff --git a/csharp/ql/src/Likely Bugs/ThreadUnsafeICryptoTransform.ql b/csharp/ql/src/Likely Bugs/ThreadUnsafeICryptoTransform.ql index e64d714f8bb..f1487d7a2ce 100644 --- a/csharp/ql/src/Likely Bugs/ThreadUnsafeICryptoTransform.ql +++ b/csharp/ql/src/Likely Bugs/ThreadUnsafeICryptoTransform.ql @@ -52,6 +52,7 @@ class ICryptoTransform extends ValueOrRefType { } from UnsafeField field +where field.fromSource() select field, "Static field '" + field.getName() + "' contains a 'System.Security.Cryptography.ICryptoTransform' that could be used in an unsafe way." diff --git a/csharp/ql/src/change-notes/released/1.0.12.md b/csharp/ql/src/change-notes/released/1.0.12.md new file mode 100644 index 00000000000..12b3cf3e18f --- /dev/null +++ b/csharp/ql/src/change-notes/released/1.0.12.md @@ -0,0 +1,3 @@ +## 1.0.12 + +No user-facing changes. diff --git a/csharp/ql/src/change-notes/2024-11-28-db-quality-property-access.md b/csharp/ql/src/change-notes/released/1.0.13.md similarity index 85% rename from csharp/ql/src/change-notes/2024-11-28-db-quality-property-access.md rename to csharp/ql/src/change-notes/released/1.0.13.md index 212c01f24bb..cfce05a8733 100644 --- a/csharp/ql/src/change-notes/2024-11-28-db-quality-property-access.md +++ b/csharp/ql/src/change-notes/released/1.0.13.md @@ -1,4 +1,5 @@ ---- -category: minorAnalysis ---- +## 1.0.13 + +### Minor Analysis Improvements + * `csharp/diagnostic/database-quality` has been changed to exclude various property access expressions from database quality evaluation. The excluded property access expressions are expected to have no target callables even in manual or autobuilt databases. diff --git a/csharp/ql/src/codeql-pack.release.yml b/csharp/ql/src/codeql-pack.release.yml index 56a2fb38872..c3be7eb7716 100644 --- a/csharp/ql/src/codeql-pack.release.yml +++ b/csharp/ql/src/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.0.11 +lastReleaseVersion: 1.0.13 diff --git a/csharp/ql/src/experimental/dataflow/flowsources/AuthCookie.qll b/csharp/ql/src/experimental/dataflow/flowsources/AuthCookie.qll index 928cf3bdc4f..401944adcc4 100644 --- a/csharp/ql/src/experimental/dataflow/flowsources/AuthCookie.qll +++ b/csharp/ql/src/experimental/dataflow/flowsources/AuthCookie.qll @@ -114,61 +114,6 @@ Expr getAValueForProp(ObjectCreation create, Assignment a, string prop) { */ predicate isPropertySet(ObjectCreation oc, string prop) { exists(getAValueForProp(oc, _, prop)) } -/** - * Tracks if a callback used in `OnAppendCookie` sets a cookie property to `true`. - */ -abstract deprecated private class OnAppendCookieTrackingConfig extends DataFlow::Configuration { - bindingset[this] - OnAppendCookieTrackingConfig() { any() } - - /** - * Specifies the cookie property name to track. - */ - abstract string propertyName(); - - override predicate isSource(DataFlow::Node source) { - exists(PropertyWrite pw, Assignment delegateAssign, Callable c | - pw.getProperty().getName() = "OnAppendCookie" and - pw.getProperty().getDeclaringType() instanceof MicrosoftAspNetCoreBuilderCookiePolicyOptions and - delegateAssign.getLValue() = pw and - ( - exists(LambdaExpr lambda | - delegateAssign.getRValue() = lambda and - lambda = c - ) - or - exists(DelegateCreation delegate | - delegateAssign.getRValue() = delegate and - delegate.getArgument().(CallableAccess).getTarget() = c - ) - ) and - c.getParameter(0) = source.asParameter() - ) - } - - override predicate isSink(DataFlow::Node sink) { - exists(PropertyWrite pw, Assignment a | - pw.getProperty().getDeclaringType() instanceof MicrosoftAspNetCoreHttpCookieOptions and - pw.getProperty().getName() = this.propertyName() and - a.getLValue() = pw and - exists(Expr val | - DataFlow::localExprFlow(val, a.getRValue()) and - val.getValue() = "true" - ) and - sink.asExpr() = pw.getQualifier() - ) - } - - override predicate isAdditionalFlowStep(DataFlow::Node node1, DataFlow::Node node2) { - node2.asExpr() = - any(PropertyRead pr | - pr.getQualifier() = node1.asExpr() and - pr.getProperty().getDeclaringType() instanceof - MicrosoftAspNetCoreCookiePolicyAppendCookieContext - ) - } -} - private signature string propertyName(); /** diff --git a/csharp/ql/src/qlpack.yml b/csharp/ql/src/qlpack.yml index b861524e144..e4d9400d96d 100644 --- a/csharp/ql/src/qlpack.yml +++ b/csharp/ql/src/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/csharp-queries -version: 1.0.12-dev +version: 1.0.14-dev groups: - csharp - queries diff --git a/csharp/ql/test/library-tests/assemblies/compilation.expected b/csharp/ql/test/library-tests/assemblies/compilation.expected index 0119bd5edee..ee9126f59ce 100644 --- a/csharp/ql/test/library-tests/assemblies/compilation.expected +++ b/csharp/ql/test/library-tests/assemblies/compilation.expected @@ -1,9 +1,9 @@ | Assembly1, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null | no compilation | | Locations, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null | has compilation | | System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | no compilation | -| System.Console, Version=8.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | no compilation | +| System.Console, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | no compilation | | System.Core, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | no compilation | -| System.Private.CoreLib, Version=8.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e | no compilation | -| System.Runtime, Version=8.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | no compilation | -| System.Runtime.Extensions, Version=8.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | no compilation | +| System.Private.CoreLib, Version=9.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e | no compilation | +| System.Runtime, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | no compilation | +| System.Runtime.Extensions, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | no compilation | | mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | no compilation | diff --git a/csharp/ql/test/library-tests/conversion/operator/Operator.expected b/csharp/ql/test/library-tests/conversion/operator/Operator.expected index dd11565ad2a..b0dcfc54260 100644 --- a/csharp/ql/test/library-tests/conversion/operator/Operator.expected +++ b/csharp/ql/test/library-tests/conversion/operator/Operator.expected @@ -21,7 +21,6 @@ | Int32 | Decimal | | Int32 | Index | | Int32 | Int128 | -| Int32 | MetadataToken | | Int32 | NFloat | | Int64 | Decimal | | Int64 | Int128 | @@ -29,7 +28,6 @@ | IntPtr | Int128 | | IntPtr | NFloat | | Memory`1 | ReadOnlyMemory | -| MetadataToken | Int32 | | NFloat | Double | | SByte | Decimal | | SByte | Half | @@ -59,4 +57,3 @@ | UIntPtr | Int128 | | UIntPtr | NFloat | | UIntPtr | UInt128 | -| UnixFileMode | Nullable | diff --git a/csharp/ql/test/library-tests/conversion/reftype/RefType.expected b/csharp/ql/test/library-tests/conversion/reftype/RefType.expected index ab433d45896..ff2c9da9ea3 100644 --- a/csharp/ql/test/library-tests/conversion/reftype/RefType.expected +++ b/csharp/ql/test/library-tests/conversion/reftype/RefType.expected @@ -183,8 +183,6 @@ | IReadOnlyList | dynamic | | Int16[] | Object | | Int16[] | dynamic | -| Int32[,] | Object | -| Int32[,] | dynamic | | Int32[] | Object | | Int32[] | dynamic | | Int64[] | Object | @@ -223,8 +221,6 @@ | T5 | C1 | | T5 | Object | | T5 | dynamic | -| UInt16[][] | Object | -| UInt16[][] | dynamic | | UInt32[] | Object | | UInt32[] | dynamic | | UInt64[] | Object | @@ -283,7 +279,6 @@ | null | IReadOnlyList | | null | IReadOnlyList | | null | Int16[] | -| null | Int32[,] | | null | Int32[] | | null | Int64[] | | null | Object | @@ -294,7 +289,6 @@ | null | T4 | | null | T4[] | | null | T5 | -| null | UInt16[][] | | null | UInt32[] | | null | UInt64[] | | null | dynamic | diff --git a/csharp/ql/test/library-tests/csharp9/FunctionPointer.expected b/csharp/ql/test/library-tests/csharp9/FunctionPointer.expected index d2617be088b..1bf279341ce 100644 --- a/csharp/ql/test/library-tests/csharp9/FunctionPointer.expected +++ b/csharp/ql/test/library-tests/csharp9/FunctionPointer.expected @@ -1,68 +1,33 @@ type | file://:0:0:0:0 | delegate* default | B | DefaultCallingConvention | | file://:0:0:0:0 | delegate* default | A | DefaultCallingConvention | -| file://:0:0:0:0 | delegate* default | Void | DefaultCallingConvention | | file://:0:0:0:0 | delegate* default | ref int | DefaultCallingConvention | | file://:0:0:0:0 | delegate* default | readonly int | DefaultCallingConvention | | file://:0:0:0:0 | delegate* default | Void* | DefaultCallingConvention | | file://:0:0:0:0 | delegate* default | int | DefaultCallingConvention | -| file://:0:0:0:0 | delegate* default | Void | DefaultCallingConvention | -| file://:0:0:0:0 | delegate* default | Void | DefaultCallingConvention | | file://:0:0:0:0 | delegate* default | int | DefaultCallingConvention | | file://:0:0:0:0 | delegate* default | int* | DefaultCallingConvention | -| file://:0:0:0:0 | delegate* default | object | DefaultCallingConvention | | file://:0:0:0:0 | delegate* stdcall | Void | StdCallCallingConvention | -| file://:0:0:0:0 | delegate* unmanaged | Void | UnmanagedCallingConvention | -| file://:0:0:0:0 | delegate* unmanaged | Void | UnmanagedCallingConvention | -| file://:0:0:0:0 | delegate* unmanaged | int | UnmanagedCallingConvention | | file://:0:0:0:0 | delegate* unmanaged | int | UnmanagedCallingConvention | | file://:0:0:0:0 | delegate* unmanaged | Void | UnmanagedCallingConvention | -| file://:0:0:0:0 | delegate* unmanaged | Void | UnmanagedCallingConvention | -| file://:0:0:0:0 | delegate* unmanaged | Void | UnmanagedCallingConvention | -| file://:0:0:0:0 | delegate* unmanaged | Void | UnmanagedCallingConvention | | file://:0:0:0:0 | delegate* unmanaged | Void | UnmanagedCallingConvention | unmanagedCallingConvention parameter | file://:0:0:0:0 | delegate* default | 0 | file://:0:0:0:0 | | A | | file://:0:0:0:0 | delegate* default | 0 | file://:0:0:0:0 | | B | -| file://:0:0:0:0 | delegate* default | 0 | file://:0:0:0:0 | | ref byte! | | file://:0:0:0:0 | delegate* default | 0 | file://:0:0:0:0 | | ref int! | | file://:0:0:0:0 | delegate* default | 1 | file://:0:0:0:0 | `1 | out object? | | file://:0:0:0:0 | delegate* default | 2 | file://:0:0:0:0 | `2 | readonly int! | | file://:0:0:0:0 | delegate* default | 0 | file://:0:0:0:0 | | ref int! | | file://:0:0:0:0 | delegate* default | 1 | file://:0:0:0:0 | `1 | out object? | | file://:0:0:0:0 | delegate* default | 0 | file://:0:0:0:0 | | int*! | -| file://:0:0:0:0 | delegate* default | 0 | file://:0:0:0:0 | | IntPtr! | -| file://:0:0:0:0 | delegate* default | 1 | file://:0:0:0:0 | `1 | ref byte! | -| file://:0:0:0:0 | delegate* default | 2 | file://:0:0:0:0 | `2 | PortableTailCallFrame*! | -| file://:0:0:0:0 | delegate* default | 0 | file://:0:0:0:0 | | object | | file://:0:0:0:0 | delegate* default | 0 | file://:0:0:0:0 | | T | | file://:0:0:0:0 | delegate* default | 0 | file://:0:0:0:0 | | Void*! | -| file://:0:0:0:0 | delegate* default | 0 | file://:0:0:0:0 | | Void*! | | file://:0:0:0:0 | delegate* stdcall | 0 | file://:0:0:0:0 | | ref int! | | file://:0:0:0:0 | delegate* stdcall | 1 | file://:0:0:0:0 | `1 | out object? | | file://:0:0:0:0 | delegate* stdcall | 2 | file://:0:0:0:0 | `2 | T | -| file://:0:0:0:0 | delegate* unmanaged | 0 | file://:0:0:0:0 | | byte*! | -| file://:0:0:0:0 | delegate* unmanaged | 1 | file://:0:0:0:0 | `1 | int! | -| file://:0:0:0:0 | delegate* unmanaged | 2 | file://:0:0:0:0 | `2 | byte! | -| file://:0:0:0:0 | delegate* unmanaged | 3 | file://:0:0:0:0 | `3 | long! | -| file://:0:0:0:0 | delegate* unmanaged | 4 | file://:0:0:0:0 | `4 | long! | -| file://:0:0:0:0 | delegate* unmanaged | 5 | file://:0:0:0:0 | `5 | EVENT_FILTER_DESCRIPTOR*! | -| file://:0:0:0:0 | delegate* unmanaged | 6 | file://:0:0:0:0 | `6 | Void*! | -| file://:0:0:0:0 | delegate* unmanaged | 0 | file://:0:0:0:0 | | char*! | -| file://:0:0:0:0 | delegate* unmanaged | 1 | file://:0:0:0:0 | `1 | IntPtr! | -| file://:0:0:0:0 | delegate* unmanaged | 0 | file://:0:0:0:0 | | int! | -| file://:0:0:0:0 | delegate* unmanaged | 1 | file://:0:0:0:0 | `1 | PosixSignal! | | file://:0:0:0:0 | delegate* unmanaged | 0 | file://:0:0:0:0 | | IntPtr! | | file://:0:0:0:0 | delegate* unmanaged | 0 | file://:0:0:0:0 | | IntPtr! | -| file://:0:0:0:0 | delegate* unmanaged | 0 | file://:0:0:0:0 | | NoGCRegionCallbackFinalizerWorkItem*! | -| file://:0:0:0:0 | delegate* unmanaged | 0 | file://:0:0:0:0 | | Void*! | -| file://:0:0:0:0 | delegate* unmanaged | 1 | file://:0:0:0:0 | `1 | byte*! | -| file://:0:0:0:0 | delegate* unmanaged | 0 | file://:0:0:0:0 | | Void*! | -| file://:0:0:0:0 | delegate* unmanaged | 1 | file://:0:0:0:0 | `1 | Void*! | -| file://:0:0:0:0 | delegate* unmanaged | 2 | file://:0:0:0:0 | `2 | Void*! | -| file://:0:0:0:0 | delegate* unmanaged | 3 | file://:0:0:0:0 | `3 | GCConfigurationType! | -| file://:0:0:0:0 | delegate* unmanaged | 4 | file://:0:0:0:0 | `4 | long! | invocation | FunctionPointer.cs:17:21:17:43 | function pointer call | | FunctionPointer.cs:23:13:23:44 | function pointer call | diff --git a/csharp/ql/test/library-tests/dataflow/collections/CollectionFlow.expected b/csharp/ql/test/library-tests/dataflow/collections/CollectionFlow.expected index 18155300ff0..d6b79d7ae6b 100644 --- a/csharp/ql/test/library-tests/dataflow/collections/CollectionFlow.expected +++ b/csharp/ql/test/library-tests/dataflow/collections/CollectionFlow.expected @@ -249,9 +249,9 @@ edges | CollectionFlow.cs:308:9:308:12 | [post] access to local variable list : List [element, property Key] : A | CollectionFlow.cs:309:9:309:12 | access to local variable list : List [element, property Key] : A | provenance | | | CollectionFlow.cs:308:18:308:47 | object creation of type KeyValuePair : KeyValuePair [property Key] : A | CollectionFlow.cs:308:9:308:12 | [post] access to local variable list : List [element, property Key] : A | provenance | MaD:3 | | CollectionFlow.cs:308:43:308:43 | access to local variable a : A | CollectionFlow.cs:308:18:308:47 | object creation of type KeyValuePair : KeyValuePair [property Key] : A | provenance | MaD:13 | -| CollectionFlow.cs:309:9:309:12 | access to local variable list : List [element, property Key] : A | CollectionFlow.cs:309:21:309:23 | kvp : KeyValuePair [property Key] : A | provenance | MaD:18 | -| CollectionFlow.cs:309:21:309:23 | kvp : KeyValuePair [property Key] : A | CollectionFlow.cs:311:18:311:20 | access to parameter kvp : KeyValuePair [property Key] : A | provenance | | -| CollectionFlow.cs:311:18:311:20 | access to parameter kvp : KeyValuePair [property Key] : A | CollectionFlow.cs:311:18:311:24 | access to property Key | provenance | | +| CollectionFlow.cs:309:9:309:12 | access to local variable list : List [element, property Key] : A | CollectionFlow.cs:309:21:309:23 | kvp : KeyValuePair [property Key] : A | provenance | MaD:18 | +| CollectionFlow.cs:309:21:309:23 | kvp : KeyValuePair [property Key] : A | CollectionFlow.cs:311:18:311:20 | access to parameter kvp : KeyValuePair [property Key] : A | provenance | | +| CollectionFlow.cs:311:18:311:20 | access to parameter kvp : KeyValuePair [property Key] : A | CollectionFlow.cs:311:18:311:24 | access to property Key | provenance | | | CollectionFlow.cs:328:32:328:38 | element : A | CollectionFlow.cs:328:55:328:61 | access to parameter element : A | provenance | | | CollectionFlow.cs:328:44:328:48 | [post] access to parameter array : A[] [element] : A | CollectionFlow.cs:328:23:328:27 | array [Return] : A[] [element] : A | provenance | | | CollectionFlow.cs:328:55:328:61 | access to parameter element : A | CollectionFlow.cs:328:44:328:48 | [post] access to parameter array : A[] [element] : A | provenance | | @@ -559,8 +559,8 @@ nodes | CollectionFlow.cs:308:18:308:47 | object creation of type KeyValuePair : KeyValuePair [property Key] : A | semmle.label | object creation of type KeyValuePair : KeyValuePair [property Key] : A | | CollectionFlow.cs:308:43:308:43 | access to local variable a : A | semmle.label | access to local variable a : A | | CollectionFlow.cs:309:9:309:12 | access to local variable list : List [element, property Key] : A | semmle.label | access to local variable list : List [element, property Key] : A | -| CollectionFlow.cs:309:21:309:23 | kvp : KeyValuePair [property Key] : A | semmle.label | kvp : KeyValuePair [property Key] : A | -| CollectionFlow.cs:311:18:311:20 | access to parameter kvp : KeyValuePair [property Key] : A | semmle.label | access to parameter kvp : KeyValuePair [property Key] : A | +| CollectionFlow.cs:309:21:309:23 | kvp : KeyValuePair [property Key] : A | semmle.label | kvp : KeyValuePair [property Key] : A | +| CollectionFlow.cs:311:18:311:20 | access to parameter kvp : KeyValuePair [property Key] : A | semmle.label | access to parameter kvp : KeyValuePair [property Key] : A | | CollectionFlow.cs:311:18:311:24 | access to property Key | semmle.label | access to property Key | | CollectionFlow.cs:328:23:328:27 | array [Return] : A[] [element] : A | semmle.label | array [Return] : A[] [element] : A | | CollectionFlow.cs:328:32:328:38 | element : A | semmle.label | element : A | diff --git a/csharp/ql/test/library-tests/dataflow/fields/FieldFlow.expected b/csharp/ql/test/library-tests/dataflow/fields/FieldFlow.expected index e4cf0bb2673..3135ce254bd 100644 --- a/csharp/ql/test/library-tests/dataflow/fields/FieldFlow.expected +++ b/csharp/ql/test/library-tests/dataflow/fields/FieldFlow.expected @@ -812,10 +812,10 @@ edges | H.cs:106:26:106:39 | (...) ... : A [field FieldA] : Object | H.cs:33:19:33:19 | a : A [field FieldA] : Object | provenance | | | H.cs:106:26:106:39 | (...) ... : A [field FieldA] : Object | H.cs:106:16:106:40 | call to method Transform : B [field FieldB] : Object | provenance | | | H.cs:106:26:106:39 | (...) ... : A [field FieldA] : Object | H.cs:106:16:106:40 | call to method Transform : B [field FieldB] : Object | provenance | | -| H.cs:106:29:106:32 | access to local variable temp : B [field FieldB, field FieldA] : Object | H.cs:106:29:106:39 | access to field FieldB : A [field FieldA] : Object | provenance | | -| H.cs:106:29:106:32 | access to local variable temp : B [field FieldB, field FieldA] : Object | H.cs:106:29:106:39 | access to field FieldB : A [field FieldA] : Object | provenance | | -| H.cs:106:29:106:39 | access to field FieldB : A [field FieldA] : Object | H.cs:106:26:106:39 | (...) ... : A [field FieldA] : Object | provenance | | -| H.cs:106:29:106:39 | access to field FieldB : A [field FieldA] : Object | H.cs:106:26:106:39 | (...) ... : A [field FieldA] : Object | provenance | | +| H.cs:106:29:106:32 | access to local variable temp : B [field FieldB, field FieldA] : Object | H.cs:106:29:106:39 | access to field FieldB : Object [field FieldA] : Object | provenance | | +| H.cs:106:29:106:32 | access to local variable temp : B [field FieldB, field FieldA] : Object | H.cs:106:29:106:39 | access to field FieldB : Object [field FieldA] : Object | provenance | | +| H.cs:106:29:106:39 | access to field FieldB : Object [field FieldA] : Object | H.cs:106:26:106:39 | (...) ... : A [field FieldA] : Object | provenance | | +| H.cs:106:29:106:39 | access to field FieldB : Object [field FieldA] : Object | H.cs:106:26:106:39 | (...) ... : A [field FieldA] : Object | provenance | | | H.cs:112:9:112:9 | [post] access to local variable a : A [field FieldA] : Object | H.cs:113:31:113:31 | access to local variable a : A [field FieldA] : Object | provenance | | | H.cs:112:9:112:9 | [post] access to local variable a : A [field FieldA] : Object | H.cs:113:31:113:31 | access to local variable a : A [field FieldA] : Object | provenance | | | H.cs:112:20:112:36 | call to method Source : Object | H.cs:112:9:112:9 | [post] access to local variable a : A [field FieldA] : Object | provenance | | @@ -908,14 +908,14 @@ edges | H.cs:165:17:165:27 | (...) ... : B | H.cs:165:13:165:13 | access to local variable b : B | provenance | | | H.cs:165:17:165:27 | (...) ... : B [field FieldB] : Object | H.cs:165:13:165:13 | access to local variable b : B [field FieldB] : Object | provenance | | | H.cs:165:17:165:27 | (...) ... : B [field FieldB] : Object | H.cs:165:13:165:13 | access to local variable b : B [field FieldB] : Object | provenance | | -| H.cs:165:20:165:20 | access to local variable a : A [field FieldA, field FieldB] : Object | H.cs:165:20:165:27 | access to field FieldA : B [field FieldB] : Object | provenance | | -| H.cs:165:20:165:20 | access to local variable a : A [field FieldA, field FieldB] : Object | H.cs:165:20:165:27 | access to field FieldA : B [field FieldB] : Object | provenance | | +| H.cs:165:20:165:20 | access to local variable a : A [field FieldA, field FieldB] : Object | H.cs:165:20:165:27 | access to field FieldA : Object [field FieldB] : Object | provenance | | +| H.cs:165:20:165:20 | access to local variable a : A [field FieldA, field FieldB] : Object | H.cs:165:20:165:27 | access to field FieldA : Object [field FieldB] : Object | provenance | | | H.cs:165:20:165:20 | access to local variable a : A [field FieldA] : B | H.cs:165:20:165:27 | access to field FieldA : B | provenance | | | H.cs:165:20:165:20 | access to local variable a : A [field FieldA] : B | H.cs:165:20:165:27 | access to field FieldA : B | provenance | | | H.cs:165:20:165:27 | access to field FieldA : B | H.cs:165:17:165:27 | (...) ... : B | provenance | | | H.cs:165:20:165:27 | access to field FieldA : B | H.cs:165:17:165:27 | (...) ... : B | provenance | | -| H.cs:165:20:165:27 | access to field FieldA : B [field FieldB] : Object | H.cs:165:17:165:27 | (...) ... : B [field FieldB] : Object | provenance | | -| H.cs:165:20:165:27 | access to field FieldA : B [field FieldB] : Object | H.cs:165:17:165:27 | (...) ... : B [field FieldB] : Object | provenance | | +| H.cs:165:20:165:27 | access to field FieldA : Object [field FieldB] : Object | H.cs:165:17:165:27 | (...) ... : B [field FieldB] : Object | provenance | | +| H.cs:165:20:165:27 | access to field FieldA : Object [field FieldB] : Object | H.cs:165:17:165:27 | (...) ... : B [field FieldB] : Object | provenance | | | H.cs:167:14:167:14 | access to local variable b : B [field FieldB] : Object | H.cs:167:14:167:21 | access to field FieldB | provenance | | | H.cs:167:14:167:14 | access to local variable b : B [field FieldB] : Object | H.cs:167:14:167:21 | access to field FieldB | provenance | | | I.cs:5:12:5:12 | this [Return] : I [field Field1] : Object | I.cs:21:13:21:19 | object creation of type I : I [field Field1] : Object | provenance | | @@ -1162,6 +1162,54 @@ edges | K.cs:8:22:8:22 | access to local variable o : String | K.cs:8:9:8:15 | [post] access to field Strings : String[] [element] : String | provenance | | | K.cs:13:14:13:20 | access to field Strings : String[] [element] : String | K.cs:13:14:13:23 | access to array element | provenance | | | K.cs:13:14:13:20 | access to field Strings : String[] [element] : String | K.cs:13:14:13:23 | access to array element | provenance | | +| L.cs:17:9:17:10 | [post] access to local variable d1 : Object [dynamic property p1] : String | L.cs:18:14:18:15 | access to local variable d1 : Object [dynamic property p1] : String | provenance | | +| L.cs:17:9:17:10 | [post] access to local variable d1 : Object [dynamic property p1] : String | L.cs:18:14:18:15 | access to local variable d1 : Object [dynamic property p1] : String | provenance | | +| L.cs:17:17:17:33 | call to method Source : String | L.cs:17:9:17:10 | [post] access to local variable d1 : Object [dynamic property p1] : String | provenance | | +| L.cs:17:17:17:33 | call to method Source : String | L.cs:17:9:17:10 | [post] access to local variable d1 : Object [dynamic property p1] : String | provenance | | +| L.cs:18:14:18:15 | access to local variable d1 : Object [dynamic property p1] : String | L.cs:18:14:18:18 | dynamic access to member p1 | provenance | | +| L.cs:18:14:18:15 | access to local variable d1 : Object [dynamic property p1] : String | L.cs:18:14:18:18 | dynamic access to member p1 | provenance | | +| L.cs:22:9:22:10 | [post] access to local variable d2 : Object [dynamic property p2] : String | L.cs:23:16:23:17 | (...) ... : L [dynamic property p2] : String | provenance | | +| L.cs:22:9:22:10 | [post] access to local variable d2 : Object [dynamic property p2] : String | L.cs:23:16:23:17 | (...) ... : L [dynamic property p2] : String | provenance | | +| L.cs:22:17:22:33 | call to method Source : String | L.cs:22:9:22:10 | [post] access to local variable d2 : Object [dynamic property p2] : String | provenance | | +| L.cs:22:17:22:33 | call to method Source : String | L.cs:22:9:22:10 | [post] access to local variable d2 : Object [dynamic property p2] : String | provenance | | +| L.cs:23:11:23:12 | access to local variable l2 : L [dynamic property p2] : String | L.cs:24:14:24:15 | access to local variable l2 : L [dynamic property p2] : String | provenance | | +| L.cs:23:11:23:12 | access to local variable l2 : L [dynamic property p2] : String | L.cs:24:14:24:15 | access to local variable l2 : L [dynamic property p2] : String | provenance | | +| L.cs:23:16:23:17 | (...) ... : L [dynamic property p2] : String | L.cs:23:11:23:12 | access to local variable l2 : L [dynamic property p2] : String | provenance | | +| L.cs:23:16:23:17 | (...) ... : L [dynamic property p2] : String | L.cs:23:11:23:12 | access to local variable l2 : L [dynamic property p2] : String | provenance | | +| L.cs:24:14:24:15 | access to local variable l2 : L [dynamic property p2] : String | L.cs:24:14:24:18 | access to property p2 | provenance | | +| L.cs:24:14:24:15 | access to local variable l2 : L [dynamic property p2] : String | L.cs:24:14:24:18 | access to property p2 | provenance | | +| L.cs:27:9:27:12 | [post] this access : L [property p3] : String | L.cs:28:17:28:18 | access to local variable d3 : L [property p3] : String | provenance | | +| L.cs:27:9:27:12 | [post] this access : L [property p3] : String | L.cs:28:17:28:18 | access to local variable d3 : L [property p3] : String | provenance | | +| L.cs:27:19:27:35 | call to method Source : String | L.cs:27:9:27:12 | [post] this access : L [property p3] : String | provenance | | +| L.cs:27:19:27:35 | call to method Source : String | L.cs:27:9:27:12 | [post] this access : L [property p3] : String | provenance | | +| L.cs:28:17:28:18 | access to local variable d3 : L [property p3] : String | L.cs:29:14:29:15 | access to local variable d3 : L [property p3] : String | provenance | | +| L.cs:28:17:28:18 | access to local variable d3 : L [property p3] : String | L.cs:29:14:29:15 | access to local variable d3 : L [property p3] : String | provenance | | +| L.cs:29:14:29:15 | access to local variable d3 : L [property p3] : String | L.cs:29:14:29:18 | dynamic access to member p3 | provenance | | +| L.cs:29:14:29:15 | access to local variable d3 : L [property p3] : String | L.cs:29:14:29:18 | dynamic access to member p3 | provenance | | +| L.cs:33:9:33:10 | [post] access to local variable d4 : Object [dynamic property f1] : String | L.cs:34:14:34:15 | access to local variable d4 : Object [dynamic property f1] : String | provenance | | +| L.cs:33:9:33:10 | [post] access to local variable d4 : Object [dynamic property f1] : String | L.cs:34:14:34:15 | access to local variable d4 : Object [dynamic property f1] : String | provenance | | +| L.cs:33:17:33:33 | call to method Source : String | L.cs:33:9:33:10 | [post] access to local variable d4 : Object [dynamic property f1] : String | provenance | | +| L.cs:33:17:33:33 | call to method Source : String | L.cs:33:9:33:10 | [post] access to local variable d4 : Object [dynamic property f1] : String | provenance | | +| L.cs:34:14:34:15 | access to local variable d4 : Object [dynamic property f1] : String | L.cs:34:14:34:18 | dynamic access to member f1 | provenance | | +| L.cs:34:14:34:15 | access to local variable d4 : Object [dynamic property f1] : String | L.cs:34:14:34:18 | dynamic access to member f1 | provenance | | +| L.cs:38:9:38:10 | [post] access to local variable d5 : Object [dynamic property f2] : String | L.cs:39:16:39:17 | (...) ... : L [dynamic property f2] : String | provenance | | +| L.cs:38:9:38:10 | [post] access to local variable d5 : Object [dynamic property f2] : String | L.cs:39:16:39:17 | (...) ... : L [dynamic property f2] : String | provenance | | +| L.cs:38:17:38:33 | call to method Source : String | L.cs:38:9:38:10 | [post] access to local variable d5 : Object [dynamic property f2] : String | provenance | | +| L.cs:38:17:38:33 | call to method Source : String | L.cs:38:9:38:10 | [post] access to local variable d5 : Object [dynamic property f2] : String | provenance | | +| L.cs:39:11:39:12 | access to local variable l5 : L [dynamic property f2] : String | L.cs:40:14:40:15 | access to local variable l5 : L [dynamic property f2] : String | provenance | | +| L.cs:39:11:39:12 | access to local variable l5 : L [dynamic property f2] : String | L.cs:40:14:40:15 | access to local variable l5 : L [dynamic property f2] : String | provenance | | +| L.cs:39:16:39:17 | (...) ... : L [dynamic property f2] : String | L.cs:39:11:39:12 | access to local variable l5 : L [dynamic property f2] : String | provenance | | +| L.cs:39:16:39:17 | (...) ... : L [dynamic property f2] : String | L.cs:39:11:39:12 | access to local variable l5 : L [dynamic property f2] : String | provenance | | +| L.cs:40:14:40:15 | access to local variable l5 : L [dynamic property f2] : String | L.cs:40:14:40:18 | access to field f2 | provenance | | +| L.cs:40:14:40:15 | access to local variable l5 : L [dynamic property f2] : String | L.cs:40:14:40:18 | access to field f2 | provenance | | +| L.cs:43:9:43:12 | [post] this access : L [field f3] : String | L.cs:44:17:44:18 | access to local variable d6 : L [field f3] : String | provenance | | +| L.cs:43:9:43:12 | [post] this access : L [field f3] : String | L.cs:44:17:44:18 | access to local variable d6 : L [field f3] : String | provenance | | +| L.cs:43:19:43:35 | call to method Source : String | L.cs:43:9:43:12 | [post] this access : L [field f3] : String | provenance | | +| L.cs:43:19:43:35 | call to method Source : String | L.cs:43:9:43:12 | [post] this access : L [field f3] : String | provenance | | +| L.cs:44:17:44:18 | access to local variable d6 : L [field f3] : String | L.cs:45:14:45:15 | access to local variable d6 : L [field f3] : String | provenance | | +| L.cs:44:17:44:18 | access to local variable d6 : L [field f3] : String | L.cs:45:14:45:15 | access to local variable d6 : L [field f3] : String | provenance | | +| L.cs:45:14:45:15 | access to local variable d6 : L [field f3] : String | L.cs:45:14:45:18 | dynamic access to member f3 | provenance | | +| L.cs:45:14:45:15 | access to local variable d6 : L [field f3] : String | L.cs:45:14:45:18 | dynamic access to member f3 | provenance | | nodes | A.cs:5:13:5:13 | access to local variable c : C | semmle.label | access to local variable c : C | | A.cs:5:13:5:13 | access to local variable c : C | semmle.label | access to local variable c : C | @@ -2033,8 +2081,8 @@ nodes | H.cs:106:26:106:39 | (...) ... : A [field FieldA] : Object | semmle.label | (...) ... : A [field FieldA] : Object | | H.cs:106:29:106:32 | access to local variable temp : B [field FieldB, field FieldA] : Object | semmle.label | access to local variable temp : B [field FieldB, field FieldA] : Object | | H.cs:106:29:106:32 | access to local variable temp : B [field FieldB, field FieldA] : Object | semmle.label | access to local variable temp : B [field FieldB, field FieldA] : Object | -| H.cs:106:29:106:39 | access to field FieldB : A [field FieldA] : Object | semmle.label | access to field FieldB : A [field FieldA] : Object | -| H.cs:106:29:106:39 | access to field FieldB : A [field FieldA] : Object | semmle.label | access to field FieldB : A [field FieldA] : Object | +| H.cs:106:29:106:39 | access to field FieldB : Object [field FieldA] : Object | semmle.label | access to field FieldB : Object [field FieldA] : Object | +| H.cs:106:29:106:39 | access to field FieldB : Object [field FieldA] : Object | semmle.label | access to field FieldB : Object [field FieldA] : Object | | H.cs:112:9:112:9 | [post] access to local variable a : A [field FieldA] : Object | semmle.label | [post] access to local variable a : A [field FieldA] : Object | | H.cs:112:9:112:9 | [post] access to local variable a : A [field FieldA] : Object | semmle.label | [post] access to local variable a : A [field FieldA] : Object | | H.cs:112:20:112:36 | call to method Source : Object | semmle.label | call to method Source : Object | @@ -2133,8 +2181,8 @@ nodes | H.cs:165:20:165:20 | access to local variable a : A [field FieldA] : B | semmle.label | access to local variable a : A [field FieldA] : B | | H.cs:165:20:165:27 | access to field FieldA : B | semmle.label | access to field FieldA : B | | H.cs:165:20:165:27 | access to field FieldA : B | semmle.label | access to field FieldA : B | -| H.cs:165:20:165:27 | access to field FieldA : B [field FieldB] : Object | semmle.label | access to field FieldA : B [field FieldB] : Object | -| H.cs:165:20:165:27 | access to field FieldA : B [field FieldB] : Object | semmle.label | access to field FieldA : B [field FieldB] : Object | +| H.cs:165:20:165:27 | access to field FieldA : Object [field FieldB] : Object | semmle.label | access to field FieldA : Object [field FieldB] : Object | +| H.cs:165:20:165:27 | access to field FieldA : Object [field FieldB] : Object | semmle.label | access to field FieldA : Object [field FieldB] : Object | | H.cs:166:14:166:14 | access to local variable b | semmle.label | access to local variable b | | H.cs:166:14:166:14 | access to local variable b | semmle.label | access to local variable b | | H.cs:167:14:167:14 | access to local variable b : B [field FieldB] : Object | semmle.label | access to local variable b : B [field FieldB] : Object | @@ -2415,6 +2463,66 @@ nodes | K.cs:13:14:13:20 | access to field Strings : String[] [element] : String | semmle.label | access to field Strings : String[] [element] : String | | K.cs:13:14:13:23 | access to array element | semmle.label | access to array element | | K.cs:13:14:13:23 | access to array element | semmle.label | access to array element | +| L.cs:17:9:17:10 | [post] access to local variable d1 : Object [dynamic property p1] : String | semmle.label | [post] access to local variable d1 : Object [dynamic property p1] : String | +| L.cs:17:9:17:10 | [post] access to local variable d1 : Object [dynamic property p1] : String | semmle.label | [post] access to local variable d1 : Object [dynamic property p1] : String | +| L.cs:17:17:17:33 | call to method Source : String | semmle.label | call to method Source : String | +| L.cs:17:17:17:33 | call to method Source : String | semmle.label | call to method Source : String | +| L.cs:18:14:18:15 | access to local variable d1 : Object [dynamic property p1] : String | semmle.label | access to local variable d1 : Object [dynamic property p1] : String | +| L.cs:18:14:18:15 | access to local variable d1 : Object [dynamic property p1] : String | semmle.label | access to local variable d1 : Object [dynamic property p1] : String | +| L.cs:18:14:18:18 | dynamic access to member p1 | semmle.label | dynamic access to member p1 | +| L.cs:18:14:18:18 | dynamic access to member p1 | semmle.label | dynamic access to member p1 | +| L.cs:22:9:22:10 | [post] access to local variable d2 : Object [dynamic property p2] : String | semmle.label | [post] access to local variable d2 : Object [dynamic property p2] : String | +| L.cs:22:9:22:10 | [post] access to local variable d2 : Object [dynamic property p2] : String | semmle.label | [post] access to local variable d2 : Object [dynamic property p2] : String | +| L.cs:22:17:22:33 | call to method Source : String | semmle.label | call to method Source : String | +| L.cs:22:17:22:33 | call to method Source : String | semmle.label | call to method Source : String | +| L.cs:23:11:23:12 | access to local variable l2 : L [dynamic property p2] : String | semmle.label | access to local variable l2 : L [dynamic property p2] : String | +| L.cs:23:11:23:12 | access to local variable l2 : L [dynamic property p2] : String | semmle.label | access to local variable l2 : L [dynamic property p2] : String | +| L.cs:23:16:23:17 | (...) ... : L [dynamic property p2] : String | semmle.label | (...) ... : L [dynamic property p2] : String | +| L.cs:23:16:23:17 | (...) ... : L [dynamic property p2] : String | semmle.label | (...) ... : L [dynamic property p2] : String | +| L.cs:24:14:24:15 | access to local variable l2 : L [dynamic property p2] : String | semmle.label | access to local variable l2 : L [dynamic property p2] : String | +| L.cs:24:14:24:15 | access to local variable l2 : L [dynamic property p2] : String | semmle.label | access to local variable l2 : L [dynamic property p2] : String | +| L.cs:24:14:24:18 | access to property p2 | semmle.label | access to property p2 | +| L.cs:24:14:24:18 | access to property p2 | semmle.label | access to property p2 | +| L.cs:27:9:27:12 | [post] this access : L [property p3] : String | semmle.label | [post] this access : L [property p3] : String | +| L.cs:27:9:27:12 | [post] this access : L [property p3] : String | semmle.label | [post] this access : L [property p3] : String | +| L.cs:27:19:27:35 | call to method Source : String | semmle.label | call to method Source : String | +| L.cs:27:19:27:35 | call to method Source : String | semmle.label | call to method Source : String | +| L.cs:28:17:28:18 | access to local variable d3 : L [property p3] : String | semmle.label | access to local variable d3 : L [property p3] : String | +| L.cs:28:17:28:18 | access to local variable d3 : L [property p3] : String | semmle.label | access to local variable d3 : L [property p3] : String | +| L.cs:29:14:29:15 | access to local variable d3 : L [property p3] : String | semmle.label | access to local variable d3 : L [property p3] : String | +| L.cs:29:14:29:15 | access to local variable d3 : L [property p3] : String | semmle.label | access to local variable d3 : L [property p3] : String | +| L.cs:29:14:29:18 | dynamic access to member p3 | semmle.label | dynamic access to member p3 | +| L.cs:29:14:29:18 | dynamic access to member p3 | semmle.label | dynamic access to member p3 | +| L.cs:33:9:33:10 | [post] access to local variable d4 : Object [dynamic property f1] : String | semmle.label | [post] access to local variable d4 : Object [dynamic property f1] : String | +| L.cs:33:9:33:10 | [post] access to local variable d4 : Object [dynamic property f1] : String | semmle.label | [post] access to local variable d4 : Object [dynamic property f1] : String | +| L.cs:33:17:33:33 | call to method Source : String | semmle.label | call to method Source : String | +| L.cs:33:17:33:33 | call to method Source : String | semmle.label | call to method Source : String | +| L.cs:34:14:34:15 | access to local variable d4 : Object [dynamic property f1] : String | semmle.label | access to local variable d4 : Object [dynamic property f1] : String | +| L.cs:34:14:34:15 | access to local variable d4 : Object [dynamic property f1] : String | semmle.label | access to local variable d4 : Object [dynamic property f1] : String | +| L.cs:34:14:34:18 | dynamic access to member f1 | semmle.label | dynamic access to member f1 | +| L.cs:34:14:34:18 | dynamic access to member f1 | semmle.label | dynamic access to member f1 | +| L.cs:38:9:38:10 | [post] access to local variable d5 : Object [dynamic property f2] : String | semmle.label | [post] access to local variable d5 : Object [dynamic property f2] : String | +| L.cs:38:9:38:10 | [post] access to local variable d5 : Object [dynamic property f2] : String | semmle.label | [post] access to local variable d5 : Object [dynamic property f2] : String | +| L.cs:38:17:38:33 | call to method Source : String | semmle.label | call to method Source : String | +| L.cs:38:17:38:33 | call to method Source : String | semmle.label | call to method Source : String | +| L.cs:39:11:39:12 | access to local variable l5 : L [dynamic property f2] : String | semmle.label | access to local variable l5 : L [dynamic property f2] : String | +| L.cs:39:11:39:12 | access to local variable l5 : L [dynamic property f2] : String | semmle.label | access to local variable l5 : L [dynamic property f2] : String | +| L.cs:39:16:39:17 | (...) ... : L [dynamic property f2] : String | semmle.label | (...) ... : L [dynamic property f2] : String | +| L.cs:39:16:39:17 | (...) ... : L [dynamic property f2] : String | semmle.label | (...) ... : L [dynamic property f2] : String | +| L.cs:40:14:40:15 | access to local variable l5 : L [dynamic property f2] : String | semmle.label | access to local variable l5 : L [dynamic property f2] : String | +| L.cs:40:14:40:15 | access to local variable l5 : L [dynamic property f2] : String | semmle.label | access to local variable l5 : L [dynamic property f2] : String | +| L.cs:40:14:40:18 | access to field f2 | semmle.label | access to field f2 | +| L.cs:40:14:40:18 | access to field f2 | semmle.label | access to field f2 | +| L.cs:43:9:43:12 | [post] this access : L [field f3] : String | semmle.label | [post] this access : L [field f3] : String | +| L.cs:43:9:43:12 | [post] this access : L [field f3] : String | semmle.label | [post] this access : L [field f3] : String | +| L.cs:43:19:43:35 | call to method Source : String | semmle.label | call to method Source : String | +| L.cs:43:19:43:35 | call to method Source : String | semmle.label | call to method Source : String | +| L.cs:44:17:44:18 | access to local variable d6 : L [field f3] : String | semmle.label | access to local variable d6 : L [field f3] : String | +| L.cs:44:17:44:18 | access to local variable d6 : L [field f3] : String | semmle.label | access to local variable d6 : L [field f3] : String | +| L.cs:45:14:45:15 | access to local variable d6 : L [field f3] : String | semmle.label | access to local variable d6 : L [field f3] : String | +| L.cs:45:14:45:15 | access to local variable d6 : L [field f3] : String | semmle.label | access to local variable d6 : L [field f3] : String | +| L.cs:45:14:45:18 | dynamic access to member f3 | semmle.label | dynamic access to member f3 | +| L.cs:45:14:45:18 | dynamic access to member f3 | semmle.label | dynamic access to member f3 | subpaths | A.cs:6:24:6:24 | access to local variable c : C | A.cs:147:32:147:32 | c : C | A.cs:149:20:149:27 | object creation of type B : B [field c] : C | A.cs:6:17:6:25 | call to method Make : B [field c] : C | | A.cs:6:24:6:24 | access to local variable c : C | A.cs:147:32:147:32 | c : C | A.cs:149:20:149:27 | object creation of type B : B [field c] : C | A.cs:6:17:6:25 | call to method Make : B [field c] : C | @@ -2672,3 +2780,15 @@ testFailures | J.cs:125:14:125:17 | (...) ... | J.cs:119:20:119:34 | call to method Source : Int32 | J.cs:125:14:125:17 | (...) ... | $@ | J.cs:119:20:119:34 | call to method Source : Int32 | call to method Source : Int32 | | K.cs:13:14:13:23 | access to array element | K.cs:7:17:7:33 | call to method Source : String | K.cs:13:14:13:23 | access to array element | $@ | K.cs:7:17:7:33 | call to method Source : String | call to method Source : String | | K.cs:13:14:13:23 | access to array element | K.cs:7:17:7:33 | call to method Source : String | K.cs:13:14:13:23 | access to array element | $@ | K.cs:7:17:7:33 | call to method Source : String | call to method Source : String | +| L.cs:18:14:18:18 | dynamic access to member p1 | L.cs:17:17:17:33 | call to method Source : String | L.cs:18:14:18:18 | dynamic access to member p1 | $@ | L.cs:17:17:17:33 | call to method Source : String | call to method Source : String | +| L.cs:18:14:18:18 | dynamic access to member p1 | L.cs:17:17:17:33 | call to method Source : String | L.cs:18:14:18:18 | dynamic access to member p1 | $@ | L.cs:17:17:17:33 | call to method Source : String | call to method Source : String | +| L.cs:24:14:24:18 | access to property p2 | L.cs:22:17:22:33 | call to method Source : String | L.cs:24:14:24:18 | access to property p2 | $@ | L.cs:22:17:22:33 | call to method Source : String | call to method Source : String | +| L.cs:24:14:24:18 | access to property p2 | L.cs:22:17:22:33 | call to method Source : String | L.cs:24:14:24:18 | access to property p2 | $@ | L.cs:22:17:22:33 | call to method Source : String | call to method Source : String | +| L.cs:29:14:29:18 | dynamic access to member p3 | L.cs:27:19:27:35 | call to method Source : String | L.cs:29:14:29:18 | dynamic access to member p3 | $@ | L.cs:27:19:27:35 | call to method Source : String | call to method Source : String | +| L.cs:29:14:29:18 | dynamic access to member p3 | L.cs:27:19:27:35 | call to method Source : String | L.cs:29:14:29:18 | dynamic access to member p3 | $@ | L.cs:27:19:27:35 | call to method Source : String | call to method Source : String | +| L.cs:34:14:34:18 | dynamic access to member f1 | L.cs:33:17:33:33 | call to method Source : String | L.cs:34:14:34:18 | dynamic access to member f1 | $@ | L.cs:33:17:33:33 | call to method Source : String | call to method Source : String | +| L.cs:34:14:34:18 | dynamic access to member f1 | L.cs:33:17:33:33 | call to method Source : String | L.cs:34:14:34:18 | dynamic access to member f1 | $@ | L.cs:33:17:33:33 | call to method Source : String | call to method Source : String | +| L.cs:40:14:40:18 | access to field f2 | L.cs:38:17:38:33 | call to method Source : String | L.cs:40:14:40:18 | access to field f2 | $@ | L.cs:38:17:38:33 | call to method Source : String | call to method Source : String | +| L.cs:40:14:40:18 | access to field f2 | L.cs:38:17:38:33 | call to method Source : String | L.cs:40:14:40:18 | access to field f2 | $@ | L.cs:38:17:38:33 | call to method Source : String | call to method Source : String | +| L.cs:45:14:45:18 | dynamic access to member f3 | L.cs:43:19:43:35 | call to method Source : String | L.cs:45:14:45:18 | dynamic access to member f3 | $@ | L.cs:43:19:43:35 | call to method Source : String | call to method Source : String | +| L.cs:45:14:45:18 | dynamic access to member f3 | L.cs:43:19:43:35 | call to method Source : String | L.cs:45:14:45:18 | dynamic access to member f3 | $@ | L.cs:43:19:43:35 | call to method Source : String | call to method Source : String | diff --git a/csharp/ql/test/library-tests/dataflow/fields/L.cs b/csharp/ql/test/library-tests/dataflow/fields/L.cs new file mode 100644 index 00000000000..7bc53f45133 --- /dev/null +++ b/csharp/ql/test/library-tests/dataflow/fields/L.cs @@ -0,0 +1,51 @@ +using System; + +public class L +{ + public string p1 { get; set; } + public string p2 { get; set; } + public string p3 { get; set; } + + private string f1; + private string f2; + private string f3; + + private void M1() + { + // dynamic property write followed by dynamic property read + dynamic d1 = this; + d1.p1 = Source(1); + Sink(d1.p1); // $ hasValueFlow=1 + + // dynamic property write followed by static property read + dynamic d2 = this; + d2.p2 = Source(2); + L l2 = d2; + Sink(l2.p2); // $ hasValueFlow=2 + + // static property write followed by dynamic property read + this.p3 = Source(3); + dynamic d3 = this; + Sink(d3.p3); // $ hasValueFlow=3 + + // dynamic property write followed by dynamic field read + dynamic d4 = this; + d4.f1 = Source(4); + Sink(d4.f1); // $ hasValueFlow=4 + + // dynamic property write followed by static field read + dynamic d5 = this; + d5.f2 = Source(5); + L l5 = d5; + Sink(l5.f2); // $ hasValueFlow=5 + + // static field write followed by dynamic property read + this.f3 = Source(6); + dynamic d6 = this; + Sink(d6.f3); // $ hasValueFlow=6 + } + + public static void Sink(object o) { } + + static T Source(object source) => throw null; +} diff --git a/csharp/ql/test/library-tests/dataflow/global/DataFlowPath.expected b/csharp/ql/test/library-tests/dataflow/global/DataFlowPath.expected index 74c1c62de1f..c5f00cd656f 100644 --- a/csharp/ql/test/library-tests/dataflow/global/DataFlowPath.expected +++ b/csharp/ql/test/library-tests/dataflow/global/DataFlowPath.expected @@ -136,8 +136,8 @@ edges | Capture.cs:334:9:334:30 | access to local function CapturingLocalFunction : CapturingLocalFunction [captured x] : String | Capture.cs:332:42:332:62 | access to local function CapturedLocalFunction : CapturedLocalFunction [captured x] : String | provenance | | | Capture.cs:339:17:339:30 | "taint source" : String | Capture.cs:341:33:341:46 | (...) => ... : (...) => ... [captured x] : String | provenance | | | Capture.cs:341:33:341:46 | (...) => ... : (...) => ... [captured x] : String | Capture.cs:345:9:345:23 | access to local variable capturingLambda : Action [captured capturedLambda, captured x] : String | provenance | | -| Capture.cs:343:40:343:53 | access to local variable capturedLambda : (...) => ... [captured x] : String | Capture.cs:341:45:341:45 | access to local variable x | provenance | | -| Capture.cs:345:9:345:23 | access to local variable capturingLambda : Action [captured capturedLambda, captured x] : String | Capture.cs:343:40:343:53 | access to local variable capturedLambda : (...) => ... [captured x] : String | provenance | | +| Capture.cs:343:40:343:53 | access to local variable capturedLambda : Action [captured x] : String | Capture.cs:341:45:341:45 | access to local variable x | provenance | | +| Capture.cs:345:9:345:23 | access to local variable capturingLambda : Action [captured capturedLambda, captured x] : String | Capture.cs:343:40:343:53 | access to local variable capturedLambda : Action [captured x] : String | provenance | | | Capture.cs:350:34:350:34 | a : (...) => ... [captured s] : String | Capture.cs:352:9:352:9 | access to parameter a : (...) => ... [captured s] : String | provenance | | | Capture.cs:350:34:350:34 | a : (...) => ... [captured sink39] : String | Capture.cs:352:9:352:9 | access to parameter a : (...) => ... [captured sink39] : String | provenance | | | Capture.cs:350:34:350:34 | a : (...) => ... [captured sink39] : String | Capture.cs:352:9:352:9 | access to parameter a : (...) => ... [captured sink39] : String | provenance | | @@ -639,7 +639,7 @@ nodes | Capture.cs:339:17:339:30 | "taint source" : String | semmle.label | "taint source" : String | | Capture.cs:341:33:341:46 | (...) => ... : (...) => ... [captured x] : String | semmle.label | (...) => ... : (...) => ... [captured x] : String | | Capture.cs:341:45:341:45 | access to local variable x | semmle.label | access to local variable x | -| Capture.cs:343:40:343:53 | access to local variable capturedLambda : (...) => ... [captured x] : String | semmle.label | access to local variable capturedLambda : (...) => ... [captured x] : String | +| Capture.cs:343:40:343:53 | access to local variable capturedLambda : Action [captured x] : String | semmle.label | access to local variable capturedLambda : Action [captured x] : String | | Capture.cs:345:9:345:23 | access to local variable capturingLambda : Action [captured capturedLambda, captured x] : String | semmle.label | access to local variable capturingLambda : Action [captured capturedLambda, captured x] : String | | Capture.cs:350:34:350:34 | a : (...) => ... [captured s] : String | semmle.label | a : (...) => ... [captured s] : String | | Capture.cs:350:34:350:34 | a : (...) => ... [captured sink39] : String | semmle.label | a : (...) => ... [captured sink39] : String | diff --git a/csharp/ql/test/library-tests/dataflow/global/TaintTrackingPath.expected b/csharp/ql/test/library-tests/dataflow/global/TaintTrackingPath.expected index 1d05b0ae55e..f90f71d1ea9 100644 --- a/csharp/ql/test/library-tests/dataflow/global/TaintTrackingPath.expected +++ b/csharp/ql/test/library-tests/dataflow/global/TaintTrackingPath.expected @@ -146,8 +146,8 @@ edges | Capture.cs:334:9:334:30 | access to local function CapturingLocalFunction : CapturingLocalFunction [captured x] : String | Capture.cs:332:42:332:62 | access to local function CapturedLocalFunction : CapturedLocalFunction [captured x] : String | provenance | | | Capture.cs:339:17:339:30 | "taint source" : String | Capture.cs:341:33:341:46 | (...) => ... : (...) => ... [captured x] : String | provenance | | | Capture.cs:341:33:341:46 | (...) => ... : (...) => ... [captured x] : String | Capture.cs:345:9:345:23 | access to local variable capturingLambda : Action [captured capturedLambda, captured x] : String | provenance | | -| Capture.cs:343:40:343:53 | access to local variable capturedLambda : (...) => ... [captured x] : String | Capture.cs:341:45:341:45 | access to local variable x | provenance | | -| Capture.cs:345:9:345:23 | access to local variable capturingLambda : Action [captured capturedLambda, captured x] : String | Capture.cs:343:40:343:53 | access to local variable capturedLambda : (...) => ... [captured x] : String | provenance | | +| Capture.cs:343:40:343:53 | access to local variable capturedLambda : Action [captured x] : String | Capture.cs:341:45:341:45 | access to local variable x | provenance | | +| Capture.cs:345:9:345:23 | access to local variable capturingLambda : Action [captured capturedLambda, captured x] : String | Capture.cs:343:40:343:53 | access to local variable capturedLambda : Action [captured x] : String | provenance | | | Capture.cs:350:34:350:34 | a : (...) => ... [captured s] : String | Capture.cs:352:9:352:9 | access to parameter a : (...) => ... [captured s] : String | provenance | | | Capture.cs:350:34:350:34 | a : (...) => ... [captured sink39] : String | Capture.cs:352:9:352:9 | access to parameter a : (...) => ... [captured sink39] : String | provenance | | | Capture.cs:350:34:350:34 | a : (...) => ... [captured sink39] : String | Capture.cs:352:9:352:9 | access to parameter a : (...) => ... [captured sink39] : String | provenance | | @@ -709,7 +709,7 @@ nodes | Capture.cs:339:17:339:30 | "taint source" : String | semmle.label | "taint source" : String | | Capture.cs:341:33:341:46 | (...) => ... : (...) => ... [captured x] : String | semmle.label | (...) => ... : (...) => ... [captured x] : String | | Capture.cs:341:45:341:45 | access to local variable x | semmle.label | access to local variable x | -| Capture.cs:343:40:343:53 | access to local variable capturedLambda : (...) => ... [captured x] : String | semmle.label | access to local variable capturedLambda : (...) => ... [captured x] : String | +| Capture.cs:343:40:343:53 | access to local variable capturedLambda : Action [captured x] : String | semmle.label | access to local variable capturedLambda : Action [captured x] : String | | Capture.cs:345:9:345:23 | access to local variable capturingLambda : Action [captured capturedLambda, captured x] : String | semmle.label | access to local variable capturingLambda : Action [captured capturedLambda, captured x] : String | | Capture.cs:350:34:350:34 | a : (...) => ... [captured s] : String | semmle.label | a : (...) => ... [captured s] : String | | Capture.cs:350:34:350:34 | a : (...) => ... [captured sink39] : String | semmle.label | a : (...) => ... [captured sink39] : String | diff --git a/csharp/ql/test/library-tests/frameworks/format/StringFormatItemParameter.expected b/csharp/ql/test/library-tests/frameworks/format/StringFormatItemParameter.expected index 85e2d82f3ab..978e1340492 100644 --- a/csharp/ql/test/library-tests/frameworks/format/StringFormatItemParameter.expected +++ b/csharp/ql/test/library-tests/frameworks/format/StringFormatItemParameter.expected @@ -1,3 +1,4 @@ +| Console | Write(string, ReadOnlySpan) | arg | | Console | Write(string, object) | arg0 | | Console | Write(string, object, object) | arg0 | | Console | Write(string, object, object) | arg1 | @@ -5,6 +6,7 @@ | Console | Write(string, object, object, object) | arg1 | | Console | Write(string, object, object, object) | arg2 | | Console | Write(string, params Object[]) | arg | +| Console | WriteLine(string, ReadOnlySpan) | arg | | Console | WriteLine(string, object) | arg0 | | Console | WriteLine(string, object, object) | arg0 | | Console | WriteLine(string, object, object) | arg1 | @@ -15,6 +17,7 @@ | Debug | Assert(bool, string, string, params Object[]) | args | | Debug | Print(string, params Object[]) | args | | Debug | WriteLine(string, params Object[]) | args | +| StringBuilder | AppendFormat(IFormatProvider, string, ReadOnlySpan) | args | | StringBuilder | AppendFormat(IFormatProvider, string, object) | arg0 | | StringBuilder | AppendFormat(IFormatProvider, string, object, object) | arg0 | | StringBuilder | AppendFormat(IFormatProvider, string, object, object) | arg1 | @@ -22,6 +25,7 @@ | StringBuilder | AppendFormat(IFormatProvider, string, object, object, object) | arg1 | | StringBuilder | AppendFormat(IFormatProvider, string, object, object, object) | arg2 | | StringBuilder | AppendFormat(IFormatProvider, string, params Object[]) | args | +| StringBuilder | AppendFormat(string, ReadOnlySpan) | args | | StringBuilder | AppendFormat(string, object) | arg0 | | StringBuilder | AppendFormat(string, object, object) | arg0 | | StringBuilder | AppendFormat(string, object, object) | arg1 | @@ -30,6 +34,7 @@ | StringBuilder | AppendFormat(string, object, object, object) | arg2 | | StringBuilder | AppendFormat(string, params Object[]) | args | | Strings | MyStringFormat(string, params Object[]) | args | +| TextWriter | Write(string, ReadOnlySpan) | arg | | TextWriter | Write(string, object) | arg0 | | TextWriter | Write(string, object, object) | arg0 | | TextWriter | Write(string, object, object) | arg1 | @@ -37,6 +42,7 @@ | TextWriter | Write(string, object, object, object) | arg1 | | TextWriter | Write(string, object, object, object) | arg2 | | TextWriter | Write(string, params Object[]) | arg | +| TextWriter | WriteLine(string, ReadOnlySpan) | arg | | TextWriter | WriteLine(string, object) | arg0 | | TextWriter | WriteLine(string, object, object) | arg0 | | TextWriter | WriteLine(string, object, object) | arg1 | @@ -44,6 +50,7 @@ | TextWriter | WriteLine(string, object, object, object) | arg1 | | TextWriter | WriteLine(string, object, object, object) | arg2 | | TextWriter | WriteLine(string, params Object[]) | arg | +| string | Format(IFormatProvider, string, ReadOnlySpan) | args | | string | Format(IFormatProvider, string, object) | arg0 | | string | Format(IFormatProvider, string, object, object) | arg0 | | string | Format(IFormatProvider, string, object, object) | arg1 | @@ -51,6 +58,7 @@ | string | Format(IFormatProvider, string, object, object, object) | arg1 | | string | Format(IFormatProvider, string, object, object, object) | arg2 | | string | Format(IFormatProvider, string, params Object[]) | args | +| string | Format(string, ReadOnlySpan) | args | | string | Format(string, object) | arg0 | | string | Format(string, object, object) | arg0 | | string | Format(string, object, object) | arg1 | diff --git a/csharp/ql/test/library-tests/generics/Generics.ql b/csharp/ql/test/library-tests/generics/Generics.ql index e75f1fdc908..ab1f0af982a 100644 --- a/csharp/ql/test/library-tests/generics/Generics.ql +++ b/csharp/ql/test/library-tests/generics/Generics.ql @@ -223,6 +223,7 @@ query predicate test26(ConstructedGeneric cg, string s) { } query predicate test27(ConstructedType ct, UnboundGenericType ugt, UnboundGenericType sourceDecl) { + ct.fromSource() and ct instanceof NestedType and ugt = ct.getUnboundGeneric() and sourceDecl = ct.getUnboundDeclaration() and diff --git a/csharp/ql/test/library-tests/tuples/tuples.expected b/csharp/ql/test/library-tests/tuples/tuples.expected index c2042bfb14a..cb39eb0ca3b 100644 --- a/csharp/ql/test/library-tests/tuples/tuples.expected +++ b/csharp/ql/test/library-tests/tuples/tuples.expected @@ -8,13 +8,11 @@ members2 | tuple.cs:7:17:7:22 | (Int32,Int32) | ValueTuple | Equals(object, IEqualityComparer) | | tuple.cs:7:17:7:22 | (Int32,Int32) | ValueTuple | GetHashCode() | | tuple.cs:7:17:7:22 | (Int32,Int32) | ValueTuple | GetHashCode(IEqualityComparer) | -| tuple.cs:7:17:7:22 | (Int32,Int32) | ValueTuple | GetHashCodeCore(IEqualityComparer) | | tuple.cs:7:17:7:22 | (Int32,Int32) | ValueTuple | Item1 | | tuple.cs:7:17:7:22 | (Int32,Int32) | ValueTuple | Item2 | | tuple.cs:7:17:7:22 | (Int32,Int32) | ValueTuple | Item[int] | | tuple.cs:7:17:7:22 | (Int32,Int32) | ValueTuple | Length | | tuple.cs:7:17:7:22 | (Int32,Int32) | ValueTuple | ToString() | -| tuple.cs:7:17:7:22 | (Int32,Int32) | ValueTuple | ToStringEnd() | | tuple.cs:7:17:7:22 | (Int32,Int32) | ValueTuple | ValueTuple() | | tuple.cs:7:17:7:22 | (Int32,Int32) | ValueTuple | ValueTuple(int, int) | | tuple.cs:12:17:12:37 | (Int32,Int32,Int32,Int32,Int32,Int32,Int32) | ValueTuple | CompareTo((int, int, int, int, int, int, int)) | @@ -25,7 +23,6 @@ members2 | tuple.cs:12:17:12:37 | (Int32,Int32,Int32,Int32,Int32,Int32,Int32) | ValueTuple | Equals(object, IEqualityComparer) | | tuple.cs:12:17:12:37 | (Int32,Int32,Int32,Int32,Int32,Int32,Int32) | ValueTuple | GetHashCode() | | tuple.cs:12:17:12:37 | (Int32,Int32,Int32,Int32,Int32,Int32,Int32) | ValueTuple | GetHashCode(IEqualityComparer) | -| tuple.cs:12:17:12:37 | (Int32,Int32,Int32,Int32,Int32,Int32,Int32) | ValueTuple | GetHashCodeCore(IEqualityComparer) | | tuple.cs:12:17:12:37 | (Int32,Int32,Int32,Int32,Int32,Int32,Int32) | ValueTuple | Item1 | | tuple.cs:12:17:12:37 | (Int32,Int32,Int32,Int32,Int32,Int32,Int32) | ValueTuple | Item2 | | tuple.cs:12:17:12:37 | (Int32,Int32,Int32,Int32,Int32,Int32,Int32) | ValueTuple | Item3 | @@ -36,7 +33,6 @@ members2 | tuple.cs:12:17:12:37 | (Int32,Int32,Int32,Int32,Int32,Int32,Int32) | ValueTuple | Item[int] | | tuple.cs:12:17:12:37 | (Int32,Int32,Int32,Int32,Int32,Int32,Int32) | ValueTuple | Length | | tuple.cs:12:17:12:37 | (Int32,Int32,Int32,Int32,Int32,Int32,Int32) | ValueTuple | ToString() | -| tuple.cs:12:17:12:37 | (Int32,Int32,Int32,Int32,Int32,Int32,Int32) | ValueTuple | ToStringEnd() | | tuple.cs:12:17:12:37 | (Int32,Int32,Int32,Int32,Int32,Int32,Int32) | ValueTuple | ValueTuple() | | tuple.cs:12:17:12:37 | (Int32,Int32,Int32,Int32,Int32,Int32,Int32) | ValueTuple | ValueTuple(int, int, int, int, int, int, int) | | tuple.cs:15:17:15:40 | (Int32,Int32,Int32,Int32,Int32,Int32,Int32,Int32) | ValueTuple | CompareTo((int, int, int, int, int, int, int, int)) | @@ -47,7 +43,6 @@ members2 | tuple.cs:15:17:15:40 | (Int32,Int32,Int32,Int32,Int32,Int32,Int32,Int32) | ValueTuple | Equals(object, IEqualityComparer) | | tuple.cs:15:17:15:40 | (Int32,Int32,Int32,Int32,Int32,Int32,Int32,Int32) | ValueTuple | GetHashCode() | | tuple.cs:15:17:15:40 | (Int32,Int32,Int32,Int32,Int32,Int32,Int32,Int32) | ValueTuple | GetHashCode(IEqualityComparer) | -| tuple.cs:15:17:15:40 | (Int32,Int32,Int32,Int32,Int32,Int32,Int32,Int32) | ValueTuple | GetHashCodeCore(IEqualityComparer) | | tuple.cs:15:17:15:40 | (Int32,Int32,Int32,Int32,Int32,Int32,Int32,Int32) | ValueTuple | Item1 | | tuple.cs:15:17:15:40 | (Int32,Int32,Int32,Int32,Int32,Int32,Int32,Int32) | ValueTuple | Item2 | | tuple.cs:15:17:15:40 | (Int32,Int32,Int32,Int32,Int32,Int32,Int32,Int32) | ValueTuple | Item3 | @@ -60,7 +55,6 @@ members2 | tuple.cs:15:17:15:40 | (Int32,Int32,Int32,Int32,Int32,Int32,Int32,Int32) | ValueTuple | Length | | tuple.cs:15:17:15:40 | (Int32,Int32,Int32,Int32,Int32,Int32,Int32,Int32) | ValueTuple | Rest | | tuple.cs:15:17:15:40 | (Int32,Int32,Int32,Int32,Int32,Int32,Int32,Int32) | ValueTuple | ToString() | -| tuple.cs:15:17:15:40 | (Int32,Int32,Int32,Int32,Int32,Int32,Int32,Int32) | ValueTuple | ToStringEnd() | | tuple.cs:15:17:15:40 | (Int32,Int32,Int32,Int32,Int32,Int32,Int32,Int32) | ValueTuple | ValueTuple() | | tuple.cs:15:17:15:40 | (Int32,Int32,Int32,Int32,Int32,Int32,Int32,Int32) | ValueTuple | ValueTuple(int, int, int, int, int, int, int, (int)) | | tuple.cs:18:17:18:47 | (Int32,Int32,Int32,Int32,Int32,Int32,Int32,Int32,Int32,Int32) | ValueTuple | CompareTo((int, int, int, int, int, int, int, int, int, int)) | @@ -71,7 +65,6 @@ members2 | tuple.cs:18:17:18:47 | (Int32,Int32,Int32,Int32,Int32,Int32,Int32,Int32,Int32,Int32) | ValueTuple | Equals(object, IEqualityComparer) | | tuple.cs:18:17:18:47 | (Int32,Int32,Int32,Int32,Int32,Int32,Int32,Int32,Int32,Int32) | ValueTuple | GetHashCode() | | tuple.cs:18:17:18:47 | (Int32,Int32,Int32,Int32,Int32,Int32,Int32,Int32,Int32,Int32) | ValueTuple | GetHashCode(IEqualityComparer) | -| tuple.cs:18:17:18:47 | (Int32,Int32,Int32,Int32,Int32,Int32,Int32,Int32,Int32,Int32) | ValueTuple | GetHashCodeCore(IEqualityComparer) | | tuple.cs:18:17:18:47 | (Int32,Int32,Int32,Int32,Int32,Int32,Int32,Int32,Int32,Int32) | ValueTuple | Item1 | | tuple.cs:18:17:18:47 | (Int32,Int32,Int32,Int32,Int32,Int32,Int32,Int32,Int32,Int32) | ValueTuple | Item2 | | tuple.cs:18:17:18:47 | (Int32,Int32,Int32,Int32,Int32,Int32,Int32,Int32,Int32,Int32) | ValueTuple | Item3 | @@ -86,6 +79,5 @@ members2 | tuple.cs:18:17:18:47 | (Int32,Int32,Int32,Int32,Int32,Int32,Int32,Int32,Int32,Int32) | ValueTuple | Length | | tuple.cs:18:17:18:47 | (Int32,Int32,Int32,Int32,Int32,Int32,Int32,Int32,Int32,Int32) | ValueTuple | Rest | | tuple.cs:18:17:18:47 | (Int32,Int32,Int32,Int32,Int32,Int32,Int32,Int32,Int32,Int32) | ValueTuple | ToString() | -| tuple.cs:18:17:18:47 | (Int32,Int32,Int32,Int32,Int32,Int32,Int32,Int32,Int32,Int32) | ValueTuple | ToStringEnd() | | tuple.cs:18:17:18:47 | (Int32,Int32,Int32,Int32,Int32,Int32,Int32,Int32,Int32,Int32) | ValueTuple | ValueTuple() | | tuple.cs:18:17:18:47 | (Int32,Int32,Int32,Int32,Int32,Int32,Int32,Int32,Int32,Int32) | ValueTuple | ValueTuple(int, int, int, int, int, int, int, (int, int, int)) | diff --git a/csharp/ql/test/utils/modeleditor/ApplicationModeEndpoints.expected b/csharp/ql/test/utils/modeleditor/ApplicationModeEndpoints.expected index 6e0758ca809..7dcf3b4f877 100644 --- a/csharp/ql/test/utils/modeleditor/ApplicationModeEndpoints.expected +++ b/csharp/ql/test/utils/modeleditor/ApplicationModeEndpoints.expected @@ -1,12 +1,12 @@ -| NonPublicClass.cs:9:9:9:31 | call to method WriteLine | System | Console | WriteLine | (System.String) | true | System.Console | 8.0.0.0 | neutral | source | -| PublicClass.cs:9:9:9:30 | call to method WriteLine | System | Console | WriteLine | (System.String) | true | System.Console | 8.0.0.0 | neutral | source | -| PublicClass.cs:14:9:14:30 | call to method WriteLine | System | Console | WriteLine | (System.String) | true | System.Console | 8.0.0.0 | neutral | source | -| PublicClass.cs:19:9:19:51 | call to method WriteLine | System | Console | WriteLine | (System.String) | true | System.Console | 8.0.0.0 | neutral | source | -| PublicClass.cs:19:33:19:50 | call to method ReadLine | System | Console | ReadLine | () | true | System.Console | 8.0.0.0 | neutral | source | -| PublicClass.cs:19:33:19:50 | call to method ReadLine | System | Console | ReadLine | () | true | System.Console | 8.0.0.0 | source | source | -| PublicClass.cs:24:9:24:46 | call to method Write | System | Console | Write | (System.Object) | true | System.Console | 8.0.0.0 | neutral | source | -| PublicClass.cs:30:9:30:30 | call to method WriteLine | System | Console | WriteLine | (System.String) | true | System.Console | 8.0.0.0 | neutral | source | -| PublicGenericClass.cs:9:9:9:30 | call to method WriteLine | System | Console | WriteLine | (System.Object) | true | System.Console | 8.0.0.0 | neutral | source | -| PublicGenericClass.cs:14:9:14:30 | call to method WriteLine | System | Console | WriteLine | (System.Object) | true | System.Console | 8.0.0.0 | neutral | source | -| PublicGenericInterface.cs:13:9:13:30 | call to method WriteLine | System | Console | WriteLine | (System.String) | true | System.Console | 8.0.0.0 | neutral | source | -| PublicInterface.cs:13:9:13:30 | call to method WriteLine | System | Console | WriteLine | (System.String) | true | System.Console | 8.0.0.0 | neutral | source | +| NonPublicClass.cs:9:9:9:31 | call to method WriteLine | System | Console | WriteLine | (System.String) | true | System.Console | 9.0.0.0 | neutral | source | +| PublicClass.cs:9:9:9:30 | call to method WriteLine | System | Console | WriteLine | (System.String) | true | System.Console | 9.0.0.0 | neutral | source | +| PublicClass.cs:14:9:14:30 | call to method WriteLine | System | Console | WriteLine | (System.String) | true | System.Console | 9.0.0.0 | neutral | source | +| PublicClass.cs:19:9:19:51 | call to method WriteLine | System | Console | WriteLine | (System.String) | true | System.Console | 9.0.0.0 | neutral | source | +| PublicClass.cs:19:33:19:50 | call to method ReadLine | System | Console | ReadLine | () | true | System.Console | 9.0.0.0 | neutral | source | +| PublicClass.cs:19:33:19:50 | call to method ReadLine | System | Console | ReadLine | () | true | System.Console | 9.0.0.0 | source | source | +| PublicClass.cs:24:9:24:46 | call to method Write | System | Console | Write | (System.Object) | true | System.Console | 9.0.0.0 | neutral | source | +| PublicClass.cs:30:9:30:30 | call to method WriteLine | System | Console | WriteLine | (System.String) | true | System.Console | 9.0.0.0 | neutral | source | +| PublicGenericClass.cs:9:9:9:30 | call to method WriteLine | System | Console | WriteLine | (System.Object) | true | System.Console | 9.0.0.0 | neutral | source | +| PublicGenericClass.cs:14:9:14:30 | call to method WriteLine | System | Console | WriteLine | (System.Object) | true | System.Console | 9.0.0.0 | neutral | source | +| PublicGenericInterface.cs:13:9:13:30 | call to method WriteLine | System | Console | WriteLine | (System.String) | true | System.Console | 9.0.0.0 | neutral | source | +| PublicInterface.cs:13:9:13:30 | call to method WriteLine | System | Console | WriteLine | (System.String) | true | System.Console | 9.0.0.0 | neutral | source | diff --git a/go/actions/test/action.yml b/go/actions/test/action.yml index 5228f440971..0a4f13fa0ef 100644 --- a/go/actions/test/action.yml +++ b/go/actions/test/action.yml @@ -59,7 +59,7 @@ runs: - name: Upload qhelp markdown if: inputs.run-code-checks == 'true' && !cancelled() - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 with: name: qhelp-markdown path: go/qhelp-out/**/*.md diff --git a/go/extractor/go.mod b/go/extractor/go.mod index c5e1ecf09ff..af822b77eb9 100644 --- a/go/extractor/go.mod +++ b/go/extractor/go.mod @@ -10,7 +10,7 @@ toolchain go1.23.1 // bazel mod tidy require ( golang.org/x/mod v0.22.0 - golang.org/x/tools v0.27.0 + golang.org/x/tools v0.28.0 ) -require golang.org/x/sync v0.9.0 // indirect +require golang.org/x/sync v0.10.0 // indirect diff --git a/go/extractor/go.sum b/go/extractor/go.sum index a10e428fcbc..e3144c2c5f5 100644 --- a/go/extractor/go.sum +++ b/go/extractor/go.sum @@ -1,6 +1,8 @@ +github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= +github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= golang.org/x/mod v0.22.0 h1:D4nJWe9zXqHOmWqj4VMOJhvzj7bEZg4wEYa759z1pH4= golang.org/x/mod v0.22.0/go.mod h1:6SkKJ3Xj0I0BrPOZoBy3bdMptDDU9oJrpohJ3eWZ1fY= -golang.org/x/sync v0.9.0 h1:fEo0HyrW1GIgZdpbhCRO0PkJajUS5H9IFUztCgEo2jQ= -golang.org/x/sync v0.9.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= -golang.org/x/tools v0.27.0 h1:qEKojBykQkQ4EynWy4S8Weg69NumxKdn40Fce3uc/8o= -golang.org/x/tools v0.27.0/go.mod h1:sUi0ZgbwW9ZPAq26Ekut+weQPR5eIM6GQLQ1Yjm1H0Q= +golang.org/x/sync v0.10.0 h1:3NQrjDixjgGwUOCaF8w2+VYHv0Ve/vGYSbdkTa98gmQ= +golang.org/x/sync v0.10.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/tools v0.28.0 h1:WuB6qZ4RPCQo5aP3WdKZS7i595EdWqWR8vqJTlwTVK8= +golang.org/x/tools v0.28.0/go.mod h1:dcIOrVd3mfQKTgrDVQHqCPMWy6lnhfhtX3hLXYVLfRw= diff --git a/go/ql/consistency-queries/CHANGELOG.md b/go/ql/consistency-queries/CHANGELOG.md index 1c514d078a2..3c6fa155a32 100644 --- a/go/ql/consistency-queries/CHANGELOG.md +++ b/go/ql/consistency-queries/CHANGELOG.md @@ -1,3 +1,11 @@ +## 1.0.13 + +No user-facing changes. + +## 1.0.12 + +No user-facing changes. + ## 1.0.11 No user-facing changes. diff --git a/go/ql/consistency-queries/change-notes/released/1.0.12.md b/go/ql/consistency-queries/change-notes/released/1.0.12.md new file mode 100644 index 00000000000..12b3cf3e18f --- /dev/null +++ b/go/ql/consistency-queries/change-notes/released/1.0.12.md @@ -0,0 +1,3 @@ +## 1.0.12 + +No user-facing changes. diff --git a/go/ql/consistency-queries/change-notes/released/1.0.13.md b/go/ql/consistency-queries/change-notes/released/1.0.13.md new file mode 100644 index 00000000000..378f97eeb1b --- /dev/null +++ b/go/ql/consistency-queries/change-notes/released/1.0.13.md @@ -0,0 +1,3 @@ +## 1.0.13 + +No user-facing changes. diff --git a/go/ql/consistency-queries/codeql-pack.release.yml b/go/ql/consistency-queries/codeql-pack.release.yml index 56a2fb38872..c3be7eb7716 100644 --- a/go/ql/consistency-queries/codeql-pack.release.yml +++ b/go/ql/consistency-queries/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.0.11 +lastReleaseVersion: 1.0.13 diff --git a/go/ql/consistency-queries/qlpack.yml b/go/ql/consistency-queries/qlpack.yml index b7c67080f46..1812705438c 100644 --- a/go/ql/consistency-queries/qlpack.yml +++ b/go/ql/consistency-queries/qlpack.yml @@ -1,5 +1,5 @@ name: codeql-go-consistency-queries -version: 1.0.12-dev +version: 1.0.14-dev groups: - go - queries diff --git a/go/ql/lib/CHANGELOG.md b/go/ql/lib/CHANGELOG.md index 37f83fa8dda..83052b3a1d9 100644 --- a/go/ql/lib/CHANGELOG.md +++ b/go/ql/lib/CHANGELOG.md @@ -1,3 +1,28 @@ +## 3.0.0 + +### Breaking Changes + +* Deleted the old deprecated data flow API that was based on extending a configuration class. See https://github.blog/changelog/2023-08-14-new-dataflow-api-for-writing-custom-codeql-queries for instructions on migrating your queries to use the new API. + +### Minor Analysis Improvements + +* A call to a method whose name starts with "Debug", "Error", "Fatal", "Info", "Log", "Output", "Panic", "Print", "Trace", "Warn" or "With" defined on an interface whose name ends in "logger" or "Logger" is now considered a LoggerCall. In particular, it is a sink for `go/clear-text-logging` and `go/log-injection`. This may lead to some more alerts in those queries. + +### Bug Fixes + +* Fixed a bug which meant that promoted fields and methods were missing when the embedded parent was not promoted due to a name clash. + +## 2.1.3 + +### Minor Analysis Improvements + +* The `subtypes` column has been set to true in all models-as-data models except some tests. This means that existing models will apply in some cases where they didn't before, which may lead to more alerts. + +### Bug Fixes + +* The behaviour of the `subtypes` column in models-as-data now matches other languages more closely. +* Fixed a bug which meant that some qualified names for promoted methods were not being recognised in some very specific circumstances. + ## 2.1.2 ### Minor Analysis Improvements diff --git a/go/ql/lib/change-notes/2024-11-07-fix-missing-qualified-names-for-methods.md b/go/ql/lib/change-notes/2024-11-07-fix-missing-qualified-names-for-methods.md deleted file mode 100644 index cd2dbb6c974..00000000000 --- a/go/ql/lib/change-notes/2024-11-07-fix-missing-qualified-names-for-methods.md +++ /dev/null @@ -1,4 +0,0 @@ ---- -category: fix ---- -* Fixed a bug which meant that some qualified names for promoted methods were not being recognised in some very specific circumstances. diff --git a/go/ql/lib/change-notes/2024-11-11-models-as-data-subtypes-column.md b/go/ql/lib/change-notes/2024-11-11-models-as-data-subtypes-column.md deleted file mode 100644 index 25115f74d71..00000000000 --- a/go/ql/lib/change-notes/2024-11-11-models-as-data-subtypes-column.md +++ /dev/null @@ -1,4 +0,0 @@ ---- -category: fix ---- -* The behaviour of the `subtypes` column in models-as-data now matches other languages more closely. diff --git a/go/ql/lib/change-notes/2024-11-12-models-as-data-subtypes-true.md b/go/ql/lib/change-notes/2024-11-12-models-as-data-subtypes-true.md deleted file mode 100644 index b1c78815ea3..00000000000 --- a/go/ql/lib/change-notes/2024-11-12-models-as-data-subtypes-true.md +++ /dev/null @@ -1,4 +0,0 @@ ---- -category: minorAnalysis ---- -* The `subtypes` column has been set to true in all models-as-data models except some tests. This means that existing models will apply in some cases where they didn't before, which may lead to more alerts. diff --git a/go/ql/lib/change-notes/2024-11-20-heuristic-logging-sinks.md b/go/ql/lib/change-notes/2024-11-20-heuristic-logging-sinks.md deleted file mode 100644 index 46f5988b379..00000000000 --- a/go/ql/lib/change-notes/2024-11-20-heuristic-logging-sinks.md +++ /dev/null @@ -1,4 +0,0 @@ ---- -category: minorAnalysis ---- -* A call to a method whose name starts with "Debug", "Error", "Fatal", "Info", "Log", "Output", "Panic", "Print", "Trace", "Warn" or "With" defined on an interface whose name ends in "logger" or "Logger" is now considered a LoggerCall. In particular, it is a sink for `go/clear-text-logging` and `go/log-injection`. This may lead to some more alerts in those queries. diff --git a/go/ql/lib/change-notes/released/2.1.3.md b/go/ql/lib/change-notes/released/2.1.3.md new file mode 100644 index 00000000000..3ae1f19fb36 --- /dev/null +++ b/go/ql/lib/change-notes/released/2.1.3.md @@ -0,0 +1,10 @@ +## 2.1.3 + +### Minor Analysis Improvements + +* The `subtypes` column has been set to true in all models-as-data models except some tests. This means that existing models will apply in some cases where they didn't before, which may lead to more alerts. + +### Bug Fixes + +* The behaviour of the `subtypes` column in models-as-data now matches other languages more closely. +* Fixed a bug which meant that some qualified names for promoted methods were not being recognised in some very specific circumstances. diff --git a/go/ql/lib/change-notes/released/3.0.0.md b/go/ql/lib/change-notes/released/3.0.0.md new file mode 100644 index 00000000000..5aafa0c29d1 --- /dev/null +++ b/go/ql/lib/change-notes/released/3.0.0.md @@ -0,0 +1,13 @@ +## 3.0.0 + +### Breaking Changes + +* Deleted the old deprecated data flow API that was based on extending a configuration class. See https://github.blog/changelog/2023-08-14-new-dataflow-api-for-writing-custom-codeql-queries for instructions on migrating your queries to use the new API. + +### Minor Analysis Improvements + +* A call to a method whose name starts with "Debug", "Error", "Fatal", "Info", "Log", "Output", "Panic", "Print", "Trace", "Warn" or "With" defined on an interface whose name ends in "logger" or "Logger" is now considered a LoggerCall. In particular, it is a sink for `go/clear-text-logging` and `go/log-injection`. This may lead to some more alerts in those queries. + +### Bug Fixes + +* Fixed a bug which meant that promoted fields and methods were missing when the embedded parent was not promoted due to a name clash. diff --git a/go/ql/lib/codeql-pack.release.yml b/go/ql/lib/codeql-pack.release.yml index 1a4e53e8772..33d3a2cd113 100644 --- a/go/ql/lib/codeql-pack.release.yml +++ b/go/ql/lib/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 2.1.2 +lastReleaseVersion: 3.0.0 diff --git a/go/ql/lib/go.qll b/go/ql/lib/go.qll index fb59790dcc5..8d3955e4dad 100644 --- a/go/ql/lib/go.qll +++ b/go/ql/lib/go.qll @@ -25,11 +25,9 @@ import semmle.go.controlflow.BasicBlocks import semmle.go.controlflow.ControlFlowGraph import semmle.go.controlflow.IR import semmle.go.dataflow.DataFlow -import semmle.go.dataflow.DataFlow2 import semmle.go.dataflow.GlobalValueNumbering import semmle.go.dataflow.SSA import semmle.go.dataflow.TaintTracking -import semmle.go.dataflow.TaintTracking2 import semmle.go.frameworks.Afero import semmle.go.frameworks.AwsLambda import semmle.go.frameworks.Beego diff --git a/go/ql/lib/qlpack.yml b/go/ql/lib/qlpack.yml index f9660516373..4e72aa3857b 100644 --- a/go/ql/lib/qlpack.yml +++ b/go/ql/lib/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/go-all -version: 2.1.3-dev +version: 3.0.1-dev groups: go dbscheme: go.dbscheme extractor: go diff --git a/go/ql/lib/semmle/go/Types.qll b/go/ql/lib/semmle/go/Types.qll index 1b09ea466cc..1f1234aa1de 100644 --- a/go/ql/lib/semmle/go/Types.qll +++ b/go/ql/lib/semmle/go/Types.qll @@ -496,14 +496,15 @@ class StructType extends @structtype, CompositeType { Field getFieldOfEmbedded(Field embeddedParent, string name, int depth, boolean isEmbedded) { // embeddedParent is a field of 'this' at depth 'depth - 1' this.hasFieldCand(_, embeddedParent, depth - 1, true) and - // embeddedParent's type has the result field - exists(StructType embeddedType, Type fieldType | - fieldType = embeddedParent.getType().getUnderlyingType() and - pragma[only_bind_into](embeddedType) = - [fieldType, fieldType.(PointerType).getBaseType().getUnderlyingType()] - | - result = embeddedType.getOwnField(name, isEmbedded) - ) + // embeddedParent's type has the result field. Note that it is invalid Go + // to have an embedded field with a named type whose underlying type is a + // pointer, so we don't have to have + // `lookThroughPointerType(embeddedParent.getType().getUnderlyingType())`. + result = + lookThroughPointerType(embeddedParent.getType()) + .getUnderlyingType() + .(StructType) + .getOwnField(name, isEmbedded) } /** @@ -523,8 +524,12 @@ class StructType extends @structtype, CompositeType { private predicate hasFieldCand(string name, Field f, int depth, boolean isEmbedded) { f = this.getOwnField(name, isEmbedded) and depth = 0 or - not this.hasOwnField(_, name, _, _) and - f = this.getFieldOfEmbedded(_, name, depth, isEmbedded) + f = this.getFieldOfEmbedded(_, name, depth, isEmbedded) and + // If this is a cyclic field and this is not the first time we see this embedded field + // then don't include it as a field candidate to avoid non-termination. + not exists(Type t | lookThroughPointerType(t) = lookThroughPointerType(f.getType()) | + this.hasOwnField(_, name, t, _) + ) } private predicate hasMethodCand(string name, Method m, int depth) { @@ -541,15 +546,7 @@ class StructType extends @structtype, CompositeType { predicate hasField(string name, Type tp) { exists(int mindepth | mindepth = min(int depth | this.hasFieldCand(name, _, depth, _)) and - tp = unique(Field f | f = this.getFieldCand(name, mindepth, _)).getType() - ) - } - - private Field getFieldCand(string name, int depth, boolean isEmbedded) { - result = this.getOwnField(name, isEmbedded) and depth = 0 - or - exists(Type embedded | this.hasEmbeddedField(embedded, depth - 1) | - result = embedded.getUnderlyingType().(StructType).getOwnField(name, isEmbedded) + tp = unique(Field f | this.hasFieldCand(name, f, mindepth, _)).getType() ) } @@ -564,9 +561,9 @@ class StructType extends @structtype, CompositeType { * The depth of a field `f` declared in this type is zero. */ Field getFieldAtDepth(string name, int depth) { - depth = min(int depthCand | exists(this.getFieldCand(name, depthCand, _))) and - result = this.getFieldCand(name, depth, _) and - strictcount(this.getFieldCand(name, depth, _)) = 1 + depth = min(int depthCand | this.hasFieldCand(name, _, depthCand, _)) and + this.hasFieldCand(name, result, depth, _) and + strictcount(Field f | this.hasFieldCand(name, f, depth, _)) = 1 } Method getMethodAtDepth(string name, int depth) { diff --git a/go/ql/lib/semmle/go/dataflow/DataFlow.qll b/go/ql/lib/semmle/go/dataflow/DataFlow.qll index 9363bc93abd..c26adbfd2c2 100644 --- a/go/ql/lib/semmle/go/dataflow/DataFlow.qll +++ b/go/ql/lib/semmle/go/dataflow/DataFlow.qll @@ -25,7 +25,7 @@ module DataFlow { private import semmle.go.dataflow.internal.DataFlowImplSpecific private import codeql.dataflow.DataFlow import DataFlowMake - import semmle.go.dataflow.internal.DataFlowImpl1 + import Public import Properties } diff --git a/go/ql/lib/semmle/go/dataflow/DataFlow2.qll b/go/ql/lib/semmle/go/dataflow/DataFlow2.qll deleted file mode 100644 index a2bae8bd939..00000000000 --- a/go/ql/lib/semmle/go/dataflow/DataFlow2.qll +++ /dev/null @@ -1,27 +0,0 @@ -/** - * Provides a library for local (intra-procedural) and global (inter-procedural) - * data flow analysis: deciding whether data can flow from a _source_ to a - * _sink_. - * - * Unless configured otherwise, _flow_ means that the exact value of - * the source may reach the sink. We do not track flow across pointer - * dereferences or array indexing. To track these types of flow, where the - * exact value may not be preserved, import - * `semmle.code.go.dataflow.TaintTracking`. - * - * To use global (interprocedural) data flow, extend the class - * `DataFlow::Configuration` as documented on that class. To use local - * (intraprocedural) data flow, invoke `DataFlow::localFlow` or - * `DataFlow::LocalFlowStep` with arguments of type `DataFlow::Node`. - */ - -import go - -/** - * Provides a library for local (intra-procedural) and global (inter-procedural) - * data flow analysis. - */ -module DataFlow2 { - import semmle.go.dataflow.internal.DataFlowImpl2 - import Properties -} diff --git a/go/ql/lib/semmle/go/dataflow/TaintTracking.qll b/go/ql/lib/semmle/go/dataflow/TaintTracking.qll index d762e925ab5..c469574b3b9 100644 --- a/go/ql/lib/semmle/go/dataflow/TaintTracking.qll +++ b/go/ql/lib/semmle/go/dataflow/TaintTracking.qll @@ -10,11 +10,10 @@ import semmle.go.dataflow.DataFlow * global (inter-procedural) taint-tracking analyses. */ module TaintTracking { - import semmle.go.dataflow.internal.tainttracking1.TaintTrackingParameter::Public + import semmle.go.dataflow.internal.TaintTrackingUtil private import semmle.go.dataflow.internal.DataFlowImplSpecific private import semmle.go.dataflow.internal.TaintTrackingImplSpecific private import semmle.go.Locations private import codeql.dataflow.TaintTracking import TaintFlowMake - import semmle.go.dataflow.internal.tainttracking1.TaintTrackingImpl } diff --git a/go/ql/lib/semmle/go/dataflow/TaintTracking2.qll b/go/ql/lib/semmle/go/dataflow/TaintTracking2.qll deleted file mode 100644 index 6b1b2487e5b..00000000000 --- a/go/ql/lib/semmle/go/dataflow/TaintTracking2.qll +++ /dev/null @@ -1,12 +0,0 @@ -/** - * Provides classes for performing local (intra-procedural) and - * global (inter-procedural) taint-tracking analyses. - */ - -/** - * Provides classes for performing local (intra-procedural) and - * global (inter-procedural) taint-tracking analyses. - */ -module TaintTracking2 { - import semmle.go.dataflow.internal.tainttracking2.TaintTrackingImpl -} diff --git a/go/ql/lib/semmle/go/dataflow/internal/DataFlowImpl1.qll b/go/ql/lib/semmle/go/dataflow/internal/DataFlowImpl1.qll deleted file mode 100644 index 17def0c431d..00000000000 --- a/go/ql/lib/semmle/go/dataflow/internal/DataFlowImpl1.qll +++ /dev/null @@ -1,361 +0,0 @@ -/** - * DEPRECATED: Use `Global` and `GlobalWithState` instead. - * - * Provides a `Configuration` class backwards-compatible interface to the data - * flow library. - */ - -private import DataFlowImplCommon -private import DataFlowImplSpecific::Private -import DataFlowImplSpecific::Public -private import DataFlowImpl -import DataFlowImplCommonPublic -deprecated import FlowStateString -private import codeql.util.Unit - -/** - * DEPRECATED: Use `Global` and `GlobalWithState` instead. - * - * A configuration of interprocedural data flow analysis. This defines - * sources, sinks, and any other configurable aspect of the analysis. Each - * use of the global data flow library must define its own unique extension - * of this abstract class. To create a configuration, extend this class with - * a subclass whose characteristic predicate is a unique singleton string. - * For example, write - * - * ```ql - * class MyAnalysisConfiguration extends DataFlow::Configuration { - * MyAnalysisConfiguration() { this = "MyAnalysisConfiguration" } - * // Override `isSource` and `isSink`. - * // Optionally override `isBarrier`. - * // Optionally override `isAdditionalFlowStep`. - * } - * ``` - * Conceptually, this defines a graph where the nodes are `DataFlow::Node`s and - * the edges are those data-flow steps that preserve the value of the node - * along with any additional edges defined by `isAdditionalFlowStep`. - * Specifying nodes in `isBarrier` will remove those nodes from the graph, and - * specifying nodes in `isBarrierIn` and/or `isBarrierOut` will remove in-going - * and/or out-going edges from those nodes, respectively. - * - * Then, to query whether there is flow between some `source` and `sink`, - * write - * - * ```ql - * exists(MyAnalysisConfiguration cfg | cfg.hasFlow(source, sink)) - * ``` - * - * Multiple configurations can coexist, but two classes extending - * `DataFlow::Configuration` should never depend on each other. One of them - * should instead depend on a `DataFlow2::Configuration`, a - * `DataFlow3::Configuration`, or a `DataFlow4::Configuration`. - */ -abstract deprecated class Configuration extends string { - bindingset[this] - Configuration() { any() } - - /** - * Holds if `source` is a relevant data flow source. - */ - predicate isSource(Node source) { none() } - - /** - * Holds if `source` is a relevant data flow source with the given initial - * `state`. - */ - predicate isSource(Node source, FlowState state) { none() } - - /** - * Holds if `sink` is a relevant data flow sink. - */ - predicate isSink(Node sink) { none() } - - /** - * Holds if `sink` is a relevant data flow sink accepting `state`. - */ - predicate isSink(Node sink, FlowState state) { none() } - - /** - * Holds if data flow through `node` is prohibited. This completely removes - * `node` from the data flow graph. - */ - predicate isBarrier(Node node) { none() } - - /** - * Holds if data flow through `node` is prohibited when the flow state is - * `state`. - */ - predicate isBarrier(Node node, FlowState state) { none() } - - /** Holds if data flow into `node` is prohibited. */ - predicate isBarrierIn(Node node) { none() } - - /** Holds if data flow out of `node` is prohibited. */ - predicate isBarrierOut(Node node) { none() } - - /** - * Holds if data may flow from `node1` to `node2` in addition to the normal data-flow steps. - */ - predicate isAdditionalFlowStep(Node node1, Node node2) { none() } - - /** - * Holds if data may flow from `node1` to `node2` in addition to the normal data-flow steps. - * This step is only applicable in `state1` and updates the flow state to `state2`. - */ - predicate isAdditionalFlowStep(Node node1, FlowState state1, Node node2, FlowState state2) { - none() - } - - /** - * Holds if an arbitrary number of implicit read steps of content `c` may be - * taken at `node`. - */ - predicate allowImplicitRead(Node node, ContentSet c) { none() } - - /** - * Gets the virtual dispatch branching limit when calculating field flow. - * This can be overridden to a smaller value to improve performance (a - * value of 0 disables field flow), or a larger value to get more results. - */ - int fieldFlowBranchLimit() { result = 2 } - - /** - * Gets a data flow configuration feature to add restrictions to the set of - * valid flow paths. - * - * - `FeatureHasSourceCallContext`: - * Assume that sources have some existing call context to disallow - * conflicting return-flow directly following the source. - * - `FeatureHasSinkCallContext`: - * Assume that sinks have some existing call context to disallow - * conflicting argument-to-parameter flow directly preceding the sink. - * - `FeatureEqualSourceSinkCallContext`: - * Implies both of the above and additionally ensures that the entire flow - * path preserves the call context. - * - * These features are generally not relevant for typical end-to-end data flow - * queries, but should only be used for constructing paths that need to - * somehow be pluggable in another path context. - */ - FlowFeature getAFeature() { none() } - - /** Holds if sources should be grouped in the result of `hasFlowPath`. */ - predicate sourceGrouping(Node source, string sourceGroup) { none() } - - /** Holds if sinks should be grouped in the result of `hasFlowPath`. */ - predicate sinkGrouping(Node sink, string sinkGroup) { none() } - - /** - * Holds if data may flow from `source` to `sink` for this configuration. - */ - predicate hasFlow(Node source, Node sink) { hasFlow(source, sink, this) } - - /** - * Holds if data may flow from `source` to `sink` for this configuration. - * - * The corresponding paths are generated from the end-points and the graph - * included in the module `PathGraph`. - */ - predicate hasFlowPath(PathNode source, PathNode sink) { hasFlowPath(source, sink, this) } - - /** - * Holds if data may flow from some source to `sink` for this configuration. - */ - predicate hasFlowTo(Node sink) { hasFlowTo(sink, this) } - - /** - * Holds if data may flow from some source to `sink` for this configuration. - */ - predicate hasFlowToExpr(DataFlowExpr sink) { this.hasFlowTo(exprNode(sink)) } - - /** - * Holds if hidden nodes should be included in the data flow graph. - * - * This feature should only be used for debugging or when the data flow graph - * is not visualized (for example in a `path-problem` query). - */ - predicate includeHiddenNodes() { none() } -} - -/** - * This class exists to prevent mutual recursion between the user-overridden - * member predicates of `Configuration` and the rest of the data-flow library. - * Good performance cannot be guaranteed in the presence of such recursion, so - * it should be replaced by using more than one copy of the data flow library. - */ -abstract deprecated private class ConfigurationRecursionPrevention extends Configuration { - bindingset[this] - ConfigurationRecursionPrevention() { any() } - - override predicate hasFlow(Node source, Node sink) { - strictcount(Node n | this.isSource(n)) < 0 - or - strictcount(Node n | this.isSource(n, _)) < 0 - or - strictcount(Node n | this.isSink(n)) < 0 - or - strictcount(Node n | this.isSink(n, _)) < 0 - or - strictcount(Node n1, Node n2 | this.isAdditionalFlowStep(n1, n2)) < 0 - or - strictcount(Node n1, Node n2 | this.isAdditionalFlowStep(n1, _, n2, _)) < 0 - or - super.hasFlow(source, sink) - } -} - -deprecated private FlowState relevantState(Configuration config) { - config.isSource(_, result) or - config.isSink(_, result) or - config.isBarrier(_, result) or - config.isAdditionalFlowStep(_, result, _, _) or - config.isAdditionalFlowStep(_, _, _, result) -} - -private newtype TConfigState = - deprecated TMkConfigState(Configuration config, FlowState state) { - state = relevantState(config) or state instanceof FlowStateEmpty - } - -deprecated private Configuration getConfig(TConfigState state) { state = TMkConfigState(result, _) } - -deprecated private FlowState getState(TConfigState state) { state = TMkConfigState(_, result) } - -deprecated private predicate singleConfiguration() { 1 = strictcount(Configuration c) } - -deprecated private module Config implements FullStateConfigSig { - class FlowState = TConfigState; - - predicate isSource(Node source, FlowState state) { - getConfig(state).isSource(source, getState(state)) - or - getConfig(state).isSource(source) and getState(state) instanceof FlowStateEmpty - } - - predicate isSink(Node sink) { none() } - - predicate isSink(Node sink, FlowState state) { - getConfig(state).isSink(sink, getState(state)) - or - getConfig(state).isSink(sink) and getState(state) instanceof FlowStateEmpty - } - - predicate isBarrier(Node node) { none() } - - predicate isBarrier(Node node, FlowState state) { - getConfig(state).isBarrier(node, getState(state)) or - getConfig(state).isBarrier(node) - } - - predicate isBarrierIn(Node node) { any(Configuration config).isBarrierIn(node) } - - predicate isBarrierOut(Node node) { any(Configuration config).isBarrierOut(node) } - - predicate isBarrierIn(Node node, FlowState state) { none() } - - predicate isBarrierOut(Node node, FlowState state) { none() } - - predicate isAdditionalFlowStep(Node node1, Node node2, string model) { - singleConfiguration() and - any(Configuration config).isAdditionalFlowStep(node1, node2) and - model = "" - } - - predicate isAdditionalFlowStep( - Node node1, FlowState state1, Node node2, FlowState state2, string model - ) { - getConfig(state1).isAdditionalFlowStep(node1, getState(state1), node2, getState(state2)) and - getConfig(state2) = getConfig(state1) and - model = "" - or - not singleConfiguration() and - getConfig(state1).isAdditionalFlowStep(node1, node2) and - state2 = state1 and - model = "" - } - - predicate allowImplicitRead(Node node, ContentSet c) { - any(Configuration config).allowImplicitRead(node, c) - } - - predicate neverSkip(Node node) { none() } - - int fieldFlowBranchLimit() { result = min(any(Configuration config).fieldFlowBranchLimit()) } - - int accessPathLimit() { result = 5 } - - FlowFeature getAFeature() { result = any(Configuration config).getAFeature() } - - predicate includeHiddenNodes() { any(Configuration config).includeHiddenNodes() } - - predicate observeDiffInformedIncrementalMode() { none() } -} - -deprecated private import Impl as I - -/** - * A `Node` augmented with a call context (except for sinks), an access path, and a configuration. - * Only those `PathNode`s that are reachable from a source, and which can reach a sink, are generated. - */ -deprecated class PathNode instanceof I::PathNode { - /** Gets a textual representation of this element. */ - final string toString() { result = super.toString() } - - /** - * Gets a textual representation of this element, including a textual - * representation of the call context. - */ - final string toStringWithContext() { result = super.toStringWithContext() } - - /** - * Holds if this element is at the specified location. - * The location spans column `startcolumn` of line `startline` to - * column `endcolumn` of line `endline` in file `filepath`. - * For more information, see - * [Locations](https://codeql.github.com/docs/writing-codeql-queries/providing-locations-in-codeql-queries/). - */ - final predicate hasLocationInfo( - string filepath, int startline, int startcolumn, int endline, int endcolumn - ) { - super.hasLocationInfo(filepath, startline, startcolumn, endline, endcolumn) - } - - /** Gets the underlying `Node`. */ - final Node getNode() { result = super.getNode() } - - /** Gets the `FlowState` of this node. */ - deprecated final FlowState getState() { result = getState(super.getState()) } - - /** Gets the associated configuration. */ - deprecated final Configuration getConfiguration() { result = getConfig(super.getState()) } - - /** Gets a successor of this node, if any. */ - final PathNode getASuccessor() { result = super.getASuccessor() } - - /** Holds if this node is a source. */ - final predicate isSource() { super.isSource() } - - /** Holds if this node is a grouping of source nodes. */ - final predicate isSourceGroup(string group) { super.isSourceGroup(group) } - - /** Holds if this node is a grouping of sink nodes. */ - final predicate isSinkGroup(string group) { super.isSinkGroup(group) } -} - -deprecated module PathGraph = I::PathGraph; - -deprecated private predicate hasFlow(Node source, Node sink, Configuration config) { - exists(PathNode source0, PathNode sink0 | - hasFlowPath(source0, sink0, config) and - source0.getNode() = source and - sink0.getNode() = sink - ) -} - -deprecated private predicate hasFlowPath(PathNode source, PathNode sink, Configuration config) { - I::flowPath(source, sink) and source.getConfiguration() = config -} - -deprecated private predicate hasFlowTo(Node sink, Configuration config) { hasFlow(_, sink, config) } - -deprecated predicate flowsTo = hasFlow/3; diff --git a/go/ql/lib/semmle/go/dataflow/internal/DataFlowImpl2.qll b/go/ql/lib/semmle/go/dataflow/internal/DataFlowImpl2.qll deleted file mode 100644 index 17def0c431d..00000000000 --- a/go/ql/lib/semmle/go/dataflow/internal/DataFlowImpl2.qll +++ /dev/null @@ -1,361 +0,0 @@ -/** - * DEPRECATED: Use `Global` and `GlobalWithState` instead. - * - * Provides a `Configuration` class backwards-compatible interface to the data - * flow library. - */ - -private import DataFlowImplCommon -private import DataFlowImplSpecific::Private -import DataFlowImplSpecific::Public -private import DataFlowImpl -import DataFlowImplCommonPublic -deprecated import FlowStateString -private import codeql.util.Unit - -/** - * DEPRECATED: Use `Global` and `GlobalWithState` instead. - * - * A configuration of interprocedural data flow analysis. This defines - * sources, sinks, and any other configurable aspect of the analysis. Each - * use of the global data flow library must define its own unique extension - * of this abstract class. To create a configuration, extend this class with - * a subclass whose characteristic predicate is a unique singleton string. - * For example, write - * - * ```ql - * class MyAnalysisConfiguration extends DataFlow::Configuration { - * MyAnalysisConfiguration() { this = "MyAnalysisConfiguration" } - * // Override `isSource` and `isSink`. - * // Optionally override `isBarrier`. - * // Optionally override `isAdditionalFlowStep`. - * } - * ``` - * Conceptually, this defines a graph where the nodes are `DataFlow::Node`s and - * the edges are those data-flow steps that preserve the value of the node - * along with any additional edges defined by `isAdditionalFlowStep`. - * Specifying nodes in `isBarrier` will remove those nodes from the graph, and - * specifying nodes in `isBarrierIn` and/or `isBarrierOut` will remove in-going - * and/or out-going edges from those nodes, respectively. - * - * Then, to query whether there is flow between some `source` and `sink`, - * write - * - * ```ql - * exists(MyAnalysisConfiguration cfg | cfg.hasFlow(source, sink)) - * ``` - * - * Multiple configurations can coexist, but two classes extending - * `DataFlow::Configuration` should never depend on each other. One of them - * should instead depend on a `DataFlow2::Configuration`, a - * `DataFlow3::Configuration`, or a `DataFlow4::Configuration`. - */ -abstract deprecated class Configuration extends string { - bindingset[this] - Configuration() { any() } - - /** - * Holds if `source` is a relevant data flow source. - */ - predicate isSource(Node source) { none() } - - /** - * Holds if `source` is a relevant data flow source with the given initial - * `state`. - */ - predicate isSource(Node source, FlowState state) { none() } - - /** - * Holds if `sink` is a relevant data flow sink. - */ - predicate isSink(Node sink) { none() } - - /** - * Holds if `sink` is a relevant data flow sink accepting `state`. - */ - predicate isSink(Node sink, FlowState state) { none() } - - /** - * Holds if data flow through `node` is prohibited. This completely removes - * `node` from the data flow graph. - */ - predicate isBarrier(Node node) { none() } - - /** - * Holds if data flow through `node` is prohibited when the flow state is - * `state`. - */ - predicate isBarrier(Node node, FlowState state) { none() } - - /** Holds if data flow into `node` is prohibited. */ - predicate isBarrierIn(Node node) { none() } - - /** Holds if data flow out of `node` is prohibited. */ - predicate isBarrierOut(Node node) { none() } - - /** - * Holds if data may flow from `node1` to `node2` in addition to the normal data-flow steps. - */ - predicate isAdditionalFlowStep(Node node1, Node node2) { none() } - - /** - * Holds if data may flow from `node1` to `node2` in addition to the normal data-flow steps. - * This step is only applicable in `state1` and updates the flow state to `state2`. - */ - predicate isAdditionalFlowStep(Node node1, FlowState state1, Node node2, FlowState state2) { - none() - } - - /** - * Holds if an arbitrary number of implicit read steps of content `c` may be - * taken at `node`. - */ - predicate allowImplicitRead(Node node, ContentSet c) { none() } - - /** - * Gets the virtual dispatch branching limit when calculating field flow. - * This can be overridden to a smaller value to improve performance (a - * value of 0 disables field flow), or a larger value to get more results. - */ - int fieldFlowBranchLimit() { result = 2 } - - /** - * Gets a data flow configuration feature to add restrictions to the set of - * valid flow paths. - * - * - `FeatureHasSourceCallContext`: - * Assume that sources have some existing call context to disallow - * conflicting return-flow directly following the source. - * - `FeatureHasSinkCallContext`: - * Assume that sinks have some existing call context to disallow - * conflicting argument-to-parameter flow directly preceding the sink. - * - `FeatureEqualSourceSinkCallContext`: - * Implies both of the above and additionally ensures that the entire flow - * path preserves the call context. - * - * These features are generally not relevant for typical end-to-end data flow - * queries, but should only be used for constructing paths that need to - * somehow be pluggable in another path context. - */ - FlowFeature getAFeature() { none() } - - /** Holds if sources should be grouped in the result of `hasFlowPath`. */ - predicate sourceGrouping(Node source, string sourceGroup) { none() } - - /** Holds if sinks should be grouped in the result of `hasFlowPath`. */ - predicate sinkGrouping(Node sink, string sinkGroup) { none() } - - /** - * Holds if data may flow from `source` to `sink` for this configuration. - */ - predicate hasFlow(Node source, Node sink) { hasFlow(source, sink, this) } - - /** - * Holds if data may flow from `source` to `sink` for this configuration. - * - * The corresponding paths are generated from the end-points and the graph - * included in the module `PathGraph`. - */ - predicate hasFlowPath(PathNode source, PathNode sink) { hasFlowPath(source, sink, this) } - - /** - * Holds if data may flow from some source to `sink` for this configuration. - */ - predicate hasFlowTo(Node sink) { hasFlowTo(sink, this) } - - /** - * Holds if data may flow from some source to `sink` for this configuration. - */ - predicate hasFlowToExpr(DataFlowExpr sink) { this.hasFlowTo(exprNode(sink)) } - - /** - * Holds if hidden nodes should be included in the data flow graph. - * - * This feature should only be used for debugging or when the data flow graph - * is not visualized (for example in a `path-problem` query). - */ - predicate includeHiddenNodes() { none() } -} - -/** - * This class exists to prevent mutual recursion between the user-overridden - * member predicates of `Configuration` and the rest of the data-flow library. - * Good performance cannot be guaranteed in the presence of such recursion, so - * it should be replaced by using more than one copy of the data flow library. - */ -abstract deprecated private class ConfigurationRecursionPrevention extends Configuration { - bindingset[this] - ConfigurationRecursionPrevention() { any() } - - override predicate hasFlow(Node source, Node sink) { - strictcount(Node n | this.isSource(n)) < 0 - or - strictcount(Node n | this.isSource(n, _)) < 0 - or - strictcount(Node n | this.isSink(n)) < 0 - or - strictcount(Node n | this.isSink(n, _)) < 0 - or - strictcount(Node n1, Node n2 | this.isAdditionalFlowStep(n1, n2)) < 0 - or - strictcount(Node n1, Node n2 | this.isAdditionalFlowStep(n1, _, n2, _)) < 0 - or - super.hasFlow(source, sink) - } -} - -deprecated private FlowState relevantState(Configuration config) { - config.isSource(_, result) or - config.isSink(_, result) or - config.isBarrier(_, result) or - config.isAdditionalFlowStep(_, result, _, _) or - config.isAdditionalFlowStep(_, _, _, result) -} - -private newtype TConfigState = - deprecated TMkConfigState(Configuration config, FlowState state) { - state = relevantState(config) or state instanceof FlowStateEmpty - } - -deprecated private Configuration getConfig(TConfigState state) { state = TMkConfigState(result, _) } - -deprecated private FlowState getState(TConfigState state) { state = TMkConfigState(_, result) } - -deprecated private predicate singleConfiguration() { 1 = strictcount(Configuration c) } - -deprecated private module Config implements FullStateConfigSig { - class FlowState = TConfigState; - - predicate isSource(Node source, FlowState state) { - getConfig(state).isSource(source, getState(state)) - or - getConfig(state).isSource(source) and getState(state) instanceof FlowStateEmpty - } - - predicate isSink(Node sink) { none() } - - predicate isSink(Node sink, FlowState state) { - getConfig(state).isSink(sink, getState(state)) - or - getConfig(state).isSink(sink) and getState(state) instanceof FlowStateEmpty - } - - predicate isBarrier(Node node) { none() } - - predicate isBarrier(Node node, FlowState state) { - getConfig(state).isBarrier(node, getState(state)) or - getConfig(state).isBarrier(node) - } - - predicate isBarrierIn(Node node) { any(Configuration config).isBarrierIn(node) } - - predicate isBarrierOut(Node node) { any(Configuration config).isBarrierOut(node) } - - predicate isBarrierIn(Node node, FlowState state) { none() } - - predicate isBarrierOut(Node node, FlowState state) { none() } - - predicate isAdditionalFlowStep(Node node1, Node node2, string model) { - singleConfiguration() and - any(Configuration config).isAdditionalFlowStep(node1, node2) and - model = "" - } - - predicate isAdditionalFlowStep( - Node node1, FlowState state1, Node node2, FlowState state2, string model - ) { - getConfig(state1).isAdditionalFlowStep(node1, getState(state1), node2, getState(state2)) and - getConfig(state2) = getConfig(state1) and - model = "" - or - not singleConfiguration() and - getConfig(state1).isAdditionalFlowStep(node1, node2) and - state2 = state1 and - model = "" - } - - predicate allowImplicitRead(Node node, ContentSet c) { - any(Configuration config).allowImplicitRead(node, c) - } - - predicate neverSkip(Node node) { none() } - - int fieldFlowBranchLimit() { result = min(any(Configuration config).fieldFlowBranchLimit()) } - - int accessPathLimit() { result = 5 } - - FlowFeature getAFeature() { result = any(Configuration config).getAFeature() } - - predicate includeHiddenNodes() { any(Configuration config).includeHiddenNodes() } - - predicate observeDiffInformedIncrementalMode() { none() } -} - -deprecated private import Impl as I - -/** - * A `Node` augmented with a call context (except for sinks), an access path, and a configuration. - * Only those `PathNode`s that are reachable from a source, and which can reach a sink, are generated. - */ -deprecated class PathNode instanceof I::PathNode { - /** Gets a textual representation of this element. */ - final string toString() { result = super.toString() } - - /** - * Gets a textual representation of this element, including a textual - * representation of the call context. - */ - final string toStringWithContext() { result = super.toStringWithContext() } - - /** - * Holds if this element is at the specified location. - * The location spans column `startcolumn` of line `startline` to - * column `endcolumn` of line `endline` in file `filepath`. - * For more information, see - * [Locations](https://codeql.github.com/docs/writing-codeql-queries/providing-locations-in-codeql-queries/). - */ - final predicate hasLocationInfo( - string filepath, int startline, int startcolumn, int endline, int endcolumn - ) { - super.hasLocationInfo(filepath, startline, startcolumn, endline, endcolumn) - } - - /** Gets the underlying `Node`. */ - final Node getNode() { result = super.getNode() } - - /** Gets the `FlowState` of this node. */ - deprecated final FlowState getState() { result = getState(super.getState()) } - - /** Gets the associated configuration. */ - deprecated final Configuration getConfiguration() { result = getConfig(super.getState()) } - - /** Gets a successor of this node, if any. */ - final PathNode getASuccessor() { result = super.getASuccessor() } - - /** Holds if this node is a source. */ - final predicate isSource() { super.isSource() } - - /** Holds if this node is a grouping of source nodes. */ - final predicate isSourceGroup(string group) { super.isSourceGroup(group) } - - /** Holds if this node is a grouping of sink nodes. */ - final predicate isSinkGroup(string group) { super.isSinkGroup(group) } -} - -deprecated module PathGraph = I::PathGraph; - -deprecated private predicate hasFlow(Node source, Node sink, Configuration config) { - exists(PathNode source0, PathNode sink0 | - hasFlowPath(source0, sink0, config) and - source0.getNode() = source and - sink0.getNode() = sink - ) -} - -deprecated private predicate hasFlowPath(PathNode source, PathNode sink, Configuration config) { - I::flowPath(source, sink) and source.getConfiguration() = config -} - -deprecated private predicate hasFlowTo(Node sink, Configuration config) { hasFlow(_, sink, config) } - -deprecated predicate flowsTo = hasFlow/3; diff --git a/go/ql/lib/semmle/go/dataflow/internal/tainttracking1/TaintTrackingImpl.qll b/go/ql/lib/semmle/go/dataflow/internal/tainttracking1/TaintTrackingImpl.qll deleted file mode 100644 index 75e7856fd26..00000000000 --- a/go/ql/lib/semmle/go/dataflow/internal/tainttracking1/TaintTrackingImpl.qll +++ /dev/null @@ -1,168 +0,0 @@ -/** - * DEPRECATED: Use `Global` and `GlobalWithState` instead. - * - * Provides an implementation of global (interprocedural) taint tracking. - * This file re-exports the local (intraprocedural) taint-tracking analysis - * from `TaintTrackingParameter::Public` and adds a global analysis, mainly - * exposed through the `Configuration` class. For some languages, this file - * exists in several identical copies, allowing queries to use multiple - * `Configuration` classes that depend on each other without introducing - * mutual recursion among those configurations. - */ - -import TaintTrackingParameter::Public -private import TaintTrackingParameter::Private - -/** - * DEPRECATED: Use `Global` and `GlobalWithState` instead. - * - * A configuration of interprocedural taint tracking analysis. This defines - * sources, sinks, and any other configurable aspect of the analysis. Each - * use of the taint tracking library must define its own unique extension of - * this abstract class. - * - * A taint-tracking configuration is a special data flow configuration - * (`DataFlow::Configuration`) that allows for flow through nodes that do not - * necessarily preserve values but are still relevant from a taint tracking - * perspective. (For example, string concatenation, where one of the operands - * is tainted.) - * - * To create a configuration, extend this class with a subclass whose - * characteristic predicate is a unique singleton string. For example, write - * - * ```ql - * class MyAnalysisConfiguration extends TaintTracking::Configuration { - * MyAnalysisConfiguration() { this = "MyAnalysisConfiguration" } - * // Override `isSource` and `isSink`. - * // Optionally override `isSanitizer`. - * // Optionally override `isSanitizerIn`. - * // Optionally override `isSanitizerOut`. - * // Optionally override `isSanitizerGuard`. - * // Optionally override `isAdditionalTaintStep`. - * } - * ``` - * - * Then, to query whether there is flow between some `source` and `sink`, - * write - * - * ```ql - * exists(MyAnalysisConfiguration cfg | cfg.hasFlow(source, sink)) - * ``` - * - * Multiple configurations can coexist, but it is unsupported to depend on - * another `TaintTracking::Configuration` or a `DataFlow::Configuration` in the - * overridden predicates that define sources, sinks, or additional steps. - * Instead, the dependency should go to a `TaintTracking2::Configuration` or a - * `DataFlow2::Configuration`, `DataFlow3::Configuration`, etc. - */ -abstract deprecated class Configuration extends DataFlow::Configuration { - bindingset[this] - Configuration() { any() } - - /** - * Holds if `source` is a relevant taint source. - * - * The smaller this predicate is, the faster `hasFlow()` will converge. - */ - // overridden to provide taint-tracking specific qldoc - override predicate isSource(DataFlow::Node source) { none() } - - /** - * Holds if `source` is a relevant taint source with the given initial - * `state`. - * - * The smaller this predicate is, the faster `hasFlow()` will converge. - */ - // overridden to provide taint-tracking specific qldoc - override predicate isSource(DataFlow::Node source, DataFlow::FlowState state) { none() } - - /** - * Holds if `sink` is a relevant taint sink - * - * The smaller this predicate is, the faster `hasFlow()` will converge. - */ - // overridden to provide taint-tracking specific qldoc - override predicate isSink(DataFlow::Node sink) { none() } - - /** - * Holds if `sink` is a relevant taint sink accepting `state`. - * - * The smaller this predicate is, the faster `hasFlow()` will converge. - */ - // overridden to provide taint-tracking specific qldoc - override predicate isSink(DataFlow::Node sink, DataFlow::FlowState state) { none() } - - /** Holds if the node `node` is a taint sanitizer. */ - predicate isSanitizer(DataFlow::Node node) { none() } - - final override predicate isBarrier(DataFlow::Node node) { - this.isSanitizer(node) or - defaultTaintSanitizer(node) - } - - /** - * Holds if the node `node` is a taint sanitizer when the flow state is - * `state`. - */ - predicate isSanitizer(DataFlow::Node node, DataFlow::FlowState state) { none() } - - final override predicate isBarrier(DataFlow::Node node, DataFlow::FlowState state) { - this.isSanitizer(node, state) - } - - /** Holds if taint propagation into `node` is prohibited. */ - predicate isSanitizerIn(DataFlow::Node node) { none() } - - final override predicate isBarrierIn(DataFlow::Node node) { this.isSanitizerIn(node) } - - /** Holds if taint propagation out of `node` is prohibited. */ - predicate isSanitizerOut(DataFlow::Node node) { none() } - - final override predicate isBarrierOut(DataFlow::Node node) { this.isSanitizerOut(node) } - - /** - * Holds if taint may propagate from `node1` to `node2` in addition to the normal data-flow and taint steps. - */ - predicate isAdditionalTaintStep(DataFlow::Node node1, DataFlow::Node node2) { none() } - - final override predicate isAdditionalFlowStep(DataFlow::Node node1, DataFlow::Node node2) { - this.isAdditionalTaintStep(node1, node2) or - defaultAdditionalTaintStep(node1, node2, _) - } - - /** - * Holds if taint may propagate from `node1` to `node2` in addition to the normal data-flow and taint steps. - * This step is only applicable in `state1` and updates the flow state to `state2`. - */ - predicate isAdditionalTaintStep( - DataFlow::Node node1, DataFlow::FlowState state1, DataFlow::Node node2, - DataFlow::FlowState state2 - ) { - none() - } - - final override predicate isAdditionalFlowStep( - DataFlow::Node node1, DataFlow::FlowState state1, DataFlow::Node node2, - DataFlow::FlowState state2 - ) { - this.isAdditionalTaintStep(node1, state1, node2, state2) - } - - override predicate allowImplicitRead(DataFlow::Node node, DataFlow::ContentSet c) { - ( - this.isSink(node) or - this.isSink(node, _) or - this.isAdditionalTaintStep(node, _) or - this.isAdditionalTaintStep(node, _, _, _) - ) and - defaultImplicitTaintRead(node, c) - } - - /** - * Holds if taint may flow from `source` to `sink` for this configuration. - */ - // overridden to provide taint-tracking specific qldoc - override predicate hasFlow(DataFlow::Node source, DataFlow::Node sink) { - super.hasFlow(source, sink) - } -} diff --git a/go/ql/lib/semmle/go/dataflow/internal/tainttracking1/TaintTrackingParameter.qll b/go/ql/lib/semmle/go/dataflow/internal/tainttracking1/TaintTrackingParameter.qll deleted file mode 100644 index a5a45514a06..00000000000 --- a/go/ql/lib/semmle/go/dataflow/internal/tainttracking1/TaintTrackingParameter.qll +++ /dev/null @@ -1,6 +0,0 @@ -import semmle.go.dataflow.internal.TaintTrackingUtil as Public - -module Private { - import semmle.go.dataflow.DataFlow::DataFlow as DataFlow - import semmle.go.dataflow.internal.DataFlowImpl as DataFlowInternal -} diff --git a/go/ql/lib/semmle/go/dataflow/internal/tainttracking2/TaintTrackingImpl.qll b/go/ql/lib/semmle/go/dataflow/internal/tainttracking2/TaintTrackingImpl.qll deleted file mode 100644 index 75e7856fd26..00000000000 --- a/go/ql/lib/semmle/go/dataflow/internal/tainttracking2/TaintTrackingImpl.qll +++ /dev/null @@ -1,168 +0,0 @@ -/** - * DEPRECATED: Use `Global` and `GlobalWithState` instead. - * - * Provides an implementation of global (interprocedural) taint tracking. - * This file re-exports the local (intraprocedural) taint-tracking analysis - * from `TaintTrackingParameter::Public` and adds a global analysis, mainly - * exposed through the `Configuration` class. For some languages, this file - * exists in several identical copies, allowing queries to use multiple - * `Configuration` classes that depend on each other without introducing - * mutual recursion among those configurations. - */ - -import TaintTrackingParameter::Public -private import TaintTrackingParameter::Private - -/** - * DEPRECATED: Use `Global` and `GlobalWithState` instead. - * - * A configuration of interprocedural taint tracking analysis. This defines - * sources, sinks, and any other configurable aspect of the analysis. Each - * use of the taint tracking library must define its own unique extension of - * this abstract class. - * - * A taint-tracking configuration is a special data flow configuration - * (`DataFlow::Configuration`) that allows for flow through nodes that do not - * necessarily preserve values but are still relevant from a taint tracking - * perspective. (For example, string concatenation, where one of the operands - * is tainted.) - * - * To create a configuration, extend this class with a subclass whose - * characteristic predicate is a unique singleton string. For example, write - * - * ```ql - * class MyAnalysisConfiguration extends TaintTracking::Configuration { - * MyAnalysisConfiguration() { this = "MyAnalysisConfiguration" } - * // Override `isSource` and `isSink`. - * // Optionally override `isSanitizer`. - * // Optionally override `isSanitizerIn`. - * // Optionally override `isSanitizerOut`. - * // Optionally override `isSanitizerGuard`. - * // Optionally override `isAdditionalTaintStep`. - * } - * ``` - * - * Then, to query whether there is flow between some `source` and `sink`, - * write - * - * ```ql - * exists(MyAnalysisConfiguration cfg | cfg.hasFlow(source, sink)) - * ``` - * - * Multiple configurations can coexist, but it is unsupported to depend on - * another `TaintTracking::Configuration` or a `DataFlow::Configuration` in the - * overridden predicates that define sources, sinks, or additional steps. - * Instead, the dependency should go to a `TaintTracking2::Configuration` or a - * `DataFlow2::Configuration`, `DataFlow3::Configuration`, etc. - */ -abstract deprecated class Configuration extends DataFlow::Configuration { - bindingset[this] - Configuration() { any() } - - /** - * Holds if `source` is a relevant taint source. - * - * The smaller this predicate is, the faster `hasFlow()` will converge. - */ - // overridden to provide taint-tracking specific qldoc - override predicate isSource(DataFlow::Node source) { none() } - - /** - * Holds if `source` is a relevant taint source with the given initial - * `state`. - * - * The smaller this predicate is, the faster `hasFlow()` will converge. - */ - // overridden to provide taint-tracking specific qldoc - override predicate isSource(DataFlow::Node source, DataFlow::FlowState state) { none() } - - /** - * Holds if `sink` is a relevant taint sink - * - * The smaller this predicate is, the faster `hasFlow()` will converge. - */ - // overridden to provide taint-tracking specific qldoc - override predicate isSink(DataFlow::Node sink) { none() } - - /** - * Holds if `sink` is a relevant taint sink accepting `state`. - * - * The smaller this predicate is, the faster `hasFlow()` will converge. - */ - // overridden to provide taint-tracking specific qldoc - override predicate isSink(DataFlow::Node sink, DataFlow::FlowState state) { none() } - - /** Holds if the node `node` is a taint sanitizer. */ - predicate isSanitizer(DataFlow::Node node) { none() } - - final override predicate isBarrier(DataFlow::Node node) { - this.isSanitizer(node) or - defaultTaintSanitizer(node) - } - - /** - * Holds if the node `node` is a taint sanitizer when the flow state is - * `state`. - */ - predicate isSanitizer(DataFlow::Node node, DataFlow::FlowState state) { none() } - - final override predicate isBarrier(DataFlow::Node node, DataFlow::FlowState state) { - this.isSanitizer(node, state) - } - - /** Holds if taint propagation into `node` is prohibited. */ - predicate isSanitizerIn(DataFlow::Node node) { none() } - - final override predicate isBarrierIn(DataFlow::Node node) { this.isSanitizerIn(node) } - - /** Holds if taint propagation out of `node` is prohibited. */ - predicate isSanitizerOut(DataFlow::Node node) { none() } - - final override predicate isBarrierOut(DataFlow::Node node) { this.isSanitizerOut(node) } - - /** - * Holds if taint may propagate from `node1` to `node2` in addition to the normal data-flow and taint steps. - */ - predicate isAdditionalTaintStep(DataFlow::Node node1, DataFlow::Node node2) { none() } - - final override predicate isAdditionalFlowStep(DataFlow::Node node1, DataFlow::Node node2) { - this.isAdditionalTaintStep(node1, node2) or - defaultAdditionalTaintStep(node1, node2, _) - } - - /** - * Holds if taint may propagate from `node1` to `node2` in addition to the normal data-flow and taint steps. - * This step is only applicable in `state1` and updates the flow state to `state2`. - */ - predicate isAdditionalTaintStep( - DataFlow::Node node1, DataFlow::FlowState state1, DataFlow::Node node2, - DataFlow::FlowState state2 - ) { - none() - } - - final override predicate isAdditionalFlowStep( - DataFlow::Node node1, DataFlow::FlowState state1, DataFlow::Node node2, - DataFlow::FlowState state2 - ) { - this.isAdditionalTaintStep(node1, state1, node2, state2) - } - - override predicate allowImplicitRead(DataFlow::Node node, DataFlow::ContentSet c) { - ( - this.isSink(node) or - this.isSink(node, _) or - this.isAdditionalTaintStep(node, _) or - this.isAdditionalTaintStep(node, _, _, _) - ) and - defaultImplicitTaintRead(node, c) - } - - /** - * Holds if taint may flow from `source` to `sink` for this configuration. - */ - // overridden to provide taint-tracking specific qldoc - override predicate hasFlow(DataFlow::Node source, DataFlow::Node sink) { - super.hasFlow(source, sink) - } -} diff --git a/go/ql/lib/semmle/go/dataflow/internal/tainttracking2/TaintTrackingParameter.qll b/go/ql/lib/semmle/go/dataflow/internal/tainttracking2/TaintTrackingParameter.qll deleted file mode 100644 index 1130c2e42e1..00000000000 --- a/go/ql/lib/semmle/go/dataflow/internal/tainttracking2/TaintTrackingParameter.qll +++ /dev/null @@ -1,5 +0,0 @@ -import semmle.go.dataflow.internal.TaintTrackingUtil as Public - -module Private { - import semmle.go.dataflow.DataFlow2::DataFlow2 as DataFlow -} diff --git a/go/ql/lib/semmle/go/security/CleartextLogging.qll b/go/ql/lib/semmle/go/security/CleartextLogging.qll index 7c29f0ba130..2e0c9665c4b 100644 --- a/go/ql/lib/semmle/go/security/CleartextLogging.qll +++ b/go/ql/lib/semmle/go/security/CleartextLogging.qll @@ -16,49 +16,6 @@ import go module CleartextLogging { import CleartextLoggingCustomizations::CleartextLogging - /** - * DEPRECATED: Use `Flow` instead. - * - * A data-flow tracking configuration for clear-text logging of sensitive information. - * - * This configuration identifies flows from `Source`s, which are sources of - * sensitive data, to `Sink`s, which is an abstract class representing all - * the places sensitive data may be stored in cleartext. Additional sources or sinks can be - * added either by extending the relevant class, or by subclassing this configuration itself, - * and amending the sources and sinks. - */ - deprecated class Configuration extends DataFlow::Configuration { - Configuration() { this = "CleartextLogging" } - - override predicate isSource(DataFlow::Node source) { source instanceof Source } - - override predicate isSink(DataFlow::Node sink) { sink instanceof Sink } - - override predicate isBarrier(DataFlow::Node node) { - node instanceof Barrier - or - exists(DataFlow::CallNode call | node = call.getResult() | - call.getTarget() = Builtin::error().getType().getMethod("Error") - or - call.getTarget().(Method).hasQualifiedName("fmt", "Stringer", "String") - ) - } - - override predicate isAdditionalFlowStep(DataFlow::Node src, DataFlow::Node trg) { - // A taint propagating data-flow edge through structs: a tainted write taints the entire struct. - exists(Write write | - write.writesField(trg.(DataFlow::PostUpdateNode).getPreUpdateNode(), _, src) - ) - or - // taint steps that do not include flow through fields. Field reads would produce FPs due to - // the additional taint step above that taints whole structs from individual field writes. - TaintTracking::localTaintStep(src, trg) and - not TaintTracking::fieldReadStep(src, trg) and - // Also exclude protobuf field fetches, since they amount to single field reads. - not any(Protobuf::GetMethod gm).taintStep(src, trg) - } - } - private module Config implements DataFlow::ConfigSig { predicate isSource(DataFlow::Node source) { source instanceof Source } diff --git a/go/ql/lib/semmle/go/security/IncorrectIntegerConversionLib.qll b/go/ql/lib/semmle/go/security/IncorrectIntegerConversionLib.qll index 68d874768ce..3c6cddc427f 100644 --- a/go/ql/lib/semmle/go/security/IncorrectIntegerConversionLib.qll +++ b/go/ql/lib/semmle/go/security/IncorrectIntegerConversionLib.qll @@ -53,132 +53,6 @@ int getIntTypeBitSize(File file, int architectureSpecificBitSize) { result = architectureSpecificBitSize } -/** - * Holds if converting from an integer types with size `sourceBitSize` to - * one with size `sinkBitSize` can produce unexpected values, where 0 means - * architecture-dependent. - * - * Architecture-dependent bit sizes can be 32 or 64. To catch flows that - * only manifest on 64-bit architectures we consider an - * architecture-dependent source bit size to be 64. To catch flows that - * only happen on 32-bit architectures we consider an - * architecture-dependent sink bit size to be 32. We exclude the case where - * both source and sink have architecture-dependent bit sizes. - */ -private predicate isIncorrectIntegerConversion(int sourceBitSize, int sinkBitSize) { - sourceBitSize in [16, 32, 64] and - sinkBitSize in [8, 16, 32] and - sourceBitSize > sinkBitSize - or - // Treat `sourceBitSize = 0` like `sourceBitSize = 64`, and exclude `sinkBitSize = 0` - sourceBitSize = 0 and - sinkBitSize in [8, 16, 32] - or - // Treat `sinkBitSize = 0` like `sinkBitSize = 32`, and exclude `sourceBitSize = 0` - sourceBitSize = 64 and - sinkBitSize = 0 -} - -/** - * DEPRECATED: use `Flow` instead. - * - * A taint-tracking configuration for reasoning about when an integer - * obtained from parsing a string flows to a type conversion to a smaller - * integer types, which could cause unexpected values. - */ -deprecated class ConversionWithoutBoundsCheckConfig extends TaintTracking::Configuration { - boolean sinkIsSigned; - int sourceBitSize; - int sinkBitSize; - - ConversionWithoutBoundsCheckConfig() { - sinkIsSigned in [true, false] and - isIncorrectIntegerConversion(sourceBitSize, sinkBitSize) and - this = "ConversionWithoutBoundsCheckConfig" + sourceBitSize + sinkIsSigned + sinkBitSize - } - - /** Gets the bit size of the source. */ - int getSourceBitSize() { result = sourceBitSize } - - override predicate isSource(DataFlow::Node source) { - exists( - DataFlow::CallNode c, IntegerParser::Range ip, int apparentBitSize, int effectiveBitSize - | - c.getTarget() = ip and source = c.getResult(0) - | - ( - apparentBitSize = ip.getTargetBitSize() - or - // If we are reading a variable, check if it is - // `strconv.IntSize`, and use 0 if it is. - exists(DataFlow::Node rawBitSize | rawBitSize = ip.getTargetBitSizeInput().getNode(c) | - if rawBitSize = any(Strconv::IntSize intSize).getARead() - then apparentBitSize = 0 - else apparentBitSize = rawBitSize.getIntValue() - ) - ) and - ( - if apparentBitSize = 0 - then effectiveBitSize = getIntTypeBitSize(source.getFile(), 0) - else effectiveBitSize = apparentBitSize - ) and - // `effectiveBitSize` could be any value between 0 and 64, but we - // can round it up to the nearest size of an integer type without - // changing behavior. - sourceBitSize = min(int b | b in [0, 8, 16, 32, 64] and b >= effectiveBitSize) - ) - } - - /** - * Holds if `sink` is a typecast to an integer type with size `bitSize` (where - * 0 represents architecture-dependent) and the expression being typecast is - * not also in a right-shift expression. We allow this case because it is - * a common pattern to serialise `byte(v)`, `byte(v >> 8)`, and so on. - */ - predicate isSinkWithBitSize(DataFlow::TypeCastNode sink, int bitSize) { - sink.asExpr() instanceof ConversionExpr and - exists(IntegerType integerType | sink.getResultType().getUnderlyingType() = integerType | - ( - bitSize = integerType.getSize() - or - not exists(integerType.getSize()) and - bitSize = getIntTypeBitSize(sink.getFile(), 0) - ) and - if integerType instanceof SignedIntegerType then sinkIsSigned = true else sinkIsSigned = false - ) and - not exists(ShrExpr shrExpr | - shrExpr.getLeftOperand().getGlobalValueNumber() = - sink.getOperand().asExpr().getGlobalValueNumber() or - shrExpr.getLeftOperand().(AndExpr).getAnOperand().getGlobalValueNumber() = - sink.getOperand().asExpr().getGlobalValueNumber() - ) - } - - override predicate isSink(DataFlow::Node sink) { - // We use the argument of the type conversion as the configuration sink so that we - // can sanitize the result of the conversion to prevent flow on to further sinks - // without needing to use `isSanitizerOut`, which doesn't work with flow states - // (and therefore the legacy `TaintTracking::Configuration` class). - this.isSinkWithBitSize(sink.getASuccessor(), sinkBitSize) - } - - override predicate isSanitizer(DataFlow::Node node) { - // To catch flows that only happen on 32-bit architectures we - // consider an architecture-dependent sink bit size to be 32. - exists(UpperBoundCheckGuard g, int bitSize | - if sinkBitSize != 0 then bitSize = sinkBitSize else bitSize = 32 - | - node = DataFlow::BarrierGuard::getABarrierNodeForGuard(g) and - if sinkIsSigned = true then g.isBoundFor(bitSize, 32) else g.isBoundFor(bitSize - 1, 32) - ) - or - exists(int bitSize | - isIncorrectIntegerConversion(sourceBitSize, bitSize) and - this.isSinkWithBitSize(node, bitSize) - ) - } -} - private int validBitSize() { result = [7, 8, 15, 16, 31, 32, 63, 64] } private newtype TArchitectureBitSize = diff --git a/go/ql/lib/semmle/go/security/InsecureRandomness.qll b/go/ql/lib/semmle/go/security/InsecureRandomness.qll index 675f0b4b9a2..83746f7b96e 100644 --- a/go/ql/lib/semmle/go/security/InsecureRandomness.qll +++ b/go/ql/lib/semmle/go/security/InsecureRandomness.qll @@ -16,25 +16,6 @@ import go module InsecureRandomness { import InsecureRandomnessCustomizations::InsecureRandomness - /** - * DEPRECATED: Use `Flow` instead. - * - * A taint-tracking configuration for reasoning about random values that are - * not cryptographically secure. - */ - deprecated class Configuration extends TaintTracking::Configuration { - Configuration() { this = "InsecureRandomness" } - - override predicate isSource(DataFlow::Node source) { source instanceof Source } - - override predicate isSink(DataFlow::Node sink) { this.isSinkWithKind(sink, _) } - - /** Holds if `sink` is a sink for this configuration with kind `kind`. */ - predicate isSinkWithKind(Sink sink, string kind) { kind = sink.getKind() } - - override predicate isSanitizer(DataFlow::Node node) { node instanceof Sanitizer } - } - /** Holds if `sink` is a sink for this configuration with kind `kind`. */ predicate isSinkWithKind(Sink sink, string kind) { kind = sink.getKind() } diff --git a/go/ql/lib/semmle/go/security/OpenUrlRedirect.qll b/go/ql/lib/semmle/go/security/OpenUrlRedirect.qll index d3576f005b9..bfe47f260cd 100644 --- a/go/ql/lib/semmle/go/security/OpenUrlRedirect.qll +++ b/go/ql/lib/semmle/go/security/OpenUrlRedirect.qll @@ -17,51 +17,6 @@ import UrlConcatenation module OpenUrlRedirect { import OpenUrlRedirectCustomizations::OpenUrlRedirect - /** - * DEPRECATED: Use `Flow` instead. - * - * A data-flow configuration for reasoning about unvalidated URL redirections. - */ - deprecated class Configuration extends DataFlow::Configuration { - Configuration() { this = "OpenUrlRedirect" } - - override predicate isSource(DataFlow::Node source) { source instanceof Source } - - override predicate isSink(DataFlow::Node sink) { sink instanceof Sink } - - override predicate isBarrier(DataFlow::Node node) { node instanceof Barrier } - - override predicate isAdditionalFlowStep(DataFlow::Node pred, DataFlow::Node succ) { - // taint steps that do not include flow through fields - TaintTracking::localTaintStep(pred, succ) and not TaintTracking::fieldReadStep(pred, succ) - or - // explicit extra taint steps for this query - any(AdditionalStep s).hasTaintStep(pred, succ) - or - // propagate to a URL when its host is assigned to - exists(Write w, Field f, SsaWithFields v | f.hasQualifiedName("net/url", "URL", "Host") | - w.writesField(v.getAUse(), f, pred) and succ = v.getAUse() - ) - or - // propagate out of most URL fields, but not `ForceQuery` and `Scheme` - exists(Field f, string fn | - f.hasQualifiedName("net/url", "URL", fn) and - not fn in ["ForceQuery", "Scheme"] - | - succ.(Read).readsField(pred, f) - ) - } - - override predicate isBarrierOut(DataFlow::Node node) { - // block propagation of this unsafe value when its host is overwritten - exists(Write w, Field f | f.hasQualifiedName("net/url", "URL", "Host") | - w.writesField(node.getASuccessor(), f, _) - ) - or - hostnameSanitizingPrefixEdge(node, _) - } - } - private module Config implements DataFlow::ConfigSig { predicate isSource(DataFlow::Node source) { source instanceof Source } diff --git a/go/ql/lib/semmle/go/security/ReflectedXss.qll b/go/ql/lib/semmle/go/security/ReflectedXss.qll index a605d78633d..1068c6fae3d 100644 --- a/go/ql/lib/semmle/go/security/ReflectedXss.qll +++ b/go/ql/lib/semmle/go/security/ReflectedXss.qll @@ -16,24 +16,6 @@ import go module ReflectedXss { import ReflectedXssCustomizations::ReflectedXss - /** - * DEPRECATED: Use `Flow` instead. - * - * A taint-tracking configuration for reasoning about XSS. - */ - deprecated class Configuration extends TaintTracking::Configuration { - Configuration() { this = "ReflectedXss" } - - override predicate isSource(DataFlow::Node source) { source instanceof Source } - - override predicate isSink(DataFlow::Node sink) { sink instanceof Sink } - - override predicate isSanitizer(DataFlow::Node node) { - super.isSanitizer(node) or - node instanceof Sanitizer - } - } - private module Config implements DataFlow::ConfigSig { predicate isSource(DataFlow::Node source) { source instanceof Source } diff --git a/go/ql/lib/semmle/go/security/RequestForgery.qll b/go/ql/lib/semmle/go/security/RequestForgery.qll index 5f7139a1b44..bdf26a1f18f 100644 --- a/go/ql/lib/semmle/go/security/RequestForgery.qll +++ b/go/ql/lib/semmle/go/security/RequestForgery.qll @@ -16,36 +16,6 @@ import go module RequestForgery { import RequestForgeryCustomizations::RequestForgery - /** - * DEPRECATED: Use `Flow` instead. - * - * A taint-tracking configuration for reasoning about request forgery. - */ - deprecated class Configuration extends TaintTracking::Configuration { - Configuration() { this = "RequestForgery" } - - override predicate isSource(DataFlow::Node source) { source instanceof Source } - - override predicate isSink(DataFlow::Node sink) { sink instanceof Sink } - - override predicate isAdditionalTaintStep(DataFlow::Node pred, DataFlow::Node succ) { - // propagate to a URL when its host is assigned to - exists(Write w, Field f, SsaWithFields v | f.hasQualifiedName("net/url", "URL", "Host") | - w.writesField(v.getAUse(), f, pred) and succ = v.getAUse() - ) - } - - override predicate isSanitizer(DataFlow::Node node) { - super.isSanitizer(node) or - node instanceof Sanitizer - } - - override predicate isSanitizerOut(DataFlow::Node node) { - super.isSanitizerOut(node) or - node instanceof SanitizerEdge - } - } - private module Config implements DataFlow::ConfigSig { predicate isSource(DataFlow::Node source) { source instanceof Source } diff --git a/go/ql/lib/semmle/go/security/SafeUrlFlow.qll b/go/ql/lib/semmle/go/security/SafeUrlFlow.qll index f4d1a535bad..d74e2156a60 100644 --- a/go/ql/lib/semmle/go/security/SafeUrlFlow.qll +++ b/go/ql/lib/semmle/go/security/SafeUrlFlow.qll @@ -16,35 +16,6 @@ import go module SafeUrlFlow { import SafeUrlFlowCustomizations::SafeUrlFlow - /** - * DEPRECATED: Use `Flow` instead. - * - * A taint-tracking configuration for reasoning about safe URLs. - */ - deprecated class Configuration extends TaintTracking::Configuration { - Configuration() { this = "SafeUrlFlow" } - - override predicate isSource(DataFlow::Node source) { source instanceof Source } - - override predicate isSink(DataFlow::Node sink) { sink instanceof Sink } - - override predicate isAdditionalTaintStep(DataFlow::Node pred, DataFlow::Node succ) { - // propagate to a URL when its host is assigned to - exists(Write w, Field f, SsaWithFields v | f.hasQualifiedName("net/url", "URL", "Host") | - w.writesField(v.getAUse(), f, pred) and succ = v.getAUse() - ) - } - - override predicate isSanitizerOut(DataFlow::Node node) { - // block propagation of this safe value when its host is overwritten - exists(Write w, Field f | f.hasQualifiedName("net/url", "URL", "Host") | - w.writesField(node.getASuccessor(), f, _) - ) - or - node instanceof SanitizerEdge - } - } - private module Config implements DataFlow::ConfigSig { predicate isSource(DataFlow::Node source) { source instanceof Source } diff --git a/go/ql/lib/semmle/go/security/SqlInjection.qll b/go/ql/lib/semmle/go/security/SqlInjection.qll index 366a05cf3df..e24b30f40d3 100644 --- a/go/ql/lib/semmle/go/security/SqlInjection.qll +++ b/go/ql/lib/semmle/go/security/SqlInjection.qll @@ -13,28 +13,6 @@ import go module SqlInjection { import SqlInjectionCustomizations::SqlInjection - /** - * DEPRECATED: Use `Flow` instead. - * - * A taint-tracking configuration for reasoning about SQL-injection vulnerabilities. - */ - deprecated class Configuration extends TaintTracking::Configuration { - Configuration() { this = "SqlInjection" } - - override predicate isSource(DataFlow::Node source) { source instanceof Source } - - override predicate isSink(DataFlow::Node sink) { sink instanceof Sink } - - override predicate isAdditionalTaintStep(DataFlow::Node pred, DataFlow::Node succ) { - NoSql::isAdditionalMongoTaintStep(pred, succ) - } - - override predicate isSanitizer(DataFlow::Node node) { - super.isSanitizer(node) or - node instanceof Sanitizer - } - } - private module Config implements DataFlow::ConfigSig { predicate isSource(DataFlow::Node source) { source instanceof Source } diff --git a/go/ql/lib/semmle/go/security/StoredCommand.qll b/go/ql/lib/semmle/go/security/StoredCommand.qll index 4c21a292371..38555370cfc 100644 --- a/go/ql/lib/semmle/go/security/StoredCommand.qll +++ b/go/ql/lib/semmle/go/security/StoredCommand.qll @@ -16,28 +16,6 @@ import CommandInjectionCustomizations * injection vulnerabilities. */ module StoredCommand { - /** - * DEPRECATED: Use `Flow` instead. - * - * A taint-tracking configuration for reasoning about command-injection vulnerabilities. - */ - deprecated class Configuration extends TaintTracking::Configuration { - Configuration() { this = "StoredCommand" } - - override predicate isSource(DataFlow::Node source) { - source instanceof StoredXss::Source and - // exclude file names, since those are not generally an issue - not source instanceof StoredXss::FileNameSource - } - - override predicate isSink(DataFlow::Node sink) { sink instanceof CommandInjection::Sink } - - override predicate isSanitizer(DataFlow::Node node) { - super.isSanitizer(node) or - node instanceof CommandInjection::Sanitizer - } - } - private module Config implements DataFlow::ConfigSig { predicate isSource(DataFlow::Node source) { source instanceof StoredXss::Source and diff --git a/go/ql/lib/semmle/go/security/StoredXss.qll b/go/ql/lib/semmle/go/security/StoredXss.qll index 37e4b048910..2bf6bf24804 100644 --- a/go/ql/lib/semmle/go/security/StoredXss.qll +++ b/go/ql/lib/semmle/go/security/StoredXss.qll @@ -16,24 +16,6 @@ import go module StoredXss { import StoredXssCustomizations::StoredXss - /** - * DEPRECATED: Use `Flow` instead. - * - * A taint-tracking configuration for reasoning about XSS. - */ - deprecated class Configuration extends TaintTracking::Configuration { - Configuration() { this = "StoredXss" } - - override predicate isSource(DataFlow::Node source) { source instanceof Source } - - override predicate isSink(DataFlow::Node sink) { sink instanceof Sink } - - override predicate isSanitizer(DataFlow::Node node) { - super.isSanitizer(node) or - node instanceof Sanitizer - } - } - private module Config implements DataFlow::ConfigSig { predicate isSource(DataFlow::Node source) { source instanceof Source } diff --git a/go/ql/lib/semmle/go/security/StringBreak.qll b/go/ql/lib/semmle/go/security/StringBreak.qll index fed3b9b1443..02b4c5b3313 100644 --- a/go/ql/lib/semmle/go/security/StringBreak.qll +++ b/go/ql/lib/semmle/go/security/StringBreak.qll @@ -13,27 +13,6 @@ import go module StringBreak { import StringBreakCustomizations::StringBreak - /** - * DEPRECATED: Use `Flow` instead. - * - * A taint-tracking configuration for reasoning about unsafe-quoting vulnerabilities, - * parameterized with the type of quote being tracked. - */ - deprecated class Configuration extends TaintTracking::Configuration { - Quote quote; - - Configuration() { this = "StringBreak" + quote } - - /** Gets the type of quote being tracked by this configuration. */ - Quote getQuote() { result = quote } - - override predicate isSource(DataFlow::Node nd) { nd instanceof Source } - - override predicate isSink(DataFlow::Node nd) { quote = nd.(Sink).getQuote() } - - override predicate isSanitizer(DataFlow::Node nd) { quote = nd.(Sanitizer).getQuote() } - } - private module Config implements DataFlow::StateConfigSig { /** The flow state that we track is the type of quote used. */ class FlowState = Quote; diff --git a/go/ql/lib/semmle/go/security/TaintedPath.qll b/go/ql/lib/semmle/go/security/TaintedPath.qll index 26009554c24..674cda1157c 100644 --- a/go/ql/lib/semmle/go/security/TaintedPath.qll +++ b/go/ql/lib/semmle/go/security/TaintedPath.qll @@ -11,24 +11,6 @@ import go module TaintedPath { import TaintedPathCustomizations::TaintedPath - /** - * DEPRECATED: Use `Flow` instead. - * - * A taint-tracking configuration for reasoning about path-traversal vulnerabilities. - */ - deprecated class Configuration extends TaintTracking::Configuration { - Configuration() { this = "TaintedPath" } - - override predicate isSource(DataFlow::Node source) { source instanceof Source } - - override predicate isSink(DataFlow::Node sink) { sink instanceof Sink } - - override predicate isSanitizer(DataFlow::Node node) { - super.isSanitizer(node) or - node instanceof Sanitizer - } - } - private module Config implements DataFlow::ConfigSig { predicate isSource(DataFlow::Node source) { source instanceof Source } diff --git a/go/ql/lib/semmle/go/security/UnsafeUnzipSymlink.qll b/go/ql/lib/semmle/go/security/UnsafeUnzipSymlink.qll index 2b969ffc4d9..1d18ac5f639 100644 --- a/go/ql/lib/semmle/go/security/UnsafeUnzipSymlink.qll +++ b/go/ql/lib/semmle/go/security/UnsafeUnzipSymlink.qll @@ -13,24 +13,6 @@ import go module UnsafeUnzipSymlink { import UnsafeUnzipSymlinkCustomizations::UnsafeUnzipSymlink - /** - * DEPRECATED: Use copies of `EvalSymlinksConfig` and `EvalSymlinksFlow` instead. - * - * A taint-flow configuration tracking archive header fields flowing to a `path/filepath.EvalSymlinks` call. - */ - deprecated class EvalSymlinksConfiguration extends TaintTracking2::Configuration { - EvalSymlinksConfiguration() { this = "Archive header field symlinks resolved" } - - override predicate isSource(DataFlow::Node source) { source instanceof FilenameWithSymlinks } - - override predicate isSink(DataFlow::Node sink) { sink instanceof EvalSymlinksSink } - - override predicate isSanitizer(DataFlow::Node node) { - super.isSanitizer(node) or - node instanceof EvalSymlinksInvalidator - } - } - // Archive header field symlinks resolved private module EvalSymlinksConfig implements DataFlow::ConfigSig { predicate isSource(DataFlow::Node source) { source instanceof FilenameWithSymlinks } @@ -53,28 +35,6 @@ module UnsafeUnzipSymlink { EvalSymlinksFlow::flow(getASimilarReadNode(node), _) } - /** - * DEPRECATED: Use `Flow` instead. - * - * A taint-flow configuration tracking archive header fields flowing to an `os.Symlink` call, - * which never flow to a `path/filepath.EvalSymlinks` call. - */ - deprecated class SymlinkConfiguration extends TaintTracking::Configuration { - SymlinkConfiguration() { this = "Unsafe unzipping of symlinks" } - - override predicate isSource(DataFlow::Node source) { - source instanceof FilenameWithSymlinks and - not symlinksEvald(source) - } - - override predicate isSink(DataFlow::Node sink) { sink instanceof SymlinkSink } - - override predicate isSanitizer(DataFlow::Node node) { - super.isSanitizer(node) or - node instanceof SymlinkSanitizer - } - } - private module Config implements DataFlow::ConfigSig { predicate isSource(DataFlow::Node source) { source instanceof FilenameWithSymlinks and diff --git a/go/ql/lib/semmle/go/security/XPathInjection.qll b/go/ql/lib/semmle/go/security/XPathInjection.qll index 2e374dfbf24..61bd00977da 100644 --- a/go/ql/lib/semmle/go/security/XPathInjection.qll +++ b/go/ql/lib/semmle/go/security/XPathInjection.qll @@ -13,24 +13,6 @@ import go module XPathInjection { import XPathInjectionCustomizations::XPathInjection - /** - * DEPRECATED: Use `Flow` instead. - * - * A taint-tracking configuration for reasoning about untrusted user input used in an XPath expression. - */ - deprecated class Configuration extends TaintTracking::Configuration { - Configuration() { this = "XPathInjection" } - - override predicate isSource(DataFlow::Node source) { source instanceof Source } - - override predicate isSink(DataFlow::Node sink) { sink instanceof Sink } - - override predicate isSanitizer(DataFlow::Node node) { - super.isSanitizer(node) or - node instanceof Sanitizer - } - } - private module Config implements DataFlow::ConfigSig { predicate isSource(DataFlow::Node source) { source instanceof Source } diff --git a/go/ql/lib/semmle/go/security/ZipSlip.qll b/go/ql/lib/semmle/go/security/ZipSlip.qll index 4a7ba231f0f..f16daf84c3d 100644 --- a/go/ql/lib/semmle/go/security/ZipSlip.qll +++ b/go/ql/lib/semmle/go/security/ZipSlip.qll @@ -11,24 +11,6 @@ import go module ZipSlip { import ZipSlipCustomizations::ZipSlip - /** - * DEPRECATED: Use `Flow` instead. - * - * A taint-tracking configuration for reasoning about zip-slip vulnerabilities. - */ - deprecated class Configuration extends TaintTracking::Configuration { - Configuration() { this = "ZipSlip" } - - override predicate isSource(DataFlow::Node source) { source instanceof Source } - - override predicate isSink(DataFlow::Node sink) { sink instanceof Sink } - - override predicate isSanitizer(DataFlow::Node node) { - super.isSanitizer(node) or - node instanceof Sanitizer - } - } - private module Config implements DataFlow::ConfigSig { predicate isSource(DataFlow::Node source) { source instanceof Source } diff --git a/go/ql/src/CHANGELOG.md b/go/ql/src/CHANGELOG.md index 0e276fda741..c9044e55cdc 100644 --- a/go/ql/src/CHANGELOG.md +++ b/go/ql/src/CHANGELOG.md @@ -1,3 +1,13 @@ +## 1.1.4 + +### Minor Analysis Improvements + +* Added value flow models for functions in the `slices` package which do not involve the `iter` package. + +## 1.1.3 + +No user-facing changes. + ## 1.1.2 No user-facing changes. diff --git a/go/ql/src/Security/CWE-640/EmailInjection.qll b/go/ql/src/Security/CWE-640/EmailInjection.qll index 479fe6dc055..35b7795ad55 100644 --- a/go/ql/src/Security/CWE-640/EmailInjection.qll +++ b/go/ql/src/Security/CWE-640/EmailInjection.qll @@ -16,19 +16,6 @@ import go module EmailInjection { import EmailInjectionCustomizations::EmailInjection - /** - * DEPRECATED: Use `Flow` instead. - * - * A taint-tracking configuration for reasoning about email-injection vulnerabilities. - */ - deprecated class Configuration extends TaintTracking::Configuration { - Configuration() { this = "Email Injection" } - - override predicate isSource(DataFlow::Node source) { source instanceof Source } - - override predicate isSink(DataFlow::Node sink) { sink instanceof Sink } - } - private module Config implements DataFlow::ConfigSig { predicate isSource(DataFlow::Node source) { source instanceof Source } diff --git a/go/ql/src/change-notes/released/1.1.3.md b/go/ql/src/change-notes/released/1.1.3.md new file mode 100644 index 00000000000..e8f1701bd62 --- /dev/null +++ b/go/ql/src/change-notes/released/1.1.3.md @@ -0,0 +1,3 @@ +## 1.1.3 + +No user-facing changes. diff --git a/go/ql/src/change-notes/2024-11-26-model-slices-package.md b/go/ql/src/change-notes/released/1.1.4.md similarity index 70% rename from go/ql/src/change-notes/2024-11-26-model-slices-package.md rename to go/ql/src/change-notes/released/1.1.4.md index 5a3141c8075..0437ebd2bd6 100644 --- a/go/ql/src/change-notes/2024-11-26-model-slices-package.md +++ b/go/ql/src/change-notes/released/1.1.4.md @@ -1,4 +1,5 @@ ---- -category: minorAnalysis ---- +## 1.1.4 + +### Minor Analysis Improvements + * Added value flow models for functions in the `slices` package which do not involve the `iter` package. diff --git a/go/ql/src/codeql-pack.release.yml b/go/ql/src/codeql-pack.release.yml index 53ab127707f..26cbcd3f123 100644 --- a/go/ql/src/codeql-pack.release.yml +++ b/go/ql/src/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.1.2 +lastReleaseVersion: 1.1.4 diff --git a/go/ql/src/experimental/CWE-090/LDAPInjection.qll b/go/ql/src/experimental/CWE-090/LDAPInjection.qll index 4e0a6e290da..fd138fa0645 100644 --- a/go/ql/src/experimental/CWE-090/LDAPInjection.qll +++ b/go/ql/src/experimental/CWE-090/LDAPInjection.qll @@ -95,22 +95,6 @@ private class LdapClientDNSink extends LdapSink { } } -/** - * DEPRECATED: Use `LdapInjectionFlow` instead. - * - * A taint-tracking configuration for reasoning about when a `ActiveThreatModelSource` - * flows into an argument or field that is vulnerable to LDAP injection. - */ -deprecated class LdapInjectionConfiguration extends TaintTracking::Configuration { - LdapInjectionConfiguration() { this = "Ldap injection" } - - override predicate isSource(DataFlow::Node source) { source instanceof ActiveThreatModelSource } - - override predicate isSink(DataFlow::Node sink) { sink instanceof LdapSink } - - override predicate isSanitizer(DataFlow::Node sanitizer) { sanitizer instanceof LdapSanitizer } -} - private module LdapInjectionConfig implements DataFlow::ConfigSig { predicate isSource(DataFlow::Node source) { source instanceof ActiveThreatModelSource } diff --git a/go/ql/src/experimental/CWE-1004/AuthCookie.qll b/go/ql/src/experimental/CWE-1004/AuthCookie.qll index c995a8b2f68..411da5a79fa 100644 --- a/go/ql/src/experimental/CWE-1004/AuthCookie.qll +++ b/go/ql/src/experimental/CWE-1004/AuthCookie.qll @@ -64,28 +64,6 @@ private class SetCookieSink extends DataFlow::Node { } } -/** - * DEPRECATED: Use `NameToNetHttpCookieTrackingFlow` instead. - * - * A taint-tracking configuration for tracking flow from sensitive names to - * `net/http.SetCookie`. - */ -deprecated class NameToNetHttpCookieTrackingConfiguration extends TaintTracking::Configuration { - NameToNetHttpCookieTrackingConfiguration() { this = "NameToNetHttpCookieTrackingConfiguration" } - - override predicate isSource(DataFlow::Node source) { isAuthVariable(source.asExpr()) } - - override predicate isSink(DataFlow::Node sink) { sink instanceof SetCookieSink } - - override predicate isAdditionalTaintStep(DataFlow::Node pred, DataFlow::Node succ) { - exists(StructLit sl | - sl.getType() instanceof NetHttpCookieType and - getValueForFieldWrite(sl, "Name") = pred and - sl = succ.asExpr() - ) - } -} - private module NameToNetHttpCookieTrackingConfig implements DataFlow::ConfigSig { predicate isSource(DataFlow::Node source) { isAuthVariable(source.asExpr()) } @@ -103,30 +81,6 @@ private module NameToNetHttpCookieTrackingConfig implements DataFlow::ConfigSig /** Tracks taint flow from sensitive names to `net/http.SetCookie`. */ module NameToNetHttpCookieTrackingFlow = TaintTracking::Global; -/** - * DEPRECATED: Use `BoolToNetHttpCookieTrackingFlow` instead. - * - * A taint-tracking configuration for tracking flow from `bool` assigned to - * `HttpOnly` that flows into `net/http.SetCookie`. - */ -deprecated class BoolToNetHttpCookieTrackingConfiguration extends TaintTracking::Configuration { - BoolToNetHttpCookieTrackingConfiguration() { this = "BoolToNetHttpCookieTrackingConfiguration" } - - override predicate isSource(DataFlow::Node source) { - source.getType().getUnderlyingType() instanceof BoolType - } - - override predicate isSink(DataFlow::Node sink) { sink instanceof SetCookieSink } - - override predicate isAdditionalTaintStep(DataFlow::Node pred, DataFlow::Node succ) { - exists(StructLit sl | - sl.getType() instanceof NetHttpCookieType and - getValueForFieldWrite(sl, "HttpOnly") = pred and - sl = succ.asExpr() - ) - } -} - private module BoolToNetHttpCookieTrackingConfig implements DataFlow::ConfigSig { predicate isSource(DataFlow::Node source) { source.getType().getUnderlyingType() instanceof BoolType @@ -149,29 +103,6 @@ private module BoolToNetHttpCookieTrackingConfig implements DataFlow::ConfigSig */ module BoolToNetHttpCookieTrackingFlow = TaintTracking::Global; -/** - * DEPRECATED: Use `BoolToGinSetCookieTrackingFlow` instead. - * - * A taint-tracking configuration for tracking flow from `HttpOnly` set to - * `false` to `gin-gonic/gin.Context.SetCookie`. - */ -deprecated class BoolToGinSetCookieTrackingConfiguration extends DataFlow::Configuration { - BoolToGinSetCookieTrackingConfiguration() { this = "BoolToGinSetCookieTrackingConfiguration" } - - override predicate isSource(DataFlow::Node source) { source.getBoolValue() = false } - - override predicate isSink(DataFlow::Node sink) { - exists(DataFlow::MethodCallNode mcn | - mcn.getTarget() instanceof GinContextSetCookieMethod and - mcn.getArgument(6) = sink and - exists(NameToGinSetCookieTrackingConfiguration cfg, DataFlow::Node nameArg | - cfg.hasFlowTo(nameArg) and - mcn.getArgument(0) = nameArg - ) - ) - } -} - private module BoolToGinSetCookieTrackingConfig implements DataFlow::ConfigSig { predicate isSource(DataFlow::Node source) { source.getBoolValue() = false } @@ -193,25 +124,6 @@ private module BoolToGinSetCookieTrackingConfig implements DataFlow::ConfigSig { */ module BoolToGinSetCookieTrackingFlow = DataFlow::Global; -/** - * DEPRECATED: Use `NameToGinSetCookieTrackingFlow` instead. - * - * A taint-tracking configuration for tracking flow from sensitive names to - * `gin-gonic/gin.Context.SetCookie`. - */ -deprecated private class NameToGinSetCookieTrackingConfiguration extends DataFlow2::Configuration { - NameToGinSetCookieTrackingConfiguration() { this = "NameToGinSetCookieTrackingConfiguration" } - - override predicate isSource(DataFlow::Node source) { isAuthVariable(source.asExpr()) } - - override predicate isSink(DataFlow::Node sink) { - exists(DataFlow::MethodCallNode mcn | - mcn.getTarget() instanceof GinContextSetCookieMethod and - mcn.getArgument(0) = sink - ) - } -} - private module NameToGinSetCookieTrackingConfig implements DataFlow::ConfigSig { predicate isSource(DataFlow::Node source) { isAuthVariable(source.asExpr()) } @@ -251,39 +163,6 @@ private class GorillaStoreSaveSink extends DataFlow::Node { } } -/** - * DEPRECATED: Use `GorillaCookieStoreSaveTrackingFlow` instead. - * - * A taint-tracking configuration for tracking flow from gorilla cookie store - * creation to `gorilla/sessions.Session.Save`. - */ -deprecated class GorillaCookieStoreSaveTrackingConfiguration extends DataFlow::Configuration { - GorillaCookieStoreSaveTrackingConfiguration() { - this = "GorillaCookieStoreSaveTrackingConfiguration" - } - - override predicate isSource(DataFlow::Node source) { - source - .(DataFlow::CallNode) - .getTarget() - .hasQualifiedName(package("github.com/gorilla/sessions", ""), "NewCookieStore") - } - - override predicate isSink(DataFlow::Node sink) { - sink instanceof GorillaSessionSaveSink or - sink instanceof GorillaStoreSaveSink - } - - override predicate isAdditionalFlowStep(DataFlow::Node pred, DataFlow::Node succ) { - exists(DataFlow::MethodCallNode cn | - cn.getTarget() - .hasQualifiedName(package("github.com/gorilla/sessions", ""), "CookieStore", "Get") and - pred = cn.getReceiver() and - succ = cn.getResult(0) - ) - } -} - private module GorillaCookieStoreSaveTrackingConfig implements DataFlow::ConfigSig { predicate isSource(DataFlow::Node source) { source @@ -313,34 +192,6 @@ private module GorillaCookieStoreSaveTrackingConfig implements DataFlow::ConfigS */ module GorillaCookieStoreSaveTrackingFlow = DataFlow::Global; -/** - * DEPRECATED: Use `GorillaSessionOptionsTrackingFlow` instead. - * - * A taint-tracking configuration for tracking flow from session options to - * `gorilla/sessions.Session.Save`. - */ -deprecated class GorillaSessionOptionsTrackingConfiguration extends TaintTracking::Configuration { - GorillaSessionOptionsTrackingConfiguration() { - this = "GorillaSessionOptionsTrackingConfiguration" - } - - override predicate isSource(DataFlow::Node source) { - exists(StructLit sl | - sl.getType().hasQualifiedName(package("github.com/gorilla/sessions", ""), "Options") and - source.asExpr() = sl - ) - } - - override predicate isSink(DataFlow::Node sink) { sink instanceof GorillaSessionSaveSink } - - override predicate isAdditionalTaintStep(DataFlow::Node pred, DataFlow::Node succ) { - exists(GorillaSessionOptionsField f, DataFlow::Write w, DataFlow::Node base | - w.writesField(base, f, pred) and - succ = base - ) - } -} - private module GorillaSessionOptionsTrackingConfig implements DataFlow::ConfigSig { predicate isSource(DataFlow::Node source) { exists(StructLit sl | @@ -366,37 +217,6 @@ private module GorillaSessionOptionsTrackingConfig implements DataFlow::ConfigSi module GorillaSessionOptionsTrackingFlow = TaintTracking::Global; -/** - * DEPRECATED: Use `BoolToGorillaSessionOptionsTrackingFlow` instead. - * - * A taint-tracking configuration for tracking flow from a `bool` assigned to - * `HttpOnly` to `gorilla/sessions.Session.Save`. - */ -deprecated class BoolToGorillaSessionOptionsTrackingConfiguration extends TaintTracking::Configuration -{ - BoolToGorillaSessionOptionsTrackingConfiguration() { - this = "BoolToGorillaSessionOptionsTrackingConfiguration" - } - - override predicate isSource(DataFlow::Node source) { - source.getType().getUnderlyingType() instanceof BoolType - } - - override predicate isSink(DataFlow::Node sink) { sink instanceof GorillaSessionSaveSink } - - override predicate isAdditionalTaintStep(DataFlow::Node pred, DataFlow::Node succ) { - exists(StructLit sl | - getValueForFieldWrite(sl, "HttpOnly") = pred and - sl = succ.asExpr() - ) - or - exists(GorillaSessionOptionsField f, DataFlow::Write w, DataFlow::Node base | - w.writesField(base, f, pred) and - succ = base - ) - } -} - private module BoolToGorillaSessionOptionsTrackingConfig implements DataFlow::ConfigSig { predicate isSource(DataFlow::Node source) { source.getType().getUnderlyingType() instanceof BoolType diff --git a/go/ql/src/experimental/CWE-327/WeakCryptoAlgorithmCustomizations.qll b/go/ql/src/experimental/CWE-327/WeakCryptoAlgorithmCustomizations.qll index 61a55bdd32b..1d64d731f50 100644 --- a/go/ql/src/experimental/CWE-327/WeakCryptoAlgorithmCustomizations.qll +++ b/go/ql/src/experimental/CWE-327/WeakCryptoAlgorithmCustomizations.qll @@ -48,24 +48,6 @@ module WeakCryptoAlgorithm { } } - /** - * DEPRECATED: Use `Flow` instead. - * - * A configuration depicting taint flow from sensitive information to weak cryptographic algorithms. - */ - deprecated class Configuration extends TaintTracking::Configuration { - Configuration() { this = "WeakCryptoAlgorithm" } - - override predicate isSource(DataFlow::Node source) { source instanceof Source } - - override predicate isSink(DataFlow::Node sink) { sink instanceof Sink } - - override predicate isSanitizer(DataFlow::Node node) { - super.isSanitizer(node) or - node instanceof Sanitizer - } - } - private module Config implements DataFlow::ConfigSig { predicate isSource(DataFlow::Node source) { source instanceof Source } diff --git a/go/ql/src/experimental/CWE-74/DsnInjectionCustomizations.qll b/go/ql/src/experimental/CWE-74/DsnInjectionCustomizations.qll index 5417ddf4f3e..2c320855072 100644 --- a/go/ql/src/experimental/CWE-74/DsnInjectionCustomizations.qll +++ b/go/ql/src/experimental/CWE-74/DsnInjectionCustomizations.qll @@ -6,28 +6,6 @@ import semmle.go.dataflow.barrierguardutil.RegexpCheck /** A source for `DsnInjection` taint-flow configuration. */ abstract class Source extends DataFlow::Node { } -/** - * DEPRECATED: Use `DsnInjectionFlow` instead. - * - * A taint-tracking configuration to reason about Data Source Name injection vulnerabilities. - */ -deprecated class DsnInjection extends TaintTracking::Configuration { - DsnInjection() { this = "DsnInjection" } - - override predicate isSource(DataFlow::Node node) { node instanceof Source } - - override predicate isSink(DataFlow::Node node) { - exists(DataFlow::CallNode c | - c.getTarget().hasQualifiedName("database/sql", "Open") and - c.getArgument(0).getStringValue() = "mysql" - | - node = c.getArgument(1) - ) - } - - override predicate isSanitizer(DataFlow::Node node) { node instanceof RegexpCheckBarrier } -} - private module DsnInjectionConfig implements DataFlow::ConfigSig { predicate isSource(DataFlow::Node source) { source instanceof Source } diff --git a/go/ql/src/experimental/CWE-807/SensitiveConditionBypass.qll b/go/ql/src/experimental/CWE-807/SensitiveConditionBypass.qll index 0d4bdfb1dd0..2f2ca94fa87 100644 --- a/go/ql/src/experimental/CWE-807/SensitiveConditionBypass.qll +++ b/go/ql/src/experimental/CWE-807/SensitiveConditionBypass.qll @@ -42,33 +42,6 @@ private class ConstComparisonExpr extends ComparisonExpr { } } -/** - * DEPRECATED: Use `Flow` instead. - * - * A data-flow configuration for reasoning about - * user-controlled bypassing of sensitive actions. - */ -deprecated class Configuration extends TaintTracking::Configuration { - Configuration() { this = "Condtional Expression Check Bypass" } - - override predicate isSource(DataFlow::Node source) { - source instanceof ActiveThreatModelSource - or - exists(DataFlow::FieldReadNode f | - f.getField().hasQualifiedName("net/http", "Request", "Host") - | - source = f - ) - } - - override predicate isSink(DataFlow::Node sink) { - exists(ConstComparisonExpr c | - c.getAnOperand() = sink.asExpr() and - not c.isPotentialFalsePositive() - ) - } -} - private module Config implements DataFlow::ConfigSig { predicate isSource(DataFlow::Node source) { source instanceof ActiveThreatModelSource diff --git a/go/ql/src/experimental/CWE-918/SSRF.qll b/go/ql/src/experimental/CWE-918/SSRF.qll index 42b017ac487..b1374da8a5f 100644 --- a/go/ql/src/experimental/CWE-918/SSRF.qll +++ b/go/ql/src/experimental/CWE-918/SSRF.qll @@ -15,36 +15,6 @@ module ServerSideRequestForgery { private import semmle.go.dataflow.barrierguardutil.RegexpCheck private import semmle.go.dataflow.Properties - /** - * DEPRECATED: Use `Flow` instead. - * - * A taint-tracking configuration for reasoning about request forgery. - */ - deprecated class Configuration extends TaintTracking::Configuration { - Configuration() { this = "SSRF" } - - override predicate isSource(DataFlow::Node source) { source instanceof Source } - - override predicate isSink(DataFlow::Node sink) { sink instanceof Sink } - - override predicate isAdditionalTaintStep(DataFlow::Node pred, DataFlow::Node succ) { - // propagate to a URL when its host is assigned to - exists(Write w, Field f, SsaWithFields v | f.hasQualifiedName("net/url", "URL", "Host") | - w.writesField(v.getAUse(), f, pred) and succ = v.getAUse() - ) - } - - override predicate isSanitizer(DataFlow::Node node) { - super.isSanitizer(node) or - node instanceof Sanitizer - } - - override predicate isSanitizerOut(DataFlow::Node node) { - super.isSanitizerOut(node) or - node instanceof SanitizerEdge - } - } - private module Config implements DataFlow::ConfigSig { predicate isSource(DataFlow::Node source) { source instanceof Source } diff --git a/go/ql/src/qlpack.yml b/go/ql/src/qlpack.yml index 68bac4cf1a9..36775d0d862 100644 --- a/go/ql/src/qlpack.yml +++ b/go/ql/src/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/go-queries -version: 1.1.3-dev +version: 1.1.5-dev groups: - go - queries diff --git a/go/ql/test/experimental/CWE-522-DecompressionBombs/DecompressionBombTest.expected b/go/ql/test/experimental/CWE-522-DecompressionBombs/DecompressionBombTest.expected index 105b7026d0c..42831abaf15 100644 --- a/go/ql/test/experimental/CWE-522-DecompressionBombs/DecompressionBombTest.expected +++ b/go/ql/test/experimental/CWE-522-DecompressionBombs/DecompressionBombTest.expected @@ -1,3 +1,2 @@ -failures invalidModelRow testFailures diff --git a/go/ql/test/experimental/frameworks/CleverGo/HeaderWrite.expected b/go/ql/test/experimental/frameworks/CleverGo/HeaderWrite.expected index 48de9172b36..e69de29bb2d 100644 --- a/go/ql/test/experimental/frameworks/CleverGo/HeaderWrite.expected +++ b/go/ql/test/experimental/frameworks/CleverGo/HeaderWrite.expected @@ -1,2 +0,0 @@ -failures -testFailures diff --git a/go/ql/test/experimental/frameworks/CleverGo/HttpRedirect.expected b/go/ql/test/experimental/frameworks/CleverGo/HttpRedirect.expected index 48de9172b36..e69de29bb2d 100644 --- a/go/ql/test/experimental/frameworks/CleverGo/HttpRedirect.expected +++ b/go/ql/test/experimental/frameworks/CleverGo/HttpRedirect.expected @@ -1,2 +0,0 @@ -failures -testFailures diff --git a/go/ql/test/experimental/frameworks/CleverGo/HttpResponseBody.expected b/go/ql/test/experimental/frameworks/CleverGo/HttpResponseBody.expected index 48de9172b36..e69de29bb2d 100644 --- a/go/ql/test/experimental/frameworks/CleverGo/HttpResponseBody.expected +++ b/go/ql/test/experimental/frameworks/CleverGo/HttpResponseBody.expected @@ -1,2 +0,0 @@ -failures -testFailures diff --git a/go/ql/test/experimental/frameworks/CleverGo/RemoteSources.expected b/go/ql/test/experimental/frameworks/CleverGo/RemoteSources.expected index 48de9172b36..e69de29bb2d 100644 --- a/go/ql/test/experimental/frameworks/CleverGo/RemoteSources.expected +++ b/go/ql/test/experimental/frameworks/CleverGo/RemoteSources.expected @@ -1,2 +0,0 @@ -failures -testFailures diff --git a/go/ql/test/experimental/frameworks/Fiber/HeaderWrite.expected b/go/ql/test/experimental/frameworks/Fiber/HeaderWrite.expected index 48de9172b36..e69de29bb2d 100644 --- a/go/ql/test/experimental/frameworks/Fiber/HeaderWrite.expected +++ b/go/ql/test/experimental/frameworks/Fiber/HeaderWrite.expected @@ -1,2 +0,0 @@ -failures -testFailures diff --git a/go/ql/test/experimental/frameworks/Fiber/Redirect.expected b/go/ql/test/experimental/frameworks/Fiber/Redirect.expected index 48de9172b36..e69de29bb2d 100644 --- a/go/ql/test/experimental/frameworks/Fiber/Redirect.expected +++ b/go/ql/test/experimental/frameworks/Fiber/Redirect.expected @@ -1,2 +0,0 @@ -failures -testFailures diff --git a/go/ql/test/experimental/frameworks/Fiber/RemoteFlowSources.expected b/go/ql/test/experimental/frameworks/Fiber/RemoteFlowSources.expected index 48de9172b36..e69de29bb2d 100644 --- a/go/ql/test/experimental/frameworks/Fiber/RemoteFlowSources.expected +++ b/go/ql/test/experimental/frameworks/Fiber/RemoteFlowSources.expected @@ -1,2 +0,0 @@ -failures -testFailures diff --git a/go/ql/test/experimental/frameworks/Fiber/ResponseBody.expected b/go/ql/test/experimental/frameworks/Fiber/ResponseBody.expected index 48de9172b36..e69de29bb2d 100644 --- a/go/ql/test/experimental/frameworks/Fiber/ResponseBody.expected +++ b/go/ql/test/experimental/frameworks/Fiber/ResponseBody.expected @@ -1,2 +0,0 @@ -failures -testFailures diff --git a/go/ql/test/library-tests/semmle/go/Function/isVariadic.expected b/go/ql/test/library-tests/semmle/go/Function/isVariadic.expected index 48de9172b36..e69de29bb2d 100644 --- a/go/ql/test/library-tests/semmle/go/Function/isVariadic.expected +++ b/go/ql/test/library-tests/semmle/go/Function/isVariadic.expected @@ -1,2 +0,0 @@ -failures -testFailures diff --git a/go/ql/test/library-tests/semmle/go/Types/Field_getPackage.expected b/go/ql/test/library-tests/semmle/go/Types/Field_getPackage.expected index 485a42b185e..8a527e3d4f7 100644 --- a/go/ql/test/library-tests/semmle/go/Types/Field_getPackage.expected +++ b/go/ql/test/library-tests/semmle/go/Types/Field_getPackage.expected @@ -13,8 +13,8 @@ | depth.go:19:2:19:2 | f | package github.com/github/codeql-go/ql/test/library-tests/semmle/go/Types | | embedded.go:4:2:4:2 | A | package github.com/github/codeql-go/ql/test/library-tests/semmle/go/Types | | embedded.go:8:3:8:5 | Baz | package github.com/github/codeql-go/ql/test/library-tests/semmle/go/Types | -| embedded.go:13:2:13:4 | Qux | package github.com/github/codeql-go/ql/test/library-tests/semmle/go/Types | -| embedded.go:14:2:14:4 | Baz | package github.com/github/codeql-go/ql/test/library-tests/semmle/go/Types | +| embedded.go:12:2:12:4 | Qux | package github.com/github/codeql-go/ql/test/library-tests/semmle/go/Types | +| embedded.go:13:2:13:4 | Baz | package github.com/github/codeql-go/ql/test/library-tests/semmle/go/Types | | generic.go:4:2:4:11 | valueField | package github.com/github/codeql-go/ql/test/library-tests/semmle/go/Types | | generic.go:5:2:5:13 | pointerField | package github.com/github/codeql-go/ql/test/library-tests/semmle/go/Types | | generic.go:6:2:6:11 | arrayField | package github.com/github/codeql-go/ql/test/library-tests/semmle/go/Types | @@ -26,6 +26,7 @@ | generic.go:21:2:21:9 | mapField | package github.com/github/codeql-go/ql/test/library-tests/semmle/go/Types | | generic.go:25:2:25:12 | structField | package github.com/github/codeql-go/ql/test/library-tests/semmle/go/Types | | generic.go:29:2:29:13 | pointerField | package github.com/github/codeql-go/ql/test/library-tests/semmle/go/Types | +| main.go:18:7:18:15 | NameClash | package github.com/github/codeql-go/ql/test/library-tests/semmle/go/Types | | pkg1/embedding.go:19:23:19:26 | base | package github.com/github/codeql-go/ql/test/library-tests/semmle/go/Types/pkg1 | | pkg1/embedding.go:22:27:22:30 | base | package github.com/github/codeql-go/ql/test/library-tests/semmle/go/Types/pkg1 | | pkg1/embedding.go:25:24:25:31 | embedder | package github.com/github/codeql-go/ql/test/library-tests/semmle/go/Types/pkg1 | @@ -36,20 +37,22 @@ | pkg1/promotedStructs.go:14:2:14:7 | PField | package github.com/github/codeql-go/ql/test/library-tests/semmle/go/Types/pkg1 | | pkg1/promotedStructs.go:22:22:22:22 | S | package github.com/github/codeql-go/ql/test/library-tests/semmle/go/Types/pkg1 | | pkg1/promotedStructs.go:25:22:25:22 | P | package github.com/github/codeql-go/ql/test/library-tests/semmle/go/Types/pkg1 | -| pkg1/tst.go:4:2:4:2 | f | package github.com/github/codeql-go/ql/test/library-tests/semmle/go/Types/pkg1 | -| pkg1/tst.go:5:2:5:4 | Foo | package github.com/github/codeql-go/ql/test/library-tests/semmle/go/Types/pkg1 | -| pkg1/tst.go:6:2:6:4 | Bar | package github.com/github/codeql-go/ql/test/library-tests/semmle/go/Types/pkg1 | -| pkg1/tst.go:10:2:10:4 | Foo | package github.com/github/codeql-go/ql/test/library-tests/semmle/go/Types/pkg1 | -| pkg1/tst.go:11:2:11:4 | Bar | package github.com/github/codeql-go/ql/test/library-tests/semmle/go/Types/pkg1 | -| pkg1/tst.go:15:3:15:5 | Foo | package github.com/github/codeql-go/ql/test/library-tests/semmle/go/Types/pkg1 | -| pkg1/tst.go:16:3:16:5 | Bar | package github.com/github/codeql-go/ql/test/library-tests/semmle/go/Types/pkg1 | -| pkg1/tst.go:20:3:20:5 | Foo | package github.com/github/codeql-go/ql/test/library-tests/semmle/go/Types/pkg1 | -| pkg1/tst.go:21:2:21:4 | Bar | package github.com/github/codeql-go/ql/test/library-tests/semmle/go/Types/pkg1 | -| pkg1/tst.go:25:2:25:4 | val | package github.com/github/codeql-go/ql/test/library-tests/semmle/go/Types/pkg1 | -| pkg1/tst.go:26:2:26:5 | flag | package github.com/github/codeql-go/ql/test/library-tests/semmle/go/Types/pkg1 | -| pkg1/tst.go:30:2:30:5 | flag | package github.com/github/codeql-go/ql/test/library-tests/semmle/go/Types/pkg1 | +| pkg1/tst.go:6:2:6:2 | f | package github.com/github/codeql-go/ql/test/library-tests/semmle/go/Types/pkg1 | +| pkg1/tst.go:7:2:7:4 | Foo | package github.com/github/codeql-go/ql/test/library-tests/semmle/go/Types/pkg1 | +| pkg1/tst.go:8:2:8:4 | Bar | package github.com/github/codeql-go/ql/test/library-tests/semmle/go/Types/pkg1 | +| pkg1/tst.go:12:2:12:4 | Foo | package github.com/github/codeql-go/ql/test/library-tests/semmle/go/Types/pkg1 | +| pkg1/tst.go:13:2:13:4 | Bar | package github.com/github/codeql-go/ql/test/library-tests/semmle/go/Types/pkg1 | +| pkg1/tst.go:17:3:17:5 | Foo | package github.com/github/codeql-go/ql/test/library-tests/semmle/go/Types/pkg1 | +| pkg1/tst.go:18:3:18:5 | Bar | package github.com/github/codeql-go/ql/test/library-tests/semmle/go/Types/pkg1 | +| pkg1/tst.go:22:3:22:5 | Foo | package github.com/github/codeql-go/ql/test/library-tests/semmle/go/Types/pkg1 | +| pkg1/tst.go:23:2:23:4 | Bar | package github.com/github/codeql-go/ql/test/library-tests/semmle/go/Types/pkg1 | +| pkg1/tst.go:27:2:27:4 | val | package github.com/github/codeql-go/ql/test/library-tests/semmle/go/Types/pkg1 | +| pkg1/tst.go:28:2:28:5 | flag | package github.com/github/codeql-go/ql/test/library-tests/semmle/go/Types/pkg1 | +| pkg1/tst.go:32:2:32:5 | flag | package github.com/github/codeql-go/ql/test/library-tests/semmle/go/Types/pkg1 | +| pkg1/tst.go:62:7:62:15 | NameClash | package github.com/github/codeql-go/ql/test/library-tests/semmle/go/Types/pkg1 | | pkg2/tst.go:4:2:4:2 | g | package github.com/github/codeql-go/ql/test/library-tests/semmle/go/Types/pkg2 | | pkg2/tst.go:8:2:8:2 | g | package github.com/github/codeql-go/ql/test/library-tests/semmle/go/Types/pkg2 | +| pkg2/tst.go:17:2:17:8 | NCField | package github.com/github/codeql-go/ql/test/library-tests/semmle/go/Types/pkg2 | | struct_tags.go:4:2:4:7 | field1 | package github.com/github/codeql-go/ql/test/library-tests/semmle/go/Types | | struct_tags.go:5:2:5:7 | field2 | package github.com/github/codeql-go/ql/test/library-tests/semmle/go/Types | | struct_tags.go:9:2:9:7 | field1 | package github.com/github/codeql-go/ql/test/library-tests/semmle/go/Types | diff --git a/go/ql/test/library-tests/semmle/go/Types/Field_hasQualifiedName2.expected b/go/ql/test/library-tests/semmle/go/Types/Field_hasQualifiedName2.expected index c8575332f6f..e7ffe6bc1ba 100644 --- a/go/ql/test/library-tests/semmle/go/Types/Field_hasQualifiedName2.expected +++ b/go/ql/test/library-tests/semmle/go/Types/Field_hasQualifiedName2.expected @@ -18,10 +18,11 @@ | depth.go:19:2:19:2 | f | github.com/github/codeql-go/ql/test/library-tests/semmle/go/Types.c | f | | depth.go:19:2:19:2 | f | github.com/github/codeql-go/ql/test/library-tests/semmle/go/Types.d | f | | embedded.go:4:2:4:2 | A | github.com/github/codeql-go/ql/test/library-tests/semmle/go/Types.Baz | A | +| embedded.go:4:2:4:2 | A | github.com/github/codeql-go/ql/test/library-tests/semmle/go/Types.EmbedsBaz | A | | embedded.go:4:2:4:2 | A | github.com/github/codeql-go/ql/test/library-tests/semmle/go/Types.Qux | A | | embedded.go:8:3:8:5 | Baz | github.com/github/codeql-go/ql/test/library-tests/semmle/go/Types.Qux | Baz | -| embedded.go:13:2:13:4 | Qux | github.com/github/codeql-go/ql/test/library-tests/semmle/go/Types.EmbedsBaz | Qux | -| embedded.go:14:2:14:4 | Baz | github.com/github/codeql-go/ql/test/library-tests/semmle/go/Types.EmbedsBaz | Baz | +| embedded.go:12:2:12:4 | Qux | github.com/github/codeql-go/ql/test/library-tests/semmle/go/Types.EmbedsBaz | Qux | +| embedded.go:13:2:13:4 | Baz | github.com/github/codeql-go/ql/test/library-tests/semmle/go/Types.EmbedsBaz | Baz | | generic.go:4:2:4:11 | valueField | github.com/github/codeql-go/ql/test/library-tests/semmle/go/Types.GenericStruct1 | valueField | | generic.go:5:2:5:13 | pointerField | github.com/github/codeql-go/ql/test/library-tests/semmle/go/Types.GenericStruct1 | pointerField | | generic.go:6:2:6:11 | arrayField | github.com/github/codeql-go/ql/test/library-tests/semmle/go/Types.GenericStruct1 | arrayField | @@ -33,6 +34,7 @@ | generic.go:21:2:21:9 | mapField | github.com/github/codeql-go/ql/test/library-tests/semmle/go/Types.GenericStruct2 | mapField | | generic.go:25:2:25:12 | structField | github.com/github/codeql-go/ql/test/library-tests/semmle/go/Types.GenericStruct2b | structField | | generic.go:29:2:29:13 | pointerField | github.com/github/codeql-go/ql/test/library-tests/semmle/go/Types.CircularGenericStruct2 | pointerField | +| main.go:18:7:18:15 | NameClash | github.com/github/codeql-go/ql/test/library-tests/semmle/go/Types.EmbedsNameClash | NameClash | | pkg1/embedding.go:19:23:19:26 | base | github.com/github/codeql-go/ql/test/library-tests/semmle/go/Types/pkg1.embedder | base | | pkg1/embedding.go:19:23:19:26 | base | github.com/github/codeql-go/ql/test/library-tests/semmle/go/Types/pkg1.embedder2 | base | | pkg1/embedding.go:19:23:19:26 | base | github.com/github/codeql-go/ql/test/library-tests/semmle/go/Types/pkg1.embedder3 | base | @@ -49,27 +51,31 @@ | pkg1/promotedStructs.go:14:2:14:7 | PField | github.com/github/codeql-go/ql/test/library-tests/semmle/go/Types/pkg1.SEmbedP | PField | | pkg1/promotedStructs.go:22:22:22:22 | S | github.com/github/codeql-go/ql/test/library-tests/semmle/go/Types/pkg1.SEmbedS | S | | pkg1/promotedStructs.go:25:22:25:22 | P | github.com/github/codeql-go/ql/test/library-tests/semmle/go/Types/pkg1.SEmbedP | P | -| pkg1/tst.go:4:2:4:2 | f | github.com/github/codeql-go/ql/test/library-tests/semmle/go/Types/pkg1.T | f | -| pkg1/tst.go:5:2:5:4 | Foo | github.com/github/codeql-go/ql/test/library-tests/semmle/go/Types/pkg1.T | Foo | -| pkg1/tst.go:6:2:6:4 | Bar | github.com/github/codeql-go/ql/test/library-tests/semmle/go/Types/pkg1.T | Bar | -| pkg1/tst.go:10:2:10:4 | Foo | github.com/github/codeql-go/ql/test/library-tests/semmle/go/Types/pkg1.T2 | Foo | -| pkg1/tst.go:11:2:11:4 | Bar | github.com/github/codeql-go/ql/test/library-tests/semmle/go/Types/pkg1.T2 | Bar | -| pkg1/tst.go:15:3:15:5 | Foo | github.com/github/codeql-go/ql/test/library-tests/semmle/go/Types/pkg1.T3 | Foo | -| pkg1/tst.go:16:3:16:5 | Bar | github.com/github/codeql-go/ql/test/library-tests/semmle/go/Types/pkg1.T3 | Bar | -| pkg1/tst.go:20:3:20:5 | Foo | github.com/github/codeql-go/ql/test/library-tests/semmle/go/Types/pkg1.T4 | Foo | -| pkg1/tst.go:21:2:21:4 | Bar | github.com/github/codeql-go/ql/test/library-tests/semmle/go/Types/pkg1.T4 | Bar | -| pkg1/tst.go:25:2:25:4 | val | github.com/github/codeql-go/ql/test/library-tests/semmle/go/Types/pkg1.Foo | val | -| pkg1/tst.go:25:2:25:4 | val | github.com/github/codeql-go/ql/test/library-tests/semmle/go/Types/pkg1.T | val | -| pkg1/tst.go:25:2:25:4 | val | github.com/github/codeql-go/ql/test/library-tests/semmle/go/Types/pkg1.T3 | val | -| pkg1/tst.go:25:2:25:4 | val | github.com/github/codeql-go/ql/test/library-tests/semmle/go/Types/pkg1.T4 | val | -| pkg1/tst.go:26:2:26:5 | flag | github.com/github/codeql-go/ql/test/library-tests/semmle/go/Types/pkg1.Foo | flag | -| pkg1/tst.go:26:2:26:5 | flag | github.com/github/codeql-go/ql/test/library-tests/semmle/go/Types/pkg1.T4 | flag | -| pkg1/tst.go:30:2:30:5 | flag | github.com/github/codeql-go/ql/test/library-tests/semmle/go/Types/pkg1.Bar | flag | -| pkg1/tst.go:30:2:30:5 | flag | github.com/github/codeql-go/ql/test/library-tests/semmle/go/Types/pkg1.T2 | flag | +| pkg1/tst.go:6:2:6:2 | f | github.com/github/codeql-go/ql/test/library-tests/semmle/go/Types/pkg1.T | f | +| pkg1/tst.go:7:2:7:4 | Foo | github.com/github/codeql-go/ql/test/library-tests/semmle/go/Types/pkg1.T | Foo | +| pkg1/tst.go:8:2:8:4 | Bar | github.com/github/codeql-go/ql/test/library-tests/semmle/go/Types/pkg1.T | Bar | +| pkg1/tst.go:12:2:12:4 | Foo | github.com/github/codeql-go/ql/test/library-tests/semmle/go/Types/pkg1.T2 | Foo | +| pkg1/tst.go:13:2:13:4 | Bar | github.com/github/codeql-go/ql/test/library-tests/semmle/go/Types/pkg1.T2 | Bar | +| pkg1/tst.go:17:3:17:5 | Foo | github.com/github/codeql-go/ql/test/library-tests/semmle/go/Types/pkg1.T3 | Foo | +| pkg1/tst.go:18:3:18:5 | Bar | github.com/github/codeql-go/ql/test/library-tests/semmle/go/Types/pkg1.T3 | Bar | +| pkg1/tst.go:22:3:22:5 | Foo | github.com/github/codeql-go/ql/test/library-tests/semmle/go/Types/pkg1.T4 | Foo | +| pkg1/tst.go:23:2:23:4 | Bar | github.com/github/codeql-go/ql/test/library-tests/semmle/go/Types/pkg1.T4 | Bar | +| pkg1/tst.go:27:2:27:4 | val | github.com/github/codeql-go/ql/test/library-tests/semmle/go/Types/pkg1.Foo | val | +| pkg1/tst.go:27:2:27:4 | val | github.com/github/codeql-go/ql/test/library-tests/semmle/go/Types/pkg1.T | val | +| pkg1/tst.go:27:2:27:4 | val | github.com/github/codeql-go/ql/test/library-tests/semmle/go/Types/pkg1.T3 | val | +| pkg1/tst.go:27:2:27:4 | val | github.com/github/codeql-go/ql/test/library-tests/semmle/go/Types/pkg1.T4 | val | +| pkg1/tst.go:28:2:28:5 | flag | github.com/github/codeql-go/ql/test/library-tests/semmle/go/Types/pkg1.Foo | flag | +| pkg1/tst.go:28:2:28:5 | flag | github.com/github/codeql-go/ql/test/library-tests/semmle/go/Types/pkg1.T4 | flag | +| pkg1/tst.go:32:2:32:5 | flag | github.com/github/codeql-go/ql/test/library-tests/semmle/go/Types/pkg1.Bar | flag | +| pkg1/tst.go:32:2:32:5 | flag | github.com/github/codeql-go/ql/test/library-tests/semmle/go/Types/pkg1.T2 | flag | +| pkg1/tst.go:62:7:62:15 | NameClash | github.com/github/codeql-go/ql/test/library-tests/semmle/go/Types/pkg1.NameClash | NameClash | | pkg2/tst.go:4:2:4:2 | g | github.com/github/codeql-go/ql/test/library-tests/semmle/go/Types/pkg2.G | g | | pkg2/tst.go:4:2:4:2 | g | github.com/github/codeql-go/ql/test/library-tests/semmle/go/Types/pkg2.T | g | | pkg2/tst.go:8:2:8:2 | g | github.com/github/codeql-go/ql/test/library-tests/semmle/go/Types/pkg2.G | g | | pkg2/tst.go:8:2:8:2 | g | github.com/github/codeql-go/ql/test/library-tests/semmle/go/Types/pkg2.T | g | +| pkg2/tst.go:17:2:17:8 | NCField | github.com/github/codeql-go/ql/test/library-tests/semmle/go/Types.EmbedsNameClash | NCField | +| pkg2/tst.go:17:2:17:8 | NCField | github.com/github/codeql-go/ql/test/library-tests/semmle/go/Types/pkg1.NameClash | NCField | +| pkg2/tst.go:17:2:17:8 | NCField | github.com/github/codeql-go/ql/test/library-tests/semmle/go/Types/pkg2.NameClash | NCField | | struct_tags.go:4:2:4:7 | field1 | github.com/github/codeql-go/ql/test/library-tests/semmle/go/Types.S1 | field1 | | struct_tags.go:5:2:5:7 | field2 | github.com/github/codeql-go/ql/test/library-tests/semmle/go/Types.S1 | field2 | | struct_tags.go:9:2:9:7 | field1 | github.com/github/codeql-go/ql/test/library-tests/semmle/go/Types.S2 | field1 | diff --git a/go/ql/test/library-tests/semmle/go/Types/Field_hasQualifiedName3.expected b/go/ql/test/library-tests/semmle/go/Types/Field_hasQualifiedName3.expected index 56176082d9a..03b93b37c74 100644 --- a/go/ql/test/library-tests/semmle/go/Types/Field_hasQualifiedName3.expected +++ b/go/ql/test/library-tests/semmle/go/Types/Field_hasQualifiedName3.expected @@ -18,10 +18,11 @@ | depth.go:19:2:19:2 | f | github.com/github/codeql-go/ql/test/library-tests/semmle/go/Types | c | f | | depth.go:19:2:19:2 | f | github.com/github/codeql-go/ql/test/library-tests/semmle/go/Types | d | f | | embedded.go:4:2:4:2 | A | github.com/github/codeql-go/ql/test/library-tests/semmle/go/Types | Baz | A | +| embedded.go:4:2:4:2 | A | github.com/github/codeql-go/ql/test/library-tests/semmle/go/Types | EmbedsBaz | A | | embedded.go:4:2:4:2 | A | github.com/github/codeql-go/ql/test/library-tests/semmle/go/Types | Qux | A | | embedded.go:8:3:8:5 | Baz | github.com/github/codeql-go/ql/test/library-tests/semmle/go/Types | Qux | Baz | -| embedded.go:13:2:13:4 | Qux | github.com/github/codeql-go/ql/test/library-tests/semmle/go/Types | EmbedsBaz | Qux | -| embedded.go:14:2:14:4 | Baz | github.com/github/codeql-go/ql/test/library-tests/semmle/go/Types | EmbedsBaz | Baz | +| embedded.go:12:2:12:4 | Qux | github.com/github/codeql-go/ql/test/library-tests/semmle/go/Types | EmbedsBaz | Qux | +| embedded.go:13:2:13:4 | Baz | github.com/github/codeql-go/ql/test/library-tests/semmle/go/Types | EmbedsBaz | Baz | | generic.go:4:2:4:11 | valueField | github.com/github/codeql-go/ql/test/library-tests/semmle/go/Types | GenericStruct1 | valueField | | generic.go:5:2:5:13 | pointerField | github.com/github/codeql-go/ql/test/library-tests/semmle/go/Types | GenericStruct1 | pointerField | | generic.go:6:2:6:11 | arrayField | github.com/github/codeql-go/ql/test/library-tests/semmle/go/Types | GenericStruct1 | arrayField | @@ -33,6 +34,7 @@ | generic.go:21:2:21:9 | mapField | github.com/github/codeql-go/ql/test/library-tests/semmle/go/Types | GenericStruct2 | mapField | | generic.go:25:2:25:12 | structField | github.com/github/codeql-go/ql/test/library-tests/semmle/go/Types | GenericStruct2b | structField | | generic.go:29:2:29:13 | pointerField | github.com/github/codeql-go/ql/test/library-tests/semmle/go/Types | CircularGenericStruct2 | pointerField | +| main.go:18:7:18:15 | NameClash | github.com/github/codeql-go/ql/test/library-tests/semmle/go/Types | EmbedsNameClash | NameClash | | pkg1/embedding.go:19:23:19:26 | base | github.com/github/codeql-go/ql/test/library-tests/semmle/go/Types/pkg1 | embedder | base | | pkg1/embedding.go:19:23:19:26 | base | github.com/github/codeql-go/ql/test/library-tests/semmle/go/Types/pkg1 | embedder2 | base | | pkg1/embedding.go:19:23:19:26 | base | github.com/github/codeql-go/ql/test/library-tests/semmle/go/Types/pkg1 | embedder3 | base | @@ -49,27 +51,31 @@ | pkg1/promotedStructs.go:14:2:14:7 | PField | github.com/github/codeql-go/ql/test/library-tests/semmle/go/Types/pkg1 | SEmbedP | PField | | pkg1/promotedStructs.go:22:22:22:22 | S | github.com/github/codeql-go/ql/test/library-tests/semmle/go/Types/pkg1 | SEmbedS | S | | pkg1/promotedStructs.go:25:22:25:22 | P | github.com/github/codeql-go/ql/test/library-tests/semmle/go/Types/pkg1 | SEmbedP | P | -| pkg1/tst.go:4:2:4:2 | f | github.com/github/codeql-go/ql/test/library-tests/semmle/go/Types/pkg1 | T | f | -| pkg1/tst.go:5:2:5:4 | Foo | github.com/github/codeql-go/ql/test/library-tests/semmle/go/Types/pkg1 | T | Foo | -| pkg1/tst.go:6:2:6:4 | Bar | github.com/github/codeql-go/ql/test/library-tests/semmle/go/Types/pkg1 | T | Bar | -| pkg1/tst.go:10:2:10:4 | Foo | github.com/github/codeql-go/ql/test/library-tests/semmle/go/Types/pkg1 | T2 | Foo | -| pkg1/tst.go:11:2:11:4 | Bar | github.com/github/codeql-go/ql/test/library-tests/semmle/go/Types/pkg1 | T2 | Bar | -| pkg1/tst.go:15:3:15:5 | Foo | github.com/github/codeql-go/ql/test/library-tests/semmle/go/Types/pkg1 | T3 | Foo | -| pkg1/tst.go:16:3:16:5 | Bar | github.com/github/codeql-go/ql/test/library-tests/semmle/go/Types/pkg1 | T3 | Bar | -| pkg1/tst.go:20:3:20:5 | Foo | github.com/github/codeql-go/ql/test/library-tests/semmle/go/Types/pkg1 | T4 | Foo | -| pkg1/tst.go:21:2:21:4 | Bar | github.com/github/codeql-go/ql/test/library-tests/semmle/go/Types/pkg1 | T4 | Bar | -| pkg1/tst.go:25:2:25:4 | val | github.com/github/codeql-go/ql/test/library-tests/semmle/go/Types/pkg1 | Foo | val | -| pkg1/tst.go:25:2:25:4 | val | github.com/github/codeql-go/ql/test/library-tests/semmle/go/Types/pkg1 | T | val | -| pkg1/tst.go:25:2:25:4 | val | github.com/github/codeql-go/ql/test/library-tests/semmle/go/Types/pkg1 | T3 | val | -| pkg1/tst.go:25:2:25:4 | val | github.com/github/codeql-go/ql/test/library-tests/semmle/go/Types/pkg1 | T4 | val | -| pkg1/tst.go:26:2:26:5 | flag | github.com/github/codeql-go/ql/test/library-tests/semmle/go/Types/pkg1 | Foo | flag | -| pkg1/tst.go:26:2:26:5 | flag | github.com/github/codeql-go/ql/test/library-tests/semmle/go/Types/pkg1 | T4 | flag | -| pkg1/tst.go:30:2:30:5 | flag | github.com/github/codeql-go/ql/test/library-tests/semmle/go/Types/pkg1 | Bar | flag | -| pkg1/tst.go:30:2:30:5 | flag | github.com/github/codeql-go/ql/test/library-tests/semmle/go/Types/pkg1 | T2 | flag | +| pkg1/tst.go:6:2:6:2 | f | github.com/github/codeql-go/ql/test/library-tests/semmle/go/Types/pkg1 | T | f | +| pkg1/tst.go:7:2:7:4 | Foo | github.com/github/codeql-go/ql/test/library-tests/semmle/go/Types/pkg1 | T | Foo | +| pkg1/tst.go:8:2:8:4 | Bar | github.com/github/codeql-go/ql/test/library-tests/semmle/go/Types/pkg1 | T | Bar | +| pkg1/tst.go:12:2:12:4 | Foo | github.com/github/codeql-go/ql/test/library-tests/semmle/go/Types/pkg1 | T2 | Foo | +| pkg1/tst.go:13:2:13:4 | Bar | github.com/github/codeql-go/ql/test/library-tests/semmle/go/Types/pkg1 | T2 | Bar | +| pkg1/tst.go:17:3:17:5 | Foo | github.com/github/codeql-go/ql/test/library-tests/semmle/go/Types/pkg1 | T3 | Foo | +| pkg1/tst.go:18:3:18:5 | Bar | github.com/github/codeql-go/ql/test/library-tests/semmle/go/Types/pkg1 | T3 | Bar | +| pkg1/tst.go:22:3:22:5 | Foo | github.com/github/codeql-go/ql/test/library-tests/semmle/go/Types/pkg1 | T4 | Foo | +| pkg1/tst.go:23:2:23:4 | Bar | github.com/github/codeql-go/ql/test/library-tests/semmle/go/Types/pkg1 | T4 | Bar | +| pkg1/tst.go:27:2:27:4 | val | github.com/github/codeql-go/ql/test/library-tests/semmle/go/Types/pkg1 | Foo | val | +| pkg1/tst.go:27:2:27:4 | val | github.com/github/codeql-go/ql/test/library-tests/semmle/go/Types/pkg1 | T | val | +| pkg1/tst.go:27:2:27:4 | val | github.com/github/codeql-go/ql/test/library-tests/semmle/go/Types/pkg1 | T3 | val | +| pkg1/tst.go:27:2:27:4 | val | github.com/github/codeql-go/ql/test/library-tests/semmle/go/Types/pkg1 | T4 | val | +| pkg1/tst.go:28:2:28:5 | flag | github.com/github/codeql-go/ql/test/library-tests/semmle/go/Types/pkg1 | Foo | flag | +| pkg1/tst.go:28:2:28:5 | flag | github.com/github/codeql-go/ql/test/library-tests/semmle/go/Types/pkg1 | T4 | flag | +| pkg1/tst.go:32:2:32:5 | flag | github.com/github/codeql-go/ql/test/library-tests/semmle/go/Types/pkg1 | Bar | flag | +| pkg1/tst.go:32:2:32:5 | flag | github.com/github/codeql-go/ql/test/library-tests/semmle/go/Types/pkg1 | T2 | flag | +| pkg1/tst.go:62:7:62:15 | NameClash | github.com/github/codeql-go/ql/test/library-tests/semmle/go/Types/pkg1 | NameClash | NameClash | | pkg2/tst.go:4:2:4:2 | g | github.com/github/codeql-go/ql/test/library-tests/semmle/go/Types/pkg2 | G | g | | pkg2/tst.go:4:2:4:2 | g | github.com/github/codeql-go/ql/test/library-tests/semmle/go/Types/pkg2 | T | g | | pkg2/tst.go:8:2:8:2 | g | github.com/github/codeql-go/ql/test/library-tests/semmle/go/Types/pkg2 | G | g | | pkg2/tst.go:8:2:8:2 | g | github.com/github/codeql-go/ql/test/library-tests/semmle/go/Types/pkg2 | T | g | +| pkg2/tst.go:17:2:17:8 | NCField | github.com/github/codeql-go/ql/test/library-tests/semmle/go/Types | EmbedsNameClash | NCField | +| pkg2/tst.go:17:2:17:8 | NCField | github.com/github/codeql-go/ql/test/library-tests/semmle/go/Types/pkg1 | NameClash | NCField | +| pkg2/tst.go:17:2:17:8 | NCField | github.com/github/codeql-go/ql/test/library-tests/semmle/go/Types/pkg2 | NameClash | NCField | | struct_tags.go:4:2:4:7 | field1 | github.com/github/codeql-go/ql/test/library-tests/semmle/go/Types | S1 | field1 | | struct_tags.go:5:2:5:7 | field2 | github.com/github/codeql-go/ql/test/library-tests/semmle/go/Types | S1 | field2 | | struct_tags.go:9:2:9:7 | field1 | github.com/github/codeql-go/ql/test/library-tests/semmle/go/Types | S2 | field1 | diff --git a/go/ql/test/library-tests/semmle/go/Types/ImplementsComparable.expected b/go/ql/test/library-tests/semmle/go/Types/ImplementsComparable.expected index 48de9172b36..e69de29bb2d 100644 --- a/go/ql/test/library-tests/semmle/go/Types/ImplementsComparable.expected +++ b/go/ql/test/library-tests/semmle/go/Types/ImplementsComparable.expected @@ -1,2 +0,0 @@ -failures -testFailures diff --git a/go/ql/test/library-tests/semmle/go/Types/MethodCount.expected b/go/ql/test/library-tests/semmle/go/Types/MethodCount.expected index 9d576b0f4f6..351b29c6222 100644 --- a/go/ql/test/library-tests/semmle/go/Types/MethodCount.expected +++ b/go/ql/test/library-tests/semmle/go/Types/MethodCount.expected @@ -1,4 +1,6 @@ +| * EmbedsNameClash | 1 | | * Foo | 1 | +| * NameClash | 1 | | * P | 1 | | * S | 1 | | * SEmbedP | 1 | @@ -19,10 +21,12 @@ | AExtended | 2 | | B | 2 | | C | 2 | +| EmbedsNameClash | 1 | | Foo | 1 | | GenericInterface | 1 | | MixedExportedAndNot | 2 | | MyInterface | 17 | +| NameClash | 1 | | S | 1 | | SEmbedS | 1 | | T | 1 | diff --git a/go/ql/test/library-tests/semmle/go/Types/MethodTypes.expected b/go/ql/test/library-tests/semmle/go/Types/MethodTypes.expected index 326debd2f80..d143fb3121e 100644 --- a/go/ql/test/library-tests/semmle/go/Types/MethodTypes.expected +++ b/go/ql/test/library-tests/semmle/go/Types/MethodTypes.expected @@ -30,6 +30,7 @@ | interface.go:95:6:95:8 | i18 | StringA | func() string | | interface.go:101:6:101:8 | i19 | StringB | func() string | | interface.go:105:6:105:8 | i20 | StringB | func() string | +| main.go:17:6:17:20 | EmbedsNameClash | NCMethod | func() | | pkg1/embedding.go:19:6:19:13 | embedder | f | func() int | | pkg1/embedding.go:22:6:22:16 | ptrembedder | f | func() int | | pkg1/embedding.go:22:6:22:16 | ptrembedder | g | func() int | @@ -51,8 +52,9 @@ | pkg1/interfaces.go:35:6:35:24 | MixedExportedAndNot | Exported | func() | | pkg1/interfaces.go:35:6:35:24 | MixedExportedAndNot | notExported | func() | | pkg1/promotedStructs.go:22:6:22:12 | SEmbedS | SMethod | func() interface { } | -| pkg1/tst.go:3:6:3:6 | T | half | func() Foo | -| pkg1/tst.go:14:6:14:7 | T3 | half | func() Foo | -| pkg1/tst.go:19:6:19:7 | T4 | half | func() Foo | +| pkg1/tst.go:5:6:5:6 | T | half | func() Foo | +| pkg1/tst.go:16:6:16:7 | T3 | half | func() Foo | +| pkg1/tst.go:21:6:21:7 | T4 | half | func() Foo | +| pkg1/tst.go:61:6:61:14 | NameClash | NCMethod | func() | | pkg2/tst.go:11:6:11:24 | MixedExportedAndNot | Exported | func() | | pkg2/tst.go:11:6:11:24 | MixedExportedAndNot | notExported | func() | diff --git a/go/ql/test/library-tests/semmle/go/Types/Method_hasQualifiedName2.expected b/go/ql/test/library-tests/semmle/go/Types/Method_hasQualifiedName2.expected index 1f893728e30..3929e1d98d5 100644 --- a/go/ql/test/library-tests/semmle/go/Types/Method_hasQualifiedName2.expected +++ b/go/ql/test/library-tests/semmle/go/Types/Method_hasQualifiedName2.expected @@ -59,9 +59,12 @@ | pkg1/promotedStructs.go:8:12:8:18 | SMethod | github.com/github/codeql-go/ql/test/library-tests/semmle/go/Types/pkg1.SEmbedS | SMethod | | pkg1/promotedStructs.go:17:13:17:19 | PMethod | github.com/github/codeql-go/ql/test/library-tests/semmle/go/Types/pkg1.P | PMethod | | pkg1/promotedStructs.go:17:13:17:19 | PMethod | github.com/github/codeql-go/ql/test/library-tests/semmle/go/Types/pkg1.SEmbedP | PMethod | -| pkg1/tst.go:33:16:33:19 | half | github.com/github/codeql-go/ql/test/library-tests/semmle/go/Types/pkg1.Foo | half | -| pkg1/tst.go:33:16:33:19 | half | github.com/github/codeql-go/ql/test/library-tests/semmle/go/Types/pkg1.T | half | -| pkg1/tst.go:33:16:33:19 | half | github.com/github/codeql-go/ql/test/library-tests/semmle/go/Types/pkg1.T3 | half | -| pkg1/tst.go:33:16:33:19 | half | github.com/github/codeql-go/ql/test/library-tests/semmle/go/Types/pkg1.T4 | half | +| pkg1/tst.go:35:16:35:19 | half | github.com/github/codeql-go/ql/test/library-tests/semmle/go/Types/pkg1.Foo | half | +| pkg1/tst.go:35:16:35:19 | half | github.com/github/codeql-go/ql/test/library-tests/semmle/go/Types/pkg1.T | half | +| pkg1/tst.go:35:16:35:19 | half | github.com/github/codeql-go/ql/test/library-tests/semmle/go/Types/pkg1.T3 | half | +| pkg1/tst.go:35:16:35:19 | half | github.com/github/codeql-go/ql/test/library-tests/semmle/go/Types/pkg1.T4 | half | | pkg2/tst.go:12:2:12:9 | Exported | github.com/github/codeql-go/ql/test/library-tests/semmle/go/Types/pkg2.MixedExportedAndNot | Exported | | pkg2/tst.go:13:2:13:12 | notExported | github.com/github/codeql-go/ql/test/library-tests/semmle/go/Types/pkg2.MixedExportedAndNot | notExported | +| pkg2/tst.go:20:20:20:27 | NCMethod | github.com/github/codeql-go/ql/test/library-tests/semmle/go/Types.EmbedsNameClash | NCMethod | +| pkg2/tst.go:20:20:20:27 | NCMethod | github.com/github/codeql-go/ql/test/library-tests/semmle/go/Types/pkg1.NameClash | NCMethod | +| pkg2/tst.go:20:20:20:27 | NCMethod | github.com/github/codeql-go/ql/test/library-tests/semmle/go/Types/pkg2.NameClash | NCMethod | diff --git a/go/ql/test/library-tests/semmle/go/Types/Method_hasQualifiedName3.expected b/go/ql/test/library-tests/semmle/go/Types/Method_hasQualifiedName3.expected index 59a298e4b5f..9699ba3f382 100644 --- a/go/ql/test/library-tests/semmle/go/Types/Method_hasQualifiedName3.expected +++ b/go/ql/test/library-tests/semmle/go/Types/Method_hasQualifiedName3.expected @@ -59,9 +59,12 @@ | pkg1/promotedStructs.go:8:12:8:18 | SMethod | github.com/github/codeql-go/ql/test/library-tests/semmle/go/Types/pkg1 | SEmbedS | SMethod | | pkg1/promotedStructs.go:17:13:17:19 | PMethod | github.com/github/codeql-go/ql/test/library-tests/semmle/go/Types/pkg1 | P | PMethod | | pkg1/promotedStructs.go:17:13:17:19 | PMethod | github.com/github/codeql-go/ql/test/library-tests/semmle/go/Types/pkg1 | SEmbedP | PMethod | -| pkg1/tst.go:33:16:33:19 | half | github.com/github/codeql-go/ql/test/library-tests/semmle/go/Types/pkg1 | Foo | half | -| pkg1/tst.go:33:16:33:19 | half | github.com/github/codeql-go/ql/test/library-tests/semmle/go/Types/pkg1 | T | half | -| pkg1/tst.go:33:16:33:19 | half | github.com/github/codeql-go/ql/test/library-tests/semmle/go/Types/pkg1 | T3 | half | -| pkg1/tst.go:33:16:33:19 | half | github.com/github/codeql-go/ql/test/library-tests/semmle/go/Types/pkg1 | T4 | half | +| pkg1/tst.go:35:16:35:19 | half | github.com/github/codeql-go/ql/test/library-tests/semmle/go/Types/pkg1 | Foo | half | +| pkg1/tst.go:35:16:35:19 | half | github.com/github/codeql-go/ql/test/library-tests/semmle/go/Types/pkg1 | T | half | +| pkg1/tst.go:35:16:35:19 | half | github.com/github/codeql-go/ql/test/library-tests/semmle/go/Types/pkg1 | T3 | half | +| pkg1/tst.go:35:16:35:19 | half | github.com/github/codeql-go/ql/test/library-tests/semmle/go/Types/pkg1 | T4 | half | | pkg2/tst.go:12:2:12:9 | Exported | github.com/github/codeql-go/ql/test/library-tests/semmle/go/Types/pkg2 | MixedExportedAndNot | Exported | | pkg2/tst.go:13:2:13:12 | notExported | github.com/github/codeql-go/ql/test/library-tests/semmle/go/Types/pkg2 | MixedExportedAndNot | notExported | +| pkg2/tst.go:20:20:20:27 | NCMethod | github.com/github/codeql-go/ql/test/library-tests/semmle/go/Types | EmbedsNameClash | NCMethod | +| pkg2/tst.go:20:20:20:27 | NCMethod | github.com/github/codeql-go/ql/test/library-tests/semmle/go/Types/pkg1 | NameClash | NCMethod | +| pkg2/tst.go:20:20:20:27 | NCMethod | github.com/github/codeql-go/ql/test/library-tests/semmle/go/Types/pkg2 | NameClash | NCMethod | diff --git a/go/ql/test/library-tests/semmle/go/Types/Methods.expected b/go/ql/test/library-tests/semmle/go/Types/Methods.expected index 2c17013c186..c75b336543a 100644 --- a/go/ql/test/library-tests/semmle/go/Types/Methods.expected +++ b/go/ql/test/library-tests/semmle/go/Types/Methods.expected @@ -1,11 +1,13 @@ -| * Foo | half | pkg1/tst.go:33:16:33:19 | half | +| * EmbedsNameClash | NCMethod | pkg2/tst.go:20:20:20:27 | NCMethod | +| * Foo | half | pkg1/tst.go:35:16:35:19 | half | +| * NameClash | NCMethod | pkg2/tst.go:20:20:20:27 | NCMethod | | * P | PMethod | pkg1/promotedStructs.go:17:13:17:19 | PMethod | | * S | SMethod | pkg1/promotedStructs.go:8:12:8:18 | SMethod | | * SEmbedP | PMethod | pkg1/promotedStructs.go:17:13:17:19 | PMethod | | * SEmbedS | SMethod | pkg1/promotedStructs.go:8:12:8:18 | SMethod | -| * T | half | pkg1/tst.go:33:16:33:19 | half | -| * T3 | half | pkg1/tst.go:33:16:33:19 | half | -| * T4 | half | pkg1/tst.go:33:16:33:19 | half | +| * T | half | pkg1/tst.go:35:16:35:19 | half | +| * T3 | half | pkg1/tst.go:35:16:35:19 | half | +| * T4 | half | pkg1/tst.go:35:16:35:19 | half | | * base | f | pkg1/embedding.go:10:13:10:13 | f | | * base | g | pkg1/embedding.go:14:14:14:14 | g | | * embedder | f | pkg1/embedding.go:10:13:10:13 | f | @@ -29,7 +31,8 @@ | B | n | pkg1/interfaces.go:9:2:9:2 | n | | C | n | pkg1/interfaces.go:13:2:13:2 | n | | C | o | pkg1/interfaces.go:14:2:14:2 | o | -| Foo | half | pkg1/tst.go:33:16:33:19 | half | +| EmbedsNameClash | NCMethod | pkg2/tst.go:20:20:20:27 | NCMethod | +| Foo | half | pkg1/tst.go:35:16:35:19 | half | | GenericInterface | GetT | generic.go:33:2:33:5 | GetT | | MixedExportedAndNot | Exported | pkg1/interfaces.go:36:2:36:9 | Exported | | MixedExportedAndNot | Exported | pkg2/tst.go:12:2:12:9 | Exported | @@ -52,11 +55,12 @@ | MyInterface | dummy18 | generic.go:62:2:62:8 | dummy18 | | MyInterface | dummy19 | generic.go:63:2:63:8 | dummy19 | | MyInterface | dummy20 | generic.go:64:2:64:8 | dummy20 | +| NameClash | NCMethod | pkg2/tst.go:20:20:20:27 | NCMethod | | S | SMethod | pkg1/promotedStructs.go:8:12:8:18 | SMethod | | SEmbedS | SMethod | pkg1/promotedStructs.go:8:12:8:18 | SMethod | -| T | half | pkg1/tst.go:33:16:33:19 | half | -| T3 | half | pkg1/tst.go:33:16:33:19 | half | -| T4 | half | pkg1/tst.go:33:16:33:19 | half | +| T | half | pkg1/tst.go:35:16:35:19 | half | +| T3 | half | pkg1/tst.go:35:16:35:19 | half | +| T4 | half | pkg1/tst.go:35:16:35:19 | half | | base | f | pkg1/embedding.go:10:13:10:13 | f | | embedder | f | pkg1/embedding.go:10:13:10:13 | f | | embedder2 | f | pkg1/embedding.go:10:13:10:13 | f | diff --git a/go/ql/test/library-tests/semmle/go/Types/QualifiedNames.expected b/go/ql/test/library-tests/semmle/go/Types/QualifiedNames.expected index 660209effbb..dd6e9021a4f 100644 --- a/go/ql/test/library-tests/semmle/go/Types/QualifiedNames.expected +++ b/go/ql/test/library-tests/semmle/go/Types/QualifiedNames.expected @@ -9,7 +9,7 @@ | depth.go:18:6:18:6 | d | github.com/github/codeql-go/ql/test/library-tests/semmle/go/Types.d | | embedded.go:3:6:3:8 | Baz | github.com/github/codeql-go/ql/test/library-tests/semmle/go/Types.Baz | | embedded.go:7:6:7:8 | Qux | github.com/github/codeql-go/ql/test/library-tests/semmle/go/Types.Qux | -| embedded.go:12:6:12:14 | EmbedsBaz | github.com/github/codeql-go/ql/test/library-tests/semmle/go/Types.EmbedsBaz | +| embedded.go:11:6:11:14 | EmbedsBaz | github.com/github/codeql-go/ql/test/library-tests/semmle/go/Types.EmbedsBaz | | generic.go:3:6:3:19 | GenericStruct1 | github.com/github/codeql-go/ql/test/library-tests/semmle/go/Types.GenericStruct1 | | generic.go:11:6:11:27 | CircularGenericStruct1 | github.com/github/codeql-go/ql/test/library-tests/semmle/go/Types.CircularGenericStruct1 | | generic.go:15:6:15:31 | UsesCircularGenericStruct1 | github.com/github/codeql-go/ql/test/library-tests/semmle/go/Types.UsesCircularGenericStruct1 | @@ -77,6 +77,7 @@ | interface.go:136:6:136:21 | testComparable21 | github.com/github/codeql-go/ql/test/library-tests/semmle/go/Types.testComparable21 | | interface.go:137:6:137:21 | testComparable22 | github.com/github/codeql-go/ql/test/library-tests/semmle/go/Types.testComparable22 | | interface.go:138:6:138:21 | testComparable23 | github.com/github/codeql-go/ql/test/library-tests/semmle/go/Types.testComparable23 | +| main.go:17:6:17:20 | EmbedsNameClash | github.com/github/codeql-go/ql/test/library-tests/semmle/go/Types.EmbedsNameClash | | pkg1/embedding.go:8:6:8:9 | base | github.com/github/codeql-go/ql/test/library-tests/semmle/go/Types/pkg1.base | | pkg1/embedding.go:19:6:19:13 | embedder | github.com/github/codeql-go/ql/test/library-tests/semmle/go/Types/pkg1.embedder | | pkg1/embedding.go:22:6:22:16 | ptrembedder | github.com/github/codeql-go/ql/test/library-tests/semmle/go/Types/pkg1.ptrembedder | @@ -95,14 +96,16 @@ | pkg1/promotedStructs.go:13:6:13:6 | P | github.com/github/codeql-go/ql/test/library-tests/semmle/go/Types/pkg1.P | | pkg1/promotedStructs.go:22:6:22:12 | SEmbedS | github.com/github/codeql-go/ql/test/library-tests/semmle/go/Types/pkg1.SEmbedS | | pkg1/promotedStructs.go:25:6:25:12 | SEmbedP | github.com/github/codeql-go/ql/test/library-tests/semmle/go/Types/pkg1.SEmbedP | -| pkg1/tst.go:3:6:3:6 | T | github.com/github/codeql-go/ql/test/library-tests/semmle/go/Types/pkg1.T | -| pkg1/tst.go:9:6:9:7 | T2 | github.com/github/codeql-go/ql/test/library-tests/semmle/go/Types/pkg1.T2 | -| pkg1/tst.go:14:6:14:7 | T3 | github.com/github/codeql-go/ql/test/library-tests/semmle/go/Types/pkg1.T3 | -| pkg1/tst.go:19:6:19:7 | T4 | github.com/github/codeql-go/ql/test/library-tests/semmle/go/Types/pkg1.T4 | -| pkg1/tst.go:24:6:24:8 | Foo | github.com/github/codeql-go/ql/test/library-tests/semmle/go/Types/pkg1.Foo | -| pkg1/tst.go:29:6:29:8 | Bar | github.com/github/codeql-go/ql/test/library-tests/semmle/go/Types/pkg1.Bar | +| pkg1/tst.go:5:6:5:6 | T | github.com/github/codeql-go/ql/test/library-tests/semmle/go/Types/pkg1.T | +| pkg1/tst.go:11:6:11:7 | T2 | github.com/github/codeql-go/ql/test/library-tests/semmle/go/Types/pkg1.T2 | +| pkg1/tst.go:16:6:16:7 | T3 | github.com/github/codeql-go/ql/test/library-tests/semmle/go/Types/pkg1.T3 | +| pkg1/tst.go:21:6:21:7 | T4 | github.com/github/codeql-go/ql/test/library-tests/semmle/go/Types/pkg1.T4 | +| pkg1/tst.go:26:6:26:8 | Foo | github.com/github/codeql-go/ql/test/library-tests/semmle/go/Types/pkg1.Foo | +| pkg1/tst.go:31:6:31:8 | Bar | github.com/github/codeql-go/ql/test/library-tests/semmle/go/Types/pkg1.Bar | +| pkg1/tst.go:61:6:61:14 | NameClash | github.com/github/codeql-go/ql/test/library-tests/semmle/go/Types/pkg1.NameClash | | pkg2/tst.go:3:6:3:6 | T | github.com/github/codeql-go/ql/test/library-tests/semmle/go/Types/pkg2.T | | pkg2/tst.go:7:6:7:6 | G | github.com/github/codeql-go/ql/test/library-tests/semmle/go/Types/pkg2.G | | pkg2/tst.go:11:6:11:24 | MixedExportedAndNot | github.com/github/codeql-go/ql/test/library-tests/semmle/go/Types/pkg2.MixedExportedAndNot | +| pkg2/tst.go:16:6:16:14 | NameClash | github.com/github/codeql-go/ql/test/library-tests/semmle/go/Types/pkg2.NameClash | | struct_tags.go:3:6:3:7 | S1 | github.com/github/codeql-go/ql/test/library-tests/semmle/go/Types.S1 | | struct_tags.go:8:6:8:7 | S2 | github.com/github/codeql-go/ql/test/library-tests/semmle/go/Types.S2 | diff --git a/go/ql/test/library-tests/semmle/go/Types/SignatureType_getNumParameter.expected b/go/ql/test/library-tests/semmle/go/Types/SignatureType_getNumParameter.expected index faedd5aa0de..5831152884b 100644 --- a/go/ql/test/library-tests/semmle/go/Types/SignatureType_getNumParameter.expected +++ b/go/ql/test/library-tests/semmle/go/Types/SignatureType_getNumParameter.expected @@ -4,18 +4,19 @@ | depth.go:22:1:25:1 | function declaration | 0 | | generic.go:70:1:72:1 | function declaration | 1 | | generic.go:74:1:80:1 | function declaration | 1 | -| main.go:5:1:5:30 | function declaration | 1 | -| main.go:7:1:9:1 | function declaration | 2 | -| main.go:11:1:11:14 | function declaration | 0 | +| main.go:9:1:9:30 | function declaration | 1 | +| main.go:11:1:13:1 | function declaration | 2 | +| main.go:15:1:15:14 | function declaration | 0 | | pkg1/embedding.go:10:1:12:1 | function declaration | 0 | | pkg1/embedding.go:14:1:16:1 | function declaration | 0 | | pkg1/embedding.go:30:1:32:1 | function declaration | 0 | | pkg1/embedding.go:40:1:61:1 | function declaration | 0 | | pkg1/promotedStructs.go:8:1:10:1 | function declaration | 0 | | pkg1/promotedStructs.go:17:1:19:1 | function declaration | 0 | -| pkg1/tst.go:33:1:35:1 | function declaration | 0 | -| pkg1/tst.go:37:1:37:26 | function declaration | 1 | -| pkg1/tst.go:39:1:57:1 | function declaration | 2 | +| pkg1/tst.go:35:1:37:1 | function declaration | 0 | +| pkg1/tst.go:39:1:39:26 | function declaration | 1 | +| pkg1/tst.go:41:1:59:1 | function declaration | 2 | +| pkg2/tst.go:20:1:20:32 | function declaration | 0 | | promoted.go:7:1:10:1 | function declaration | 1 | | promoted.go:12:1:15:1 | function declaration | 1 | | promoted.go:17:1:20:1 | function declaration | 1 | diff --git a/go/ql/test/library-tests/semmle/go/Types/SignatureType_getNumResult.expected b/go/ql/test/library-tests/semmle/go/Types/SignatureType_getNumResult.expected index 513ad56bd3c..960a272f73c 100644 --- a/go/ql/test/library-tests/semmle/go/Types/SignatureType_getNumResult.expected +++ b/go/ql/test/library-tests/semmle/go/Types/SignatureType_getNumResult.expected @@ -4,18 +4,19 @@ | depth.go:22:1:25:1 | function declaration | 0 | | generic.go:70:1:72:1 | function declaration | 1 | | generic.go:74:1:80:1 | function declaration | 0 | -| main.go:5:1:5:30 | function declaration | 0 | -| main.go:7:1:9:1 | function declaration | 2 | -| main.go:11:1:11:14 | function declaration | 0 | +| main.go:9:1:9:30 | function declaration | 0 | +| main.go:11:1:13:1 | function declaration | 2 | +| main.go:15:1:15:14 | function declaration | 0 | | pkg1/embedding.go:10:1:12:1 | function declaration | 1 | | pkg1/embedding.go:14:1:16:1 | function declaration | 1 | | pkg1/embedding.go:30:1:32:1 | function declaration | 1 | | pkg1/embedding.go:40:1:61:1 | function declaration | 0 | | pkg1/promotedStructs.go:8:1:10:1 | function declaration | 1 | | pkg1/promotedStructs.go:17:1:19:1 | function declaration | 1 | -| pkg1/tst.go:33:1:35:1 | function declaration | 1 | -| pkg1/tst.go:37:1:37:26 | function declaration | 0 | -| pkg1/tst.go:39:1:57:1 | function declaration | 0 | +| pkg1/tst.go:35:1:37:1 | function declaration | 1 | +| pkg1/tst.go:39:1:39:26 | function declaration | 0 | +| pkg1/tst.go:41:1:59:1 | function declaration | 0 | +| pkg2/tst.go:20:1:20:32 | function declaration | 0 | | promoted.go:7:1:10:1 | function declaration | 0 | | promoted.go:12:1:15:1 | function declaration | 0 | | promoted.go:17:1:20:1 | function declaration | 0 | diff --git a/go/ql/test/library-tests/semmle/go/Types/SignatureType_isVariadic.expected b/go/ql/test/library-tests/semmle/go/Types/SignatureType_isVariadic.expected index 48de9172b36..e69de29bb2d 100644 --- a/go/ql/test/library-tests/semmle/go/Types/SignatureType_isVariadic.expected +++ b/go/ql/test/library-tests/semmle/go/Types/SignatureType_isVariadic.expected @@ -1,2 +0,0 @@ -failures -testFailures diff --git a/go/ql/test/library-tests/semmle/go/Types/StructFields.expected b/go/ql/test/library-tests/semmle/go/Types/StructFields.expected index 502b4fa07ad..1757e0cdaf9 100644 --- a/go/ql/test/library-tests/semmle/go/Types/StructFields.expected +++ b/go/ql/test/library-tests/semmle/go/Types/StructFields.expected @@ -20,8 +20,9 @@ | embedded.go:3:6:3:8 | Baz | embedded.go:3:10:5:1 | struct type | A | string | | embedded.go:7:6:7:8 | Qux | embedded.go:7:10:9:1 | struct type | A | string | | embedded.go:7:6:7:8 | Qux | embedded.go:7:10:9:1 | struct type | Baz | * Baz | -| embedded.go:12:6:12:14 | EmbedsBaz | embedded.go:12:16:15:1 | struct type | Baz | string | -| embedded.go:12:6:12:14 | EmbedsBaz | embedded.go:12:16:15:1 | struct type | Qux | Qux | +| embedded.go:11:6:11:14 | EmbedsBaz | embedded.go:11:16:14:1 | struct type | A | string | +| embedded.go:11:6:11:14 | EmbedsBaz | embedded.go:11:16:14:1 | struct type | Baz | string | +| embedded.go:11:6:11:14 | EmbedsBaz | embedded.go:11:16:14:1 | struct type | Qux | Qux | | generic.go:3:6:3:19 | GenericStruct1 | generic.go:3:28:9:1 | struct type | arrayField | [10]T | | generic.go:3:6:3:19 | GenericStruct1 | generic.go:3:28:9:1 | struct type | mapField | [string]T | | generic.go:3:6:3:19 | GenericStruct1 | generic.go:3:28:9:1 | struct type | pointerField | * T | @@ -33,6 +34,8 @@ | generic.go:19:6:19:19 | GenericStruct2 | generic.go:19:42:22:1 | struct type | structField | GenericStruct1 | | generic.go:24:6:24:20 | GenericStruct2b | generic.go:24:39:26:1 | struct type | structField | GenericStruct2 | | generic.go:28:6:28:27 | CircularGenericStruct2 | generic.go:28:39:30:1 | struct type | pointerField | * CircularGenericStruct2 | +| main.go:17:6:17:20 | EmbedsNameClash | main.go:17:22:19:1 | struct type | NCField | string | +| main.go:17:6:17:20 | EmbedsNameClash | main.go:17:22:19:1 | struct type | NameClash | NameClash | | pkg1/embedding.go:19:6:19:13 | embedder | pkg1/embedding.go:19:15:19:28 | struct type | base | base | | pkg1/embedding.go:22:6:22:16 | ptrembedder | pkg1/embedding.go:22:18:22:32 | struct type | base | * base | | pkg1/embedding.go:25:6:25:14 | embedder2 | pkg1/embedding.go:25:16:25:33 | struct type | base | base | @@ -51,27 +54,30 @@ | pkg1/promotedStructs.go:22:6:22:12 | SEmbedS | pkg1/promotedStructs.go:22:14:22:24 | struct type | SField | string | | pkg1/promotedStructs.go:25:6:25:12 | SEmbedP | pkg1/promotedStructs.go:25:14:25:24 | struct type | P | P | | pkg1/promotedStructs.go:25:6:25:12 | SEmbedP | pkg1/promotedStructs.go:25:14:25:24 | struct type | PField | string | -| pkg1/tst.go:3:6:3:6 | T | pkg1/tst.go:3:8:7:1 | struct type | Bar | Bar | -| pkg1/tst.go:3:6:3:6 | T | pkg1/tst.go:3:8:7:1 | struct type | Foo | Foo | -| pkg1/tst.go:3:6:3:6 | T | pkg1/tst.go:3:8:7:1 | struct type | f | int | -| pkg1/tst.go:3:6:3:6 | T | pkg1/tst.go:3:8:7:1 | struct type | val | int | -| pkg1/tst.go:9:6:9:7 | T2 | pkg1/tst.go:9:9:12:1 | struct type | Bar | Bar | -| pkg1/tst.go:9:6:9:7 | T2 | pkg1/tst.go:9:9:12:1 | struct type | Foo | Foo | -| pkg1/tst.go:9:6:9:7 | T2 | pkg1/tst.go:9:9:12:1 | struct type | flag | bool | -| pkg1/tst.go:14:6:14:7 | T3 | pkg1/tst.go:14:9:17:1 | struct type | Bar | * Bar | -| pkg1/tst.go:14:6:14:7 | T3 | pkg1/tst.go:14:9:17:1 | struct type | Foo | * Foo | -| pkg1/tst.go:14:6:14:7 | T3 | pkg1/tst.go:14:9:17:1 | struct type | val | int | -| pkg1/tst.go:19:6:19:7 | T4 | pkg1/tst.go:19:9:22:1 | struct type | Bar | Bar | -| pkg1/tst.go:19:6:19:7 | T4 | pkg1/tst.go:19:9:22:1 | struct type | Foo | * Foo | -| pkg1/tst.go:19:6:19:7 | T4 | pkg1/tst.go:19:9:22:1 | struct type | flag | bool | -| pkg1/tst.go:19:6:19:7 | T4 | pkg1/tst.go:19:9:22:1 | struct type | val | int | -| pkg1/tst.go:24:6:24:8 | Foo | pkg1/tst.go:24:10:27:1 | struct type | flag | bool | -| pkg1/tst.go:24:6:24:8 | Foo | pkg1/tst.go:24:10:27:1 | struct type | val | int | -| pkg1/tst.go:29:6:29:8 | Bar | pkg1/tst.go:29:10:31:1 | struct type | flag | bool | +| pkg1/tst.go:5:6:5:6 | T | pkg1/tst.go:5:8:9:1 | struct type | Bar | Bar | +| pkg1/tst.go:5:6:5:6 | T | pkg1/tst.go:5:8:9:1 | struct type | Foo | Foo | +| pkg1/tst.go:5:6:5:6 | T | pkg1/tst.go:5:8:9:1 | struct type | f | int | +| pkg1/tst.go:5:6:5:6 | T | pkg1/tst.go:5:8:9:1 | struct type | val | int | +| pkg1/tst.go:11:6:11:7 | T2 | pkg1/tst.go:11:9:14:1 | struct type | Bar | Bar | +| pkg1/tst.go:11:6:11:7 | T2 | pkg1/tst.go:11:9:14:1 | struct type | Foo | Foo | +| pkg1/tst.go:11:6:11:7 | T2 | pkg1/tst.go:11:9:14:1 | struct type | flag | bool | +| pkg1/tst.go:16:6:16:7 | T3 | pkg1/tst.go:16:9:19:1 | struct type | Bar | * Bar | +| pkg1/tst.go:16:6:16:7 | T3 | pkg1/tst.go:16:9:19:1 | struct type | Foo | * Foo | +| pkg1/tst.go:16:6:16:7 | T3 | pkg1/tst.go:16:9:19:1 | struct type | val | int | +| pkg1/tst.go:21:6:21:7 | T4 | pkg1/tst.go:21:9:24:1 | struct type | Bar | Bar | +| pkg1/tst.go:21:6:21:7 | T4 | pkg1/tst.go:21:9:24:1 | struct type | Foo | * Foo | +| pkg1/tst.go:21:6:21:7 | T4 | pkg1/tst.go:21:9:24:1 | struct type | flag | bool | +| pkg1/tst.go:21:6:21:7 | T4 | pkg1/tst.go:21:9:24:1 | struct type | val | int | +| pkg1/tst.go:26:6:26:8 | Foo | pkg1/tst.go:26:10:29:1 | struct type | flag | bool | +| pkg1/tst.go:26:6:26:8 | Foo | pkg1/tst.go:26:10:29:1 | struct type | val | int | +| pkg1/tst.go:31:6:31:8 | Bar | pkg1/tst.go:31:10:33:1 | struct type | flag | bool | +| pkg1/tst.go:61:6:61:14 | NameClash | pkg1/tst.go:61:16:63:1 | struct type | NCField | string | +| pkg1/tst.go:61:6:61:14 | NameClash | pkg1/tst.go:61:16:63:1 | struct type | NameClash | NameClash | | pkg2/tst.go:3:6:3:6 | T | pkg2/tst.go:3:8:5:1 | struct type | g | int | | pkg2/tst.go:3:6:3:6 | T | pkg2/tst.go:7:8:9:1 | struct type | g | int | | pkg2/tst.go:7:6:7:6 | G | pkg2/tst.go:3:8:5:1 | struct type | g | int | | pkg2/tst.go:7:6:7:6 | G | pkg2/tst.go:7:8:9:1 | struct type | g | int | +| pkg2/tst.go:16:6:16:14 | NameClash | pkg2/tst.go:16:16:18:1 | struct type | NCField | string | | struct_tags.go:3:6:3:7 | S1 | struct_tags.go:3:9:6:1 | struct type | field1 | int | | struct_tags.go:3:6:3:7 | S1 | struct_tags.go:3:9:6:1 | struct type | field2 | int | | struct_tags.go:8:6:8:7 | S2 | struct_tags.go:8:9:11:1 | struct type | field1 | int | diff --git a/go/ql/test/library-tests/semmle/go/Types/Types.expected b/go/ql/test/library-tests/semmle/go/Types/Types.expected index 9c04442d7aa..ab34dd4d8ee 100644 --- a/go/ql/test/library-tests/semmle/go/Types/Types.expected +++ b/go/ql/test/library-tests/semmle/go/Types/Types.expected @@ -9,7 +9,7 @@ | depth.go:18:6:18:6 | d | d | | embedded.go:3:6:3:8 | Baz | Baz | | embedded.go:7:6:7:8 | Qux | Qux | -| embedded.go:12:6:12:14 | EmbedsBaz | EmbedsBaz | +| embedded.go:11:6:11:14 | EmbedsBaz | EmbedsBaz | | generic.go:3:6:3:19 | GenericStruct1 | GenericStruct1 | | generic.go:11:6:11:27 | CircularGenericStruct1 | CircularGenericStruct1 | | generic.go:15:6:15:31 | UsesCircularGenericStruct1 | UsesCircularGenericStruct1 | @@ -77,6 +77,7 @@ | interface.go:136:6:136:21 | testComparable21 | testComparable21 | | interface.go:137:6:137:21 | testComparable22 | testComparable22 | | interface.go:138:6:138:21 | testComparable23 | testComparable23 | +| main.go:17:6:17:20 | EmbedsNameClash | EmbedsNameClash | | pkg1/embedding.go:8:6:8:9 | base | base | | pkg1/embedding.go:19:6:19:13 | embedder | embedder | | pkg1/embedding.go:22:6:22:16 | ptrembedder | ptrembedder | @@ -95,14 +96,16 @@ | pkg1/promotedStructs.go:13:6:13:6 | P | P | | pkg1/promotedStructs.go:22:6:22:12 | SEmbedS | SEmbedS | | pkg1/promotedStructs.go:25:6:25:12 | SEmbedP | SEmbedP | -| pkg1/tst.go:3:6:3:6 | T | T | -| pkg1/tst.go:9:6:9:7 | T2 | T2 | -| pkg1/tst.go:14:6:14:7 | T3 | T3 | -| pkg1/tst.go:19:6:19:7 | T4 | T4 | -| pkg1/tst.go:24:6:24:8 | Foo | Foo | -| pkg1/tst.go:29:6:29:8 | Bar | Bar | +| pkg1/tst.go:5:6:5:6 | T | T | +| pkg1/tst.go:11:6:11:7 | T2 | T2 | +| pkg1/tst.go:16:6:16:7 | T3 | T3 | +| pkg1/tst.go:21:6:21:7 | T4 | T4 | +| pkg1/tst.go:26:6:26:8 | Foo | Foo | +| pkg1/tst.go:31:6:31:8 | Bar | Bar | +| pkg1/tst.go:61:6:61:14 | NameClash | NameClash | | pkg2/tst.go:3:6:3:6 | T | T | | pkg2/tst.go:7:6:7:6 | G | G | | pkg2/tst.go:11:6:11:24 | MixedExportedAndNot | MixedExportedAndNot | +| pkg2/tst.go:16:6:16:14 | NameClash | NameClash | | struct_tags.go:3:6:3:7 | S1 | S1 | | struct_tags.go:8:6:8:7 | S2 | S2 | diff --git a/go/ql/test/library-tests/semmle/go/Types/embedded.go b/go/ql/test/library-tests/semmle/go/Types/embedded.go index c9c2cf46c2b..413290dbf1a 100644 --- a/go/ql/test/library-tests/semmle/go/Types/embedded.go +++ b/go/ql/test/library-tests/semmle/go/Types/embedded.go @@ -8,7 +8,6 @@ type Qux struct { *Baz } -// EmbedsBaz should have a field A but does not type EmbedsBaz struct { Qux Baz string diff --git a/go/ql/test/library-tests/semmle/go/Types/main.go b/go/ql/test/library-tests/semmle/go/Types/main.go index 1c7e1684725..de11cbd152f 100644 --- a/go/ql/test/library-tests/semmle/go/Types/main.go +++ b/go/ql/test/library-tests/semmle/go/Types/main.go @@ -1,6 +1,10 @@ package main -import "regexp" +import ( + "regexp" + + "github.com/github/codeql-go/ql/test/library-tests/semmle/go/Types/pkg1" +) func test(r *regexp.Regexp) {} @@ -9,3 +13,7 @@ func swap(x int, y int) (int, int) { } func main() {} + +type EmbedsNameClash struct { + pkg1.NameClash +} diff --git a/go/ql/test/library-tests/semmle/go/Types/pkg1/tst.go b/go/ql/test/library-tests/semmle/go/Types/pkg1/tst.go index 1b1920ff33a..598e711ff2c 100644 --- a/go/ql/test/library-tests/semmle/go/Types/pkg1/tst.go +++ b/go/ql/test/library-tests/semmle/go/Types/pkg1/tst.go @@ -1,5 +1,7 @@ package pkg1 +import "github.com/github/codeql-go/ql/test/library-tests/semmle/go/Types/pkg2" + type T struct { f int Foo @@ -55,3 +57,7 @@ func test(t T, t2 T2) { // methods of T2 // illegal: t2.half() } + +type NameClash struct { + pkg2.NameClash +} diff --git a/go/ql/test/library-tests/semmle/go/Types/pkg2/tst.go b/go/ql/test/library-tests/semmle/go/Types/pkg2/tst.go index af91e514b77..d1634851b6b 100644 --- a/go/ql/test/library-tests/semmle/go/Types/pkg2/tst.go +++ b/go/ql/test/library-tests/semmle/go/Types/pkg2/tst.go @@ -12,3 +12,9 @@ type MixedExportedAndNot interface { Exported() notExported() } + +type NameClash struct { + NCField string +} + +func (t NameClash) NCMethod() {} diff --git a/go/ql/test/library-tests/semmle/go/concepts/HTTP/Handler.expected b/go/ql/test/library-tests/semmle/go/concepts/HTTP/Handler.expected index 48de9172b36..e69de29bb2d 100644 --- a/go/ql/test/library-tests/semmle/go/concepts/HTTP/Handler.expected +++ b/go/ql/test/library-tests/semmle/go/concepts/HTTP/Handler.expected @@ -1,2 +0,0 @@ -failures -testFailures diff --git a/go/ql/test/library-tests/semmle/go/concepts/LoggerCall/LoggerCall.expected b/go/ql/test/library-tests/semmle/go/concepts/LoggerCall/LoggerCall.expected index 105b7026d0c..42831abaf15 100644 --- a/go/ql/test/library-tests/semmle/go/concepts/LoggerCall/LoggerCall.expected +++ b/go/ql/test/library-tests/semmle/go/concepts/LoggerCall/LoggerCall.expected @@ -1,3 +1,2 @@ -failures invalidModelRow testFailures diff --git a/go/ql/test/library-tests/semmle/go/dataflow/ExternalFlowInheritance/mad_I1_subtypes_false.expected b/go/ql/test/library-tests/semmle/go/dataflow/ExternalFlowInheritance/mad_I1_subtypes_false.expected index db33d6d2504..55e9aed2e93 100644 --- a/go/ql/test/library-tests/semmle/go/dataflow/ExternalFlowInheritance/mad_I1_subtypes_false.expected +++ b/go/ql/test/library-tests/semmle/go/dataflow/ExternalFlowInheritance/mad_I1_subtypes_false.expected @@ -1,3 +1,2 @@ testFailures invalidModelRow -failures diff --git a/go/ql/test/library-tests/semmle/go/dataflow/ExternalFlowInheritance/mad_I1_subtypes_true.expected b/go/ql/test/library-tests/semmle/go/dataflow/ExternalFlowInheritance/mad_I1_subtypes_true.expected index db33d6d2504..55e9aed2e93 100644 --- a/go/ql/test/library-tests/semmle/go/dataflow/ExternalFlowInheritance/mad_I1_subtypes_true.expected +++ b/go/ql/test/library-tests/semmle/go/dataflow/ExternalFlowInheritance/mad_I1_subtypes_true.expected @@ -1,3 +1,2 @@ testFailures invalidModelRow -failures diff --git a/go/ql/test/library-tests/semmle/go/dataflow/ExternalFlowInheritance/mad_I2_subtypes_false.expected b/go/ql/test/library-tests/semmle/go/dataflow/ExternalFlowInheritance/mad_I2_subtypes_false.expected index db33d6d2504..55e9aed2e93 100644 --- a/go/ql/test/library-tests/semmle/go/dataflow/ExternalFlowInheritance/mad_I2_subtypes_false.expected +++ b/go/ql/test/library-tests/semmle/go/dataflow/ExternalFlowInheritance/mad_I2_subtypes_false.expected @@ -1,3 +1,2 @@ testFailures invalidModelRow -failures diff --git a/go/ql/test/library-tests/semmle/go/dataflow/ExternalFlowInheritance/mad_I2_subtypes_true.expected b/go/ql/test/library-tests/semmle/go/dataflow/ExternalFlowInheritance/mad_I2_subtypes_true.expected index db33d6d2504..55e9aed2e93 100644 --- a/go/ql/test/library-tests/semmle/go/dataflow/ExternalFlowInheritance/mad_I2_subtypes_true.expected +++ b/go/ql/test/library-tests/semmle/go/dataflow/ExternalFlowInheritance/mad_I2_subtypes_true.expected @@ -1,3 +1,2 @@ testFailures invalidModelRow -failures diff --git a/go/ql/test/library-tests/semmle/go/dataflow/ExternalFlowInheritance/mad_IEmbedI1_subtypes_true.expected b/go/ql/test/library-tests/semmle/go/dataflow/ExternalFlowInheritance/mad_IEmbedI1_subtypes_true.expected index db33d6d2504..55e9aed2e93 100644 --- a/go/ql/test/library-tests/semmle/go/dataflow/ExternalFlowInheritance/mad_IEmbedI1_subtypes_true.expected +++ b/go/ql/test/library-tests/semmle/go/dataflow/ExternalFlowInheritance/mad_IEmbedI1_subtypes_true.expected @@ -1,3 +1,2 @@ testFailures invalidModelRow -failures diff --git a/go/ql/test/library-tests/semmle/go/dataflow/ExternalFlowInheritance/mad_IEmbedI2_subtypes_true.expected b/go/ql/test/library-tests/semmle/go/dataflow/ExternalFlowInheritance/mad_IEmbedI2_subtypes_true.expected index db33d6d2504..55e9aed2e93 100644 --- a/go/ql/test/library-tests/semmle/go/dataflow/ExternalFlowInheritance/mad_IEmbedI2_subtypes_true.expected +++ b/go/ql/test/library-tests/semmle/go/dataflow/ExternalFlowInheritance/mad_IEmbedI2_subtypes_true.expected @@ -1,3 +1,2 @@ testFailures invalidModelRow -failures diff --git a/go/ql/test/library-tests/semmle/go/dataflow/ExternalFlowInheritance/mad_PImplEmbedI1_subtypes_true.expected b/go/ql/test/library-tests/semmle/go/dataflow/ExternalFlowInheritance/mad_PImplEmbedI1_subtypes_true.expected index db33d6d2504..55e9aed2e93 100644 --- a/go/ql/test/library-tests/semmle/go/dataflow/ExternalFlowInheritance/mad_PImplEmbedI1_subtypes_true.expected +++ b/go/ql/test/library-tests/semmle/go/dataflow/ExternalFlowInheritance/mad_PImplEmbedI1_subtypes_true.expected @@ -1,3 +1,2 @@ testFailures invalidModelRow -failures diff --git a/go/ql/test/library-tests/semmle/go/dataflow/ExternalFlowInheritance/mad_PImplEmbedI2_subtypes_true.expected b/go/ql/test/library-tests/semmle/go/dataflow/ExternalFlowInheritance/mad_PImplEmbedI2_subtypes_true.expected index db33d6d2504..55e9aed2e93 100644 --- a/go/ql/test/library-tests/semmle/go/dataflow/ExternalFlowInheritance/mad_PImplEmbedI2_subtypes_true.expected +++ b/go/ql/test/library-tests/semmle/go/dataflow/ExternalFlowInheritance/mad_PImplEmbedI2_subtypes_true.expected @@ -1,3 +1,2 @@ testFailures invalidModelRow -failures diff --git a/go/ql/test/library-tests/semmle/go/dataflow/ExternalFlowInheritance/mad_S1_subtypes_false.expected b/go/ql/test/library-tests/semmle/go/dataflow/ExternalFlowInheritance/mad_S1_subtypes_false.expected index db33d6d2504..55e9aed2e93 100644 --- a/go/ql/test/library-tests/semmle/go/dataflow/ExternalFlowInheritance/mad_S1_subtypes_false.expected +++ b/go/ql/test/library-tests/semmle/go/dataflow/ExternalFlowInheritance/mad_S1_subtypes_false.expected @@ -1,3 +1,2 @@ testFailures invalidModelRow -failures diff --git a/go/ql/test/library-tests/semmle/go/dataflow/ExternalFlowInheritance/mad_S1_subtypes_true.expected b/go/ql/test/library-tests/semmle/go/dataflow/ExternalFlowInheritance/mad_S1_subtypes_true.expected index db33d6d2504..55e9aed2e93 100644 --- a/go/ql/test/library-tests/semmle/go/dataflow/ExternalFlowInheritance/mad_S1_subtypes_true.expected +++ b/go/ql/test/library-tests/semmle/go/dataflow/ExternalFlowInheritance/mad_S1_subtypes_true.expected @@ -1,3 +1,2 @@ testFailures invalidModelRow -failures diff --git a/go/ql/test/library-tests/semmle/go/dataflow/ExternalFlowInheritance/mad_SEmbedI1_subtypes_true.expected b/go/ql/test/library-tests/semmle/go/dataflow/ExternalFlowInheritance/mad_SEmbedI1_subtypes_true.expected index db33d6d2504..55e9aed2e93 100644 --- a/go/ql/test/library-tests/semmle/go/dataflow/ExternalFlowInheritance/mad_SEmbedI1_subtypes_true.expected +++ b/go/ql/test/library-tests/semmle/go/dataflow/ExternalFlowInheritance/mad_SEmbedI1_subtypes_true.expected @@ -1,3 +1,2 @@ testFailures invalidModelRow -failures diff --git a/go/ql/test/library-tests/semmle/go/dataflow/ExternalFlowInheritance/mad_SEmbedI2_subtypes_true.expected b/go/ql/test/library-tests/semmle/go/dataflow/ExternalFlowInheritance/mad_SEmbedI2_subtypes_true.expected index db33d6d2504..55e9aed2e93 100644 --- a/go/ql/test/library-tests/semmle/go/dataflow/ExternalFlowInheritance/mad_SEmbedI2_subtypes_true.expected +++ b/go/ql/test/library-tests/semmle/go/dataflow/ExternalFlowInheritance/mad_SEmbedI2_subtypes_true.expected @@ -1,3 +1,2 @@ testFailures invalidModelRow -failures diff --git a/go/ql/test/library-tests/semmle/go/dataflow/ExternalFlowInheritance/mad_SEmbedP1_subtypes_true.expected b/go/ql/test/library-tests/semmle/go/dataflow/ExternalFlowInheritance/mad_SEmbedP1_subtypes_true.expected index db33d6d2504..55e9aed2e93 100644 --- a/go/ql/test/library-tests/semmle/go/dataflow/ExternalFlowInheritance/mad_SEmbedP1_subtypes_true.expected +++ b/go/ql/test/library-tests/semmle/go/dataflow/ExternalFlowInheritance/mad_SEmbedP1_subtypes_true.expected @@ -1,3 +1,2 @@ testFailures invalidModelRow -failures diff --git a/go/ql/test/library-tests/semmle/go/dataflow/ExternalFlowInheritance/mad_SEmbedP2_subtypes_true.expected b/go/ql/test/library-tests/semmle/go/dataflow/ExternalFlowInheritance/mad_SEmbedP2_subtypes_true.expected index db33d6d2504..55e9aed2e93 100644 --- a/go/ql/test/library-tests/semmle/go/dataflow/ExternalFlowInheritance/mad_SEmbedP2_subtypes_true.expected +++ b/go/ql/test/library-tests/semmle/go/dataflow/ExternalFlowInheritance/mad_SEmbedP2_subtypes_true.expected @@ -1,3 +1,2 @@ testFailures invalidModelRow -failures diff --git a/go/ql/test/library-tests/semmle/go/dataflow/ExternalFlowInheritance/mad_SEmbedPtrP1_subtypes_true.expected b/go/ql/test/library-tests/semmle/go/dataflow/ExternalFlowInheritance/mad_SEmbedPtrP1_subtypes_true.expected index db33d6d2504..55e9aed2e93 100644 --- a/go/ql/test/library-tests/semmle/go/dataflow/ExternalFlowInheritance/mad_SEmbedPtrP1_subtypes_true.expected +++ b/go/ql/test/library-tests/semmle/go/dataflow/ExternalFlowInheritance/mad_SEmbedPtrP1_subtypes_true.expected @@ -1,3 +1,2 @@ testFailures invalidModelRow -failures diff --git a/go/ql/test/library-tests/semmle/go/dataflow/ExternalFlowInheritance/mad_SEmbedPtrP2_subtypes_true.expected b/go/ql/test/library-tests/semmle/go/dataflow/ExternalFlowInheritance/mad_SEmbedPtrP2_subtypes_true.expected index db33d6d2504..55e9aed2e93 100644 --- a/go/ql/test/library-tests/semmle/go/dataflow/ExternalFlowInheritance/mad_SEmbedPtrP2_subtypes_true.expected +++ b/go/ql/test/library-tests/semmle/go/dataflow/ExternalFlowInheritance/mad_SEmbedPtrP2_subtypes_true.expected @@ -1,3 +1,2 @@ testFailures invalidModelRow -failures diff --git a/go/ql/test/library-tests/semmle/go/dataflow/ExternalFlowInheritance/mad_SEmbedPtrS1_subtypes_true.expected b/go/ql/test/library-tests/semmle/go/dataflow/ExternalFlowInheritance/mad_SEmbedPtrS1_subtypes_true.expected index db33d6d2504..55e9aed2e93 100644 --- a/go/ql/test/library-tests/semmle/go/dataflow/ExternalFlowInheritance/mad_SEmbedPtrS1_subtypes_true.expected +++ b/go/ql/test/library-tests/semmle/go/dataflow/ExternalFlowInheritance/mad_SEmbedPtrS1_subtypes_true.expected @@ -1,3 +1,2 @@ testFailures invalidModelRow -failures diff --git a/go/ql/test/library-tests/semmle/go/dataflow/ExternalFlowInheritance/mad_SEmbedPtrS2_subtypes_true.expected b/go/ql/test/library-tests/semmle/go/dataflow/ExternalFlowInheritance/mad_SEmbedPtrS2_subtypes_true.expected index db33d6d2504..55e9aed2e93 100644 --- a/go/ql/test/library-tests/semmle/go/dataflow/ExternalFlowInheritance/mad_SEmbedPtrS2_subtypes_true.expected +++ b/go/ql/test/library-tests/semmle/go/dataflow/ExternalFlowInheritance/mad_SEmbedPtrS2_subtypes_true.expected @@ -1,3 +1,2 @@ testFailures invalidModelRow -failures diff --git a/go/ql/test/library-tests/semmle/go/dataflow/ExternalFlowInheritance/mad_SEmbedS1_subtypes_true.expected b/go/ql/test/library-tests/semmle/go/dataflow/ExternalFlowInheritance/mad_SEmbedS1_subtypes_true.expected index db33d6d2504..55e9aed2e93 100644 --- a/go/ql/test/library-tests/semmle/go/dataflow/ExternalFlowInheritance/mad_SEmbedS1_subtypes_true.expected +++ b/go/ql/test/library-tests/semmle/go/dataflow/ExternalFlowInheritance/mad_SEmbedS1_subtypes_true.expected @@ -1,3 +1,2 @@ testFailures invalidModelRow -failures diff --git a/go/ql/test/library-tests/semmle/go/dataflow/ExternalFlowInheritance/mad_SEmbedS2_subtypes_true.expected b/go/ql/test/library-tests/semmle/go/dataflow/ExternalFlowInheritance/mad_SEmbedS2_subtypes_true.expected index db33d6d2504..55e9aed2e93 100644 --- a/go/ql/test/library-tests/semmle/go/dataflow/ExternalFlowInheritance/mad_SEmbedS2_subtypes_true.expected +++ b/go/ql/test/library-tests/semmle/go/dataflow/ExternalFlowInheritance/mad_SEmbedS2_subtypes_true.expected @@ -1,3 +1,2 @@ testFailures invalidModelRow -failures diff --git a/go/ql/test/library-tests/semmle/go/dataflow/ExternalFlowInheritance/mad_SImplEmbedI1_subtypes_true.expected b/go/ql/test/library-tests/semmle/go/dataflow/ExternalFlowInheritance/mad_SImplEmbedI1_subtypes_true.expected index db33d6d2504..55e9aed2e93 100644 --- a/go/ql/test/library-tests/semmle/go/dataflow/ExternalFlowInheritance/mad_SImplEmbedI1_subtypes_true.expected +++ b/go/ql/test/library-tests/semmle/go/dataflow/ExternalFlowInheritance/mad_SImplEmbedI1_subtypes_true.expected @@ -1,3 +1,2 @@ testFailures invalidModelRow -failures diff --git a/go/ql/test/library-tests/semmle/go/dataflow/ExternalFlowInheritance/mad_SImplEmbedI2_subtypes_true.expected b/go/ql/test/library-tests/semmle/go/dataflow/ExternalFlowInheritance/mad_SImplEmbedI2_subtypes_true.expected index db33d6d2504..55e9aed2e93 100644 --- a/go/ql/test/library-tests/semmle/go/dataflow/ExternalFlowInheritance/mad_SImplEmbedI2_subtypes_true.expected +++ b/go/ql/test/library-tests/semmle/go/dataflow/ExternalFlowInheritance/mad_SImplEmbedI2_subtypes_true.expected @@ -1,3 +1,2 @@ testFailures invalidModelRow -failures diff --git a/go/ql/test/library-tests/semmle/go/dataflow/ExternalFlowInheritance/mad_SImplEmbedS1_subtypes_true.expected b/go/ql/test/library-tests/semmle/go/dataflow/ExternalFlowInheritance/mad_SImplEmbedS1_subtypes_true.expected index db33d6d2504..55e9aed2e93 100644 --- a/go/ql/test/library-tests/semmle/go/dataflow/ExternalFlowInheritance/mad_SImplEmbedS1_subtypes_true.expected +++ b/go/ql/test/library-tests/semmle/go/dataflow/ExternalFlowInheritance/mad_SImplEmbedS1_subtypes_true.expected @@ -1,3 +1,2 @@ testFailures invalidModelRow -failures diff --git a/go/ql/test/library-tests/semmle/go/dataflow/ExternalFlowInheritance/mad_SImplEmbedS2_subtypes_true.expected b/go/ql/test/library-tests/semmle/go/dataflow/ExternalFlowInheritance/mad_SImplEmbedS2_subtypes_true.expected index db33d6d2504..55e9aed2e93 100644 --- a/go/ql/test/library-tests/semmle/go/dataflow/ExternalFlowInheritance/mad_SImplEmbedS2_subtypes_true.expected +++ b/go/ql/test/library-tests/semmle/go/dataflow/ExternalFlowInheritance/mad_SImplEmbedS2_subtypes_true.expected @@ -1,3 +1,2 @@ testFailures invalidModelRow -failures diff --git a/go/ql/test/library-tests/semmle/go/dataflow/ExternalFlowInheritance/ql_I1.expected b/go/ql/test/library-tests/semmle/go/dataflow/ExternalFlowInheritance/ql_I1.expected index db33d6d2504..55e9aed2e93 100644 --- a/go/ql/test/library-tests/semmle/go/dataflow/ExternalFlowInheritance/ql_I1.expected +++ b/go/ql/test/library-tests/semmle/go/dataflow/ExternalFlowInheritance/ql_I1.expected @@ -1,3 +1,2 @@ testFailures invalidModelRow -failures diff --git a/go/ql/test/library-tests/semmle/go/dataflow/ExternalFlowInheritance/ql_P1.expected b/go/ql/test/library-tests/semmle/go/dataflow/ExternalFlowInheritance/ql_P1.expected index db33d6d2504..55e9aed2e93 100644 --- a/go/ql/test/library-tests/semmle/go/dataflow/ExternalFlowInheritance/ql_P1.expected +++ b/go/ql/test/library-tests/semmle/go/dataflow/ExternalFlowInheritance/ql_P1.expected @@ -1,3 +1,2 @@ testFailures invalidModelRow -failures diff --git a/go/ql/test/library-tests/semmle/go/dataflow/ExternalFlowInheritance/ql_S1.expected b/go/ql/test/library-tests/semmle/go/dataflow/ExternalFlowInheritance/ql_S1.expected index db33d6d2504..55e9aed2e93 100644 --- a/go/ql/test/library-tests/semmle/go/dataflow/ExternalFlowInheritance/ql_S1.expected +++ b/go/ql/test/library-tests/semmle/go/dataflow/ExternalFlowInheritance/ql_S1.expected @@ -1,3 +1,2 @@ testFailures invalidModelRow -failures diff --git a/go/ql/test/library-tests/semmle/go/dataflow/ExternalFlowInheritance/test_fields.go b/go/ql/test/library-tests/semmle/go/dataflow/ExternalFlowInheritance/test_fields.go index 86d5828ce12..e58d937fae3 100644 --- a/go/ql/test/library-tests/semmle/go/dataflow/ExternalFlowInheritance/test_fields.go +++ b/go/ql/test/library-tests/semmle/go/dataflow/ExternalFlowInheritance/test_fields.go @@ -6,12 +6,12 @@ import ( func TestFieldsP1(t test.P1) { a := t.SourceField - t.SinkField = a // $ P1[f] P1[t] ql_P1 SPURIOUS: ql_S1 + t.SinkField = a // $ P1[f] P1[t] ql_P1 } func TestFieldsS1(t test.S1) { a := t.SourceField - t.SinkField = a // $ S1[f] S1[t] ql_S1 SPURIOUS: ql_P1 + t.SinkField = a // $ S1[f] S1[t] ql_S1 } func TestFieldsSEmbedI1(t test.SEmbedI1) { @@ -31,22 +31,22 @@ func TestFieldsPImplEmbedI1(t test.PImplEmbedI1) { func TestFieldsSEmbedP1(t test.SEmbedP1) { a := t.SourceField - t.SinkField = a // $ P1[t] SEmbedP1[t] ql_P1 SPURIOUS: ql_S1 + t.SinkField = a // $ P1[t] SEmbedP1[t] ql_P1 } func TestFieldsSEmbedS1(t test.SEmbedS1) { a := t.SourceField - t.SinkField = a // $ S1[t] SEmbedS1[t] ql_S1 SPURIOUS: ql_P1 + t.SinkField = a // $ S1[t] SEmbedS1[t] ql_S1 } func TestFieldsSEmbedPtrP1(t test.SEmbedPtrP1) { a := t.SourceField - t.SinkField = a // $ P1[t] SEmbedPtrP1[t] ql_P1 SPURIOUS: ql_S1 + t.SinkField = a // $ P1[t] SEmbedPtrP1[t] ql_P1 } func TestFieldsSEmbedPtrS1(t test.SEmbedPtrS1) { a := t.SourceField - t.SinkField = a // $ S1[t] SEmbedPtrS1[t] ql_S1 SPURIOUS: ql_P1 + t.SinkField = a // $ S1[t] SEmbedPtrS1[t] ql_S1 } func TestFieldsSImplEmbedS1(t test.SImplEmbedS1) { @@ -61,25 +61,25 @@ func TestFieldsSEmbedSEmbedI1(t test.SEmbedSEmbedI1) { func TestFieldsSEmbedSEmbedS1(t test.SEmbedSEmbedS1) { a := t.SourceField - t.SinkField = a // $ S1[t] SEmbedS1[t] ql_S1 SPURIOUS: ql_P1 + t.SinkField = a // $ S1[t] SEmbedS1[t] ql_S1 } func TestFieldsSEmbedSEmbedPtrS1(t test.SEmbedSEmbedPtrS1) { a := t.SourceField - t.SinkField = a // $ S1[t] SEmbedPtrS1[t] ql_S1 SPURIOUS: ql_P1 + t.SinkField = a // $ S1[t] SEmbedPtrS1[t] ql_S1 } func TestFieldsSEmbedPtrSEmbedS1(t test.SEmbedPtrSEmbedS1) { a := t.SourceField - t.SinkField = a // $ S1[t] SEmbedS1[t] ql_S1 SPURIOUS: ql_P1 + t.SinkField = a // $ S1[t] SEmbedS1[t] ql_S1 } func TestFieldsSEmbedPtrSEmbedPtrS1(t test.SEmbedPtrSEmbedPtrS1) { a := t.SourceField - t.SinkField = a // $ S1[t] SEmbedPtrS1[t] ql_S1 SPURIOUS: ql_P1 + t.SinkField = a // $ S1[t] SEmbedPtrS1[t] ql_S1 } func TestFieldsSEmbedS1AndSEmbedS1(t test.SEmbedS1AndSEmbedS1) { a := t.SourceField - t.SinkField = a // $ S1[t] ql_S1 SPURIOUS: ql_P1 + t.SinkField = a // $ S1[t] ql_S1 } diff --git a/go/ql/test/library-tests/semmle/go/dataflow/ExternalFlowInheritance/vendor/github.com/nonexistent/test/stub.go b/go/ql/test/library-tests/semmle/go/dataflow/ExternalFlowInheritance/vendor/github.com/nonexistent/test/stub.go index 093c24eab9d..663bb5fedde 100644 --- a/go/ql/test/library-tests/semmle/go/dataflow/ExternalFlowInheritance/vendor/github.com/nonexistent/test/stub.go +++ b/go/ql/test/library-tests/semmle/go/dataflow/ExternalFlowInheritance/vendor/github.com/nonexistent/test/stub.go @@ -17,8 +17,9 @@ type I2 interface { // A struct type implementing I1 type S1 struct { - SourceField string - SinkField string + SourceField string + SinkField string + UniqueFieldS1 int // this only exists to make this struct type different from other struct types } func (t S1) Source() interface{} { @@ -33,8 +34,9 @@ func (t S1) Step(val interface{}) interface{} { // A struct type whose pointer type implements I1 type P1 struct { - SourceField string - SinkField string + SourceField string + SinkField string + UniqueFieldP1 int // this only exists to make this struct type different from other struct types } func (t *P1) Source() interface{} { @@ -48,7 +50,9 @@ func (t *P1) Step(val interface{}) interface{} { } // A struct type implementing I2 -type S2 struct{} +type S2 struct { + UniqueFieldS2 int // this only exists to make this struct type different from other struct types +} func (t S2) Source() interface{} { return nil @@ -80,8 +84,9 @@ func (t *P2) ExtraMethodI2() {} // A struct type embedding I1 type SEmbedI1 struct { I1 - SourceField string - SinkField string + SourceField string + SinkField string + UniqueFieldSEmbedI1 int // this only exists to make this struct type different from other struct types } // A struct type embedding I2 @@ -103,8 +108,9 @@ type IEmbedI2 interface { // methods of the embedded field are not promoted. type SImplEmbedI1 struct { I1 - SourceField string - SinkField string + SourceField string + SinkField string + UniqueFieldSImplEmbedI1 int // this only exists to make this struct type different from other struct types } func (t SImplEmbedI1) Source() interface{} { @@ -119,7 +125,10 @@ func (t SImplEmbedI1) Step(val interface{}) interface{} { // A struct type embedding I2 and separately implementing its methods, so the // methods of the embedded field are not promoted. -type SImplEmbedI2 struct{ I2 } +type SImplEmbedI2 struct { + I2 + UniqueFieldSImplEmbedI2 int // this only exists to make this struct type different from other struct types +} func (t SImplEmbedI2) Source() interface{} { return nil @@ -137,8 +146,9 @@ func (t SImplEmbedI2) ExtraMethodI2() {} // pointer type, so the methods of the embedded field are not promoted. type PImplEmbedI1 struct { I1 - SourceField string - SinkField string + SourceField string + SinkField string + UniqueFieldPImplEmbedI1 int // this only exists to make this struct type different from other struct types } func (t *PImplEmbedI1) Source() interface{} { @@ -195,8 +205,9 @@ type SEmbedPtrP2 struct{ *P2 } // fields, so the methods and fields of the embedded field are not promoted. type SImplEmbedS1 struct { S1 - SourceField string - SinkField string + SourceField string + SinkField string + UniqueFieldSImplEmbedS1 int // this only exists to make this struct type different from other struct types } func (t *SImplEmbedS1) Source() interface{} { @@ -211,7 +222,10 @@ func (t *SImplEmbedS1) Step(val interface{}) interface{} { // A struct type embedding S2 and separately implementing I2's methods, so the // methods of the embedded field are not promoted. -type SImplEmbedS2 struct{ S2 } +type SImplEmbedS2 struct { + S2 + UniqueFieldSImplEmbedS2 int // this only exists to make this struct type different from other struct types +} func (t *SImplEmbedS2) Source() interface{} { return nil @@ -228,8 +242,9 @@ func (t *SImplEmbedS2) ExtraMethodI2() {} // A struct type embedding SEmbedI1 type SEmbedSEmbedI1 struct { SEmbedI1 - SourceField string - SinkField string + SourceField string + SinkField string + UniqueFieldSEmbedSEmbedI1 int // this only exists to make this struct type different from other struct types } // A struct type embedding SEmbedS1 @@ -248,4 +263,5 @@ type SEmbedPtrSEmbedPtrS1 struct{ *SEmbedPtrS1 } type SEmbedS1AndSEmbedS1 struct { S1 SEmbedS1 + UniqueFieldSEmbedS1AndSEmbedS1 int // this only exists to make this struct type different from other struct types } diff --git a/go/ql/test/library-tests/semmle/go/dataflow/PromotedMethods/DataFlowConfig.expected b/go/ql/test/library-tests/semmle/go/dataflow/PromotedMethods/DataFlowConfig.expected index 105b7026d0c..42831abaf15 100644 --- a/go/ql/test/library-tests/semmle/go/dataflow/PromotedMethods/DataFlowConfig.expected +++ b/go/ql/test/library-tests/semmle/go/dataflow/PromotedMethods/DataFlowConfig.expected @@ -1,3 +1,2 @@ -failures invalidModelRow testFailures diff --git a/go/ql/test/library-tests/semmle/go/dataflow/flowsources/local/environment/test.expected b/go/ql/test/library-tests/semmle/go/dataflow/flowsources/local/environment/test.expected index db33d6d2504..55e9aed2e93 100644 --- a/go/ql/test/library-tests/semmle/go/dataflow/flowsources/local/environment/test.expected +++ b/go/ql/test/library-tests/semmle/go/dataflow/flowsources/local/environment/test.expected @@ -1,3 +1,2 @@ testFailures invalidModelRow -failures diff --git a/go/ql/test/library-tests/semmle/go/dataflow/flowsources/local/file/test.expected b/go/ql/test/library-tests/semmle/go/dataflow/flowsources/local/file/test.expected index db33d6d2504..55e9aed2e93 100644 --- a/go/ql/test/library-tests/semmle/go/dataflow/flowsources/local/file/test.expected +++ b/go/ql/test/library-tests/semmle/go/dataflow/flowsources/local/file/test.expected @@ -1,3 +1,2 @@ testFailures invalidModelRow -failures diff --git a/go/ql/test/library-tests/semmle/go/dataflow/flowsources/local/stdin/source.expected b/go/ql/test/library-tests/semmle/go/dataflow/flowsources/local/stdin/source.expected index db33d6d2504..55e9aed2e93 100644 --- a/go/ql/test/library-tests/semmle/go/dataflow/flowsources/local/stdin/source.expected +++ b/go/ql/test/library-tests/semmle/go/dataflow/flowsources/local/stdin/source.expected @@ -1,3 +1,2 @@ testFailures invalidModelRow -failures diff --git a/go/ql/test/library-tests/semmle/go/frameworks/Afero/Query.expected b/go/ql/test/library-tests/semmle/go/frameworks/Afero/Query.expected index 08c5eee5289..42831abaf15 100644 --- a/go/ql/test/library-tests/semmle/go/frameworks/Afero/Query.expected +++ b/go/ql/test/library-tests/semmle/go/frameworks/Afero/Query.expected @@ -1,3 +1,2 @@ invalidModelRow testFailures -failures diff --git a/go/ql/test/library-tests/semmle/go/frameworks/BeegoOrm/QueryString.expected b/go/ql/test/library-tests/semmle/go/frameworks/BeegoOrm/QueryString.expected index 105b7026d0c..42831abaf15 100644 --- a/go/ql/test/library-tests/semmle/go/frameworks/BeegoOrm/QueryString.expected +++ b/go/ql/test/library-tests/semmle/go/frameworks/BeegoOrm/QueryString.expected @@ -1,3 +1,2 @@ -failures invalidModelRow testFailures diff --git a/go/ql/test/library-tests/semmle/go/frameworks/CouchbaseV1/test.expected b/go/ql/test/library-tests/semmle/go/frameworks/CouchbaseV1/test.expected index 105b7026d0c..42831abaf15 100644 --- a/go/ql/test/library-tests/semmle/go/frameworks/CouchbaseV1/test.expected +++ b/go/ql/test/library-tests/semmle/go/frameworks/CouchbaseV1/test.expected @@ -1,3 +1,2 @@ -failures invalidModelRow testFailures diff --git a/go/ql/test/library-tests/semmle/go/frameworks/ElazarlGoproxy/test.expected b/go/ql/test/library-tests/semmle/go/frameworks/ElazarlGoproxy/test.expected index 105b7026d0c..42831abaf15 100644 --- a/go/ql/test/library-tests/semmle/go/frameworks/ElazarlGoproxy/test.expected +++ b/go/ql/test/library-tests/semmle/go/frameworks/ElazarlGoproxy/test.expected @@ -1,3 +1,2 @@ -failures invalidModelRow testFailures diff --git a/go/ql/test/library-tests/semmle/go/frameworks/Fasthttp/EscapeFunction.expected b/go/ql/test/library-tests/semmle/go/frameworks/Fasthttp/EscapeFunction.expected index 8ec8033d086..e69de29bb2d 100644 --- a/go/ql/test/library-tests/semmle/go/frameworks/Fasthttp/EscapeFunction.expected +++ b/go/ql/test/library-tests/semmle/go/frameworks/Fasthttp/EscapeFunction.expected @@ -1,2 +0,0 @@ -testFailures -failures diff --git a/go/ql/test/library-tests/semmle/go/frameworks/Fasthttp/FileSystemAccess.expected b/go/ql/test/library-tests/semmle/go/frameworks/Fasthttp/FileSystemAccess.expected index 8ec8033d086..e69de29bb2d 100644 --- a/go/ql/test/library-tests/semmle/go/frameworks/Fasthttp/FileSystemAccess.expected +++ b/go/ql/test/library-tests/semmle/go/frameworks/Fasthttp/FileSystemAccess.expected @@ -1,2 +0,0 @@ -testFailures -failures diff --git a/go/ql/test/library-tests/semmle/go/frameworks/Fasthttp/OpenRedirect.expected b/go/ql/test/library-tests/semmle/go/frameworks/Fasthttp/OpenRedirect.expected index 8ec8033d086..e69de29bb2d 100644 --- a/go/ql/test/library-tests/semmle/go/frameworks/Fasthttp/OpenRedirect.expected +++ b/go/ql/test/library-tests/semmle/go/frameworks/Fasthttp/OpenRedirect.expected @@ -1,2 +0,0 @@ -testFailures -failures diff --git a/go/ql/test/library-tests/semmle/go/frameworks/Fasthttp/RemoteFlowSources.expected b/go/ql/test/library-tests/semmle/go/frameworks/Fasthttp/RemoteFlowSources.expected index 8ec8033d086..e69de29bb2d 100644 --- a/go/ql/test/library-tests/semmle/go/frameworks/Fasthttp/RemoteFlowSources.expected +++ b/go/ql/test/library-tests/semmle/go/frameworks/Fasthttp/RemoteFlowSources.expected @@ -1,2 +0,0 @@ -testFailures -failures diff --git a/go/ql/test/library-tests/semmle/go/frameworks/Fasthttp/SSRF.expected b/go/ql/test/library-tests/semmle/go/frameworks/Fasthttp/SSRF.expected index 8ec8033d086..e69de29bb2d 100644 --- a/go/ql/test/library-tests/semmle/go/frameworks/Fasthttp/SSRF.expected +++ b/go/ql/test/library-tests/semmle/go/frameworks/Fasthttp/SSRF.expected @@ -1,2 +0,0 @@ -testFailures -failures diff --git a/go/ql/test/library-tests/semmle/go/frameworks/Fasthttp/Xss.expected b/go/ql/test/library-tests/semmle/go/frameworks/Fasthttp/Xss.expected index 8ec8033d086..e69de29bb2d 100644 --- a/go/ql/test/library-tests/semmle/go/frameworks/Fasthttp/Xss.expected +++ b/go/ql/test/library-tests/semmle/go/frameworks/Fasthttp/Xss.expected @@ -1,2 +0,0 @@ -testFailures -failures diff --git a/go/ql/test/library-tests/semmle/go/frameworks/Fiber/Query.expected b/go/ql/test/library-tests/semmle/go/frameworks/Fiber/Query.expected index 105b7026d0c..42831abaf15 100644 --- a/go/ql/test/library-tests/semmle/go/frameworks/Fiber/Query.expected +++ b/go/ql/test/library-tests/semmle/go/frameworks/Fiber/Query.expected @@ -1,3 +1,2 @@ -failures invalidModelRow testFailures diff --git a/go/ql/test/library-tests/semmle/go/frameworks/GoKit/RemoteFlowSources.expected b/go/ql/test/library-tests/semmle/go/frameworks/GoKit/RemoteFlowSources.expected index 105b7026d0c..42831abaf15 100644 --- a/go/ql/test/library-tests/semmle/go/frameworks/GoKit/RemoteFlowSources.expected +++ b/go/ql/test/library-tests/semmle/go/frameworks/GoKit/RemoteFlowSources.expected @@ -1,3 +1,2 @@ -failures invalidModelRow testFailures diff --git a/go/ql/test/library-tests/semmle/go/frameworks/GoMicro/gomicro.expected b/go/ql/test/library-tests/semmle/go/frameworks/GoMicro/gomicro.expected index 105b7026d0c..42831abaf15 100644 --- a/go/ql/test/library-tests/semmle/go/frameworks/GoMicro/gomicro.expected +++ b/go/ql/test/library-tests/semmle/go/frameworks/GoMicro/gomicro.expected @@ -1,3 +1,2 @@ -failures invalidModelRow testFailures diff --git a/go/ql/test/library-tests/semmle/go/frameworks/Iris/Query.expected b/go/ql/test/library-tests/semmle/go/frameworks/Iris/Query.expected index 105b7026d0c..42831abaf15 100644 --- a/go/ql/test/library-tests/semmle/go/frameworks/Iris/Query.expected +++ b/go/ql/test/library-tests/semmle/go/frameworks/Iris/Query.expected @@ -1,3 +1,2 @@ -failures invalidModelRow testFailures diff --git a/go/ql/test/library-tests/semmle/go/frameworks/K8sIoClientGo/SecretInterfaceSource.expected b/go/ql/test/library-tests/semmle/go/frameworks/K8sIoClientGo/SecretInterfaceSource.expected index 105b7026d0c..42831abaf15 100644 --- a/go/ql/test/library-tests/semmle/go/frameworks/K8sIoClientGo/SecretInterfaceSource.expected +++ b/go/ql/test/library-tests/semmle/go/frameworks/K8sIoClientGo/SecretInterfaceSource.expected @@ -1,3 +1,2 @@ -failures invalidModelRow testFailures diff --git a/go/ql/test/library-tests/semmle/go/frameworks/Macaron/Sources.expected b/go/ql/test/library-tests/semmle/go/frameworks/Macaron/Sources.expected index 105b7026d0c..42831abaf15 100644 --- a/go/ql/test/library-tests/semmle/go/frameworks/Macaron/Sources.expected +++ b/go/ql/test/library-tests/semmle/go/frameworks/Macaron/Sources.expected @@ -1,3 +1,2 @@ -failures invalidModelRow testFailures diff --git a/go/ql/test/library-tests/semmle/go/frameworks/NoSQL/Query.expected b/go/ql/test/library-tests/semmle/go/frameworks/NoSQL/Query.expected index 105b7026d0c..42831abaf15 100644 --- a/go/ql/test/library-tests/semmle/go/frameworks/NoSQL/Query.expected +++ b/go/ql/test/library-tests/semmle/go/frameworks/NoSQL/Query.expected @@ -1,3 +1,2 @@ -failures invalidModelRow testFailures diff --git a/go/ql/test/library-tests/semmle/go/frameworks/Revel/test.expected b/go/ql/test/library-tests/semmle/go/frameworks/Revel/test.expected index 48de9172b36..e69de29bb2d 100644 --- a/go/ql/test/library-tests/semmle/go/frameworks/Revel/test.expected +++ b/go/ql/test/library-tests/semmle/go/frameworks/Revel/test.expected @@ -1,2 +0,0 @@ -failures -testFailures diff --git a/go/ql/test/library-tests/semmle/go/frameworks/SQL/Gorm/QueryString.expected b/go/ql/test/library-tests/semmle/go/frameworks/SQL/Gorm/QueryString.expected index db33d6d2504..55e9aed2e93 100644 --- a/go/ql/test/library-tests/semmle/go/frameworks/SQL/Gorm/QueryString.expected +++ b/go/ql/test/library-tests/semmle/go/frameworks/SQL/Gorm/QueryString.expected @@ -1,3 +1,2 @@ testFailures invalidModelRow -failures diff --git a/go/ql/test/library-tests/semmle/go/frameworks/SQL/QueryString.expected b/go/ql/test/library-tests/semmle/go/frameworks/SQL/QueryString.expected index 105b7026d0c..42831abaf15 100644 --- a/go/ql/test/library-tests/semmle/go/frameworks/SQL/QueryString.expected +++ b/go/ql/test/library-tests/semmle/go/frameworks/SQL/QueryString.expected @@ -1,3 +1,2 @@ -failures invalidModelRow testFailures diff --git a/go/ql/test/library-tests/semmle/go/frameworks/SQL/Sqlx/QueryString.expected b/go/ql/test/library-tests/semmle/go/frameworks/SQL/Sqlx/QueryString.expected index db33d6d2504..55e9aed2e93 100644 --- a/go/ql/test/library-tests/semmle/go/frameworks/SQL/Sqlx/QueryString.expected +++ b/go/ql/test/library-tests/semmle/go/frameworks/SQL/Sqlx/QueryString.expected @@ -1,3 +1,2 @@ testFailures invalidModelRow -failures diff --git a/go/ql/test/library-tests/semmle/go/frameworks/SQL/bun/QueryString.expected b/go/ql/test/library-tests/semmle/go/frameworks/SQL/bun/QueryString.expected index 105b7026d0c..42831abaf15 100644 --- a/go/ql/test/library-tests/semmle/go/frameworks/SQL/bun/QueryString.expected +++ b/go/ql/test/library-tests/semmle/go/frameworks/SQL/bun/QueryString.expected @@ -1,3 +1,2 @@ -failures invalidModelRow testFailures diff --git a/go/ql/test/library-tests/semmle/go/frameworks/SQL/gogf/QueryString.expected b/go/ql/test/library-tests/semmle/go/frameworks/SQL/gogf/QueryString.expected index db33d6d2504..55e9aed2e93 100644 --- a/go/ql/test/library-tests/semmle/go/frameworks/SQL/gogf/QueryString.expected +++ b/go/ql/test/library-tests/semmle/go/frameworks/SQL/gogf/QueryString.expected @@ -1,3 +1,2 @@ testFailures invalidModelRow -failures diff --git a/go/ql/test/library-tests/semmle/go/frameworks/SQL/gorqlite/QueryString.expected b/go/ql/test/library-tests/semmle/go/frameworks/SQL/gorqlite/QueryString.expected index db33d6d2504..55e9aed2e93 100644 --- a/go/ql/test/library-tests/semmle/go/frameworks/SQL/gorqlite/QueryString.expected +++ b/go/ql/test/library-tests/semmle/go/frameworks/SQL/gorqlite/QueryString.expected @@ -1,3 +1,2 @@ testFailures invalidModelRow -failures diff --git a/go/ql/test/library-tests/semmle/go/frameworks/StdlibTaintFlow/test.expected b/go/ql/test/library-tests/semmle/go/frameworks/StdlibTaintFlow/test.expected index 105b7026d0c..42831abaf15 100644 --- a/go/ql/test/library-tests/semmle/go/frameworks/StdlibTaintFlow/test.expected +++ b/go/ql/test/library-tests/semmle/go/frameworks/StdlibTaintFlow/test.expected @@ -1,3 +1,2 @@ -failures invalidModelRow testFailures diff --git a/go/ql/test/library-tests/semmle/go/frameworks/Yaml/tests.expected b/go/ql/test/library-tests/semmle/go/frameworks/Yaml/tests.expected index 105b7026d0c..42831abaf15 100644 --- a/go/ql/test/library-tests/semmle/go/frameworks/Yaml/tests.expected +++ b/go/ql/test/library-tests/semmle/go/frameworks/Yaml/tests.expected @@ -1,3 +1,2 @@ -failures invalidModelRow testFailures diff --git a/go/ql/test/library-tests/semmle/go/frameworks/gqlgen/gqlgen.expected b/go/ql/test/library-tests/semmle/go/frameworks/gqlgen/gqlgen.expected index 105b7026d0c..42831abaf15 100644 --- a/go/ql/test/library-tests/semmle/go/frameworks/gqlgen/gqlgen.expected +++ b/go/ql/test/library-tests/semmle/go/frameworks/gqlgen/gqlgen.expected @@ -1,3 +1,2 @@ -failures invalidModelRow testFailures diff --git a/go/ql/test/query-tests/Security/CWE-681/IncorrectIntegerConversion.expected b/go/ql/test/query-tests/Security/CWE-681/IncorrectIntegerConversion.expected index 105b7026d0c..42831abaf15 100644 --- a/go/ql/test/query-tests/Security/CWE-681/IncorrectIntegerConversion.expected +++ b/go/ql/test/query-tests/Security/CWE-681/IncorrectIntegerConversion.expected @@ -1,3 +1,2 @@ -failures invalidModelRow testFailures diff --git a/java/ql/automodel/src/CHANGELOG.md b/java/ql/automodel/src/CHANGELOG.md index 148791b5923..1564285b44b 100644 --- a/java/ql/automodel/src/CHANGELOG.md +++ b/java/ql/automodel/src/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.0.12 + +No user-facing changes. + ## 1.0.11 No user-facing changes. diff --git a/java/ql/automodel/src/change-notes/released/1.0.12.md b/java/ql/automodel/src/change-notes/released/1.0.12.md new file mode 100644 index 00000000000..12b3cf3e18f --- /dev/null +++ b/java/ql/automodel/src/change-notes/released/1.0.12.md @@ -0,0 +1,3 @@ +## 1.0.12 + +No user-facing changes. diff --git a/java/ql/integration-tests/kotlin/all-platforms/default-parameter-mad-flow/test.expected b/java/ql/integration-tests/kotlin/all-platforms/default-parameter-mad-flow/test.expected index 8ec8033d086..e69de29bb2d 100644 --- a/java/ql/integration-tests/kotlin/all-platforms/default-parameter-mad-flow/test.expected +++ b/java/ql/integration-tests/kotlin/all-platforms/default-parameter-mad-flow/test.expected @@ -1,2 +0,0 @@ -testFailures -failures diff --git a/java/ql/lib/CHANGELOG.md b/java/ql/lib/CHANGELOG.md index cddb86232c4..09ee80087e8 100644 --- a/java/ql/lib/CHANGELOG.md +++ b/java/ql/lib/CHANGELOG.md @@ -1,3 +1,19 @@ +## 5.0.0 + +### Breaking Changes + +* Deleted the old deprecated data flow API that was based on extending a configuration class. See https://github.blog/changelog/2023-08-14-new-dataflow-api-for-writing-custom-codeql-queries for instructions on migrating your queries to use the new API. + +### Minor Analysis Improvements + +* Calling `coll.contains(x)` is now a taint sanitizer (for any query) for the value `x`, where `coll` is a collection of constants. + +## 4.2.1 + +### Minor Analysis Improvements + +* In a switch statement with a constant switch expression, all non-matching cases were being marked as unreachable, including those that can be reached by falling through from the matching case. This has now been fixed. + ## 4.2.0 ### Major Analysis Improvements diff --git a/java/ql/lib/change-notes/2024-11-04-list-of-constants-sanitizer.md b/java/ql/lib/change-notes/2024-11-04-list-of-constants-sanitizer.md deleted file mode 100644 index dea1e7ff81e..00000000000 --- a/java/ql/lib/change-notes/2024-11-04-list-of-constants-sanitizer.md +++ /dev/null @@ -1,4 +0,0 @@ ---- -category: minorAnalysis ---- -* Calling `coll.contains(x)` is now a taint sanitizer (for any query) for the value `x`, where `coll` is a collection of constants. diff --git a/java/ql/lib/change-notes/2024-12-04-dataflow-type-pruning-tweak.md b/java/ql/lib/change-notes/2024-12-04-dataflow-type-pruning-tweak.md new file mode 100644 index 00000000000..258c0e5326b --- /dev/null +++ b/java/ql/lib/change-notes/2024-12-04-dataflow-type-pruning-tweak.md @@ -0,0 +1,4 @@ +--- +category: minorAnalysis +--- +* The data flow library has been updated to track types in a slightly different way: The type of the tainted data (which may be stored into fields, etc.) is tracked more precisely, while the types of intermediate containers for nested contents is tracked less precisely. This may have a slight effect on false positives for complex flow paths. diff --git a/java/ql/lib/change-notes/2024-11-14-unreachable-basic-block-in-constant-switch-statement.md b/java/ql/lib/change-notes/released/4.2.1.md similarity index 83% rename from java/ql/lib/change-notes/2024-11-14-unreachable-basic-block-in-constant-switch-statement.md rename to java/ql/lib/change-notes/released/4.2.1.md index 50df55a4c1a..6fb31df9177 100644 --- a/java/ql/lib/change-notes/2024-11-14-unreachable-basic-block-in-constant-switch-statement.md +++ b/java/ql/lib/change-notes/released/4.2.1.md @@ -1,4 +1,5 @@ ---- -category: minorAnalysis ---- +## 4.2.1 + +### Minor Analysis Improvements + * In a switch statement with a constant switch expression, all non-matching cases were being marked as unreachable, including those that can be reached by falling through from the matching case. This has now been fixed. diff --git a/java/ql/lib/change-notes/released/5.0.0.md b/java/ql/lib/change-notes/released/5.0.0.md new file mode 100644 index 00000000000..9d9e2bc61b5 --- /dev/null +++ b/java/ql/lib/change-notes/released/5.0.0.md @@ -0,0 +1,9 @@ +## 5.0.0 + +### Breaking Changes + +* Deleted the old deprecated data flow API that was based on extending a configuration class. See https://github.blog/changelog/2023-08-14-new-dataflow-api-for-writing-custom-codeql-queries for instructions on migrating your queries to use the new API. + +### Minor Analysis Improvements + +* Calling `coll.contains(x)` is now a taint sanitizer (for any query) for the value `x`, where `coll` is a collection of constants. diff --git a/java/ql/lib/codeql-pack.release.yml b/java/ql/lib/codeql-pack.release.yml index 9fc6933b429..c9e54136ca5 100644 --- a/java/ql/lib/codeql-pack.release.yml +++ b/java/ql/lib/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 4.2.0 +lastReleaseVersion: 5.0.0 diff --git a/java/ql/lib/qlpack.yml b/java/ql/lib/qlpack.yml index cc639056e4e..f892ca1c450 100644 --- a/java/ql/lib/qlpack.yml +++ b/java/ql/lib/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/java-all -version: 4.2.1-dev +version: 5.0.1-dev groups: java dbscheme: config/semmlecode.dbscheme extractor: java diff --git a/java/ql/lib/semmle/code/java/dataflow/DataFlow.qll b/java/ql/lib/semmle/code/java/dataflow/DataFlow.qll index 66a7a847c33..ab48577c02e 100644 --- a/java/ql/lib/semmle/code/java/dataflow/DataFlow.qll +++ b/java/ql/lib/semmle/code/java/dataflow/DataFlow.qll @@ -9,5 +9,5 @@ module DataFlow { private import semmle.code.java.dataflow.internal.DataFlowImplSpecific private import codeql.dataflow.DataFlow import DataFlowMake - import semmle.code.java.dataflow.internal.DataFlowImpl1 + import Public } diff --git a/java/ql/lib/semmle/code/java/dataflow/DataFlow2.qll b/java/ql/lib/semmle/code/java/dataflow/DataFlow2.qll deleted file mode 100644 index 92003314778..00000000000 --- a/java/ql/lib/semmle/code/java/dataflow/DataFlow2.qll +++ /dev/null @@ -1,10 +0,0 @@ -/** - * Provides classes for performing local (intra-procedural) and - * global (inter-procedural) data flow analyses. - */ - -import java - -module DataFlow2 { - import semmle.code.java.dataflow.internal.DataFlowImpl2 -} diff --git a/java/ql/lib/semmle/code/java/dataflow/DataFlow3.qll b/java/ql/lib/semmle/code/java/dataflow/DataFlow3.qll deleted file mode 100644 index c8d614e0879..00000000000 --- a/java/ql/lib/semmle/code/java/dataflow/DataFlow3.qll +++ /dev/null @@ -1,10 +0,0 @@ -/** - * Provides classes for performing local (intra-procedural) and - * global (inter-procedural) data flow analyses. - */ - -import java - -module DataFlow3 { - import semmle.code.java.dataflow.internal.DataFlowImpl3 -} diff --git a/java/ql/lib/semmle/code/java/dataflow/DataFlow4.qll b/java/ql/lib/semmle/code/java/dataflow/DataFlow4.qll deleted file mode 100644 index 852cfd9f813..00000000000 --- a/java/ql/lib/semmle/code/java/dataflow/DataFlow4.qll +++ /dev/null @@ -1,10 +0,0 @@ -/** - * Provides classes for performing local (intra-procedural) and - * global (inter-procedural) data flow analyses. - */ - -import java - -module DataFlow4 { - import semmle.code.java.dataflow.internal.DataFlowImpl4 -} diff --git a/java/ql/lib/semmle/code/java/dataflow/DataFlow5.qll b/java/ql/lib/semmle/code/java/dataflow/DataFlow5.qll deleted file mode 100644 index f8986a03524..00000000000 --- a/java/ql/lib/semmle/code/java/dataflow/DataFlow5.qll +++ /dev/null @@ -1,10 +0,0 @@ -/** - * Provides classes for performing local (intra-procedural) and - * global (inter-procedural) data flow analyses. - */ - -import java - -module DataFlow5 { - import semmle.code.java.dataflow.internal.DataFlowImpl5 -} diff --git a/java/ql/lib/semmle/code/java/dataflow/DataFlow6.qll b/java/ql/lib/semmle/code/java/dataflow/DataFlow6.qll deleted file mode 100644 index 28fa11da475..00000000000 --- a/java/ql/lib/semmle/code/java/dataflow/DataFlow6.qll +++ /dev/null @@ -1,10 +0,0 @@ -/** - * Provides classes for performing local (intra-procedural) and - * global (inter-procedural) data flow analyses. - */ - -import java - -module DataFlow6 { - import semmle.code.java.dataflow.internal.DataFlowImpl6 -} diff --git a/java/ql/lib/semmle/code/java/dataflow/TaintTracking.qll b/java/ql/lib/semmle/code/java/dataflow/TaintTracking.qll index ed13837a312..e62850fbc38 100644 --- a/java/ql/lib/semmle/code/java/dataflow/TaintTracking.qll +++ b/java/ql/lib/semmle/code/java/dataflow/TaintTracking.qll @@ -4,14 +4,12 @@ */ import semmle.code.java.dataflow.DataFlow -import semmle.code.java.dataflow.DataFlow2 import semmle.code.java.dataflow.internal.TaintTrackingUtil::StringBuilderVarModule module TaintTracking { - import semmle.code.java.dataflow.internal.tainttracking1.TaintTrackingParameter::Public + import semmle.code.java.dataflow.internal.TaintTrackingUtil private import semmle.code.java.dataflow.internal.DataFlowImplSpecific private import semmle.code.java.dataflow.internal.TaintTrackingImplSpecific private import codeql.dataflow.TaintTracking import TaintFlowMake - import semmle.code.java.dataflow.internal.tainttracking1.TaintTrackingImpl } diff --git a/java/ql/lib/semmle/code/java/dataflow/TaintTracking2.qll b/java/ql/lib/semmle/code/java/dataflow/TaintTracking2.qll deleted file mode 100644 index abd909dba2b..00000000000 --- a/java/ql/lib/semmle/code/java/dataflow/TaintTracking2.qll +++ /dev/null @@ -1,7 +0,0 @@ -/** - * Provides classes for performing local (intra-procedural) and - * global (inter-procedural) taint-tracking analyses. - */ -module TaintTracking2 { - import semmle.code.java.dataflow.internal.tainttracking2.TaintTrackingImpl -} diff --git a/java/ql/lib/semmle/code/java/dataflow/TaintTracking3.qll b/java/ql/lib/semmle/code/java/dataflow/TaintTracking3.qll deleted file mode 100644 index 49c43ed1418..00000000000 --- a/java/ql/lib/semmle/code/java/dataflow/TaintTracking3.qll +++ /dev/null @@ -1,7 +0,0 @@ -/** - * Provides classes for performing local (intra-procedural) and - * global (inter-procedural) taint-tracking analyses. - */ -module TaintTracking3 { - import semmle.code.java.dataflow.internal.tainttracking3.TaintTrackingImpl -} diff --git a/java/ql/lib/semmle/code/java/dataflow/internal/DataFlowImpl1.qll b/java/ql/lib/semmle/code/java/dataflow/internal/DataFlowImpl1.qll deleted file mode 100644 index 17def0c431d..00000000000 --- a/java/ql/lib/semmle/code/java/dataflow/internal/DataFlowImpl1.qll +++ /dev/null @@ -1,361 +0,0 @@ -/** - * DEPRECATED: Use `Global` and `GlobalWithState` instead. - * - * Provides a `Configuration` class backwards-compatible interface to the data - * flow library. - */ - -private import DataFlowImplCommon -private import DataFlowImplSpecific::Private -import DataFlowImplSpecific::Public -private import DataFlowImpl -import DataFlowImplCommonPublic -deprecated import FlowStateString -private import codeql.util.Unit - -/** - * DEPRECATED: Use `Global` and `GlobalWithState` instead. - * - * A configuration of interprocedural data flow analysis. This defines - * sources, sinks, and any other configurable aspect of the analysis. Each - * use of the global data flow library must define its own unique extension - * of this abstract class. To create a configuration, extend this class with - * a subclass whose characteristic predicate is a unique singleton string. - * For example, write - * - * ```ql - * class MyAnalysisConfiguration extends DataFlow::Configuration { - * MyAnalysisConfiguration() { this = "MyAnalysisConfiguration" } - * // Override `isSource` and `isSink`. - * // Optionally override `isBarrier`. - * // Optionally override `isAdditionalFlowStep`. - * } - * ``` - * Conceptually, this defines a graph where the nodes are `DataFlow::Node`s and - * the edges are those data-flow steps that preserve the value of the node - * along with any additional edges defined by `isAdditionalFlowStep`. - * Specifying nodes in `isBarrier` will remove those nodes from the graph, and - * specifying nodes in `isBarrierIn` and/or `isBarrierOut` will remove in-going - * and/or out-going edges from those nodes, respectively. - * - * Then, to query whether there is flow between some `source` and `sink`, - * write - * - * ```ql - * exists(MyAnalysisConfiguration cfg | cfg.hasFlow(source, sink)) - * ``` - * - * Multiple configurations can coexist, but two classes extending - * `DataFlow::Configuration` should never depend on each other. One of them - * should instead depend on a `DataFlow2::Configuration`, a - * `DataFlow3::Configuration`, or a `DataFlow4::Configuration`. - */ -abstract deprecated class Configuration extends string { - bindingset[this] - Configuration() { any() } - - /** - * Holds if `source` is a relevant data flow source. - */ - predicate isSource(Node source) { none() } - - /** - * Holds if `source` is a relevant data flow source with the given initial - * `state`. - */ - predicate isSource(Node source, FlowState state) { none() } - - /** - * Holds if `sink` is a relevant data flow sink. - */ - predicate isSink(Node sink) { none() } - - /** - * Holds if `sink` is a relevant data flow sink accepting `state`. - */ - predicate isSink(Node sink, FlowState state) { none() } - - /** - * Holds if data flow through `node` is prohibited. This completely removes - * `node` from the data flow graph. - */ - predicate isBarrier(Node node) { none() } - - /** - * Holds if data flow through `node` is prohibited when the flow state is - * `state`. - */ - predicate isBarrier(Node node, FlowState state) { none() } - - /** Holds if data flow into `node` is prohibited. */ - predicate isBarrierIn(Node node) { none() } - - /** Holds if data flow out of `node` is prohibited. */ - predicate isBarrierOut(Node node) { none() } - - /** - * Holds if data may flow from `node1` to `node2` in addition to the normal data-flow steps. - */ - predicate isAdditionalFlowStep(Node node1, Node node2) { none() } - - /** - * Holds if data may flow from `node1` to `node2` in addition to the normal data-flow steps. - * This step is only applicable in `state1` and updates the flow state to `state2`. - */ - predicate isAdditionalFlowStep(Node node1, FlowState state1, Node node2, FlowState state2) { - none() - } - - /** - * Holds if an arbitrary number of implicit read steps of content `c` may be - * taken at `node`. - */ - predicate allowImplicitRead(Node node, ContentSet c) { none() } - - /** - * Gets the virtual dispatch branching limit when calculating field flow. - * This can be overridden to a smaller value to improve performance (a - * value of 0 disables field flow), or a larger value to get more results. - */ - int fieldFlowBranchLimit() { result = 2 } - - /** - * Gets a data flow configuration feature to add restrictions to the set of - * valid flow paths. - * - * - `FeatureHasSourceCallContext`: - * Assume that sources have some existing call context to disallow - * conflicting return-flow directly following the source. - * - `FeatureHasSinkCallContext`: - * Assume that sinks have some existing call context to disallow - * conflicting argument-to-parameter flow directly preceding the sink. - * - `FeatureEqualSourceSinkCallContext`: - * Implies both of the above and additionally ensures that the entire flow - * path preserves the call context. - * - * These features are generally not relevant for typical end-to-end data flow - * queries, but should only be used for constructing paths that need to - * somehow be pluggable in another path context. - */ - FlowFeature getAFeature() { none() } - - /** Holds if sources should be grouped in the result of `hasFlowPath`. */ - predicate sourceGrouping(Node source, string sourceGroup) { none() } - - /** Holds if sinks should be grouped in the result of `hasFlowPath`. */ - predicate sinkGrouping(Node sink, string sinkGroup) { none() } - - /** - * Holds if data may flow from `source` to `sink` for this configuration. - */ - predicate hasFlow(Node source, Node sink) { hasFlow(source, sink, this) } - - /** - * Holds if data may flow from `source` to `sink` for this configuration. - * - * The corresponding paths are generated from the end-points and the graph - * included in the module `PathGraph`. - */ - predicate hasFlowPath(PathNode source, PathNode sink) { hasFlowPath(source, sink, this) } - - /** - * Holds if data may flow from some source to `sink` for this configuration. - */ - predicate hasFlowTo(Node sink) { hasFlowTo(sink, this) } - - /** - * Holds if data may flow from some source to `sink` for this configuration. - */ - predicate hasFlowToExpr(DataFlowExpr sink) { this.hasFlowTo(exprNode(sink)) } - - /** - * Holds if hidden nodes should be included in the data flow graph. - * - * This feature should only be used for debugging or when the data flow graph - * is not visualized (for example in a `path-problem` query). - */ - predicate includeHiddenNodes() { none() } -} - -/** - * This class exists to prevent mutual recursion between the user-overridden - * member predicates of `Configuration` and the rest of the data-flow library. - * Good performance cannot be guaranteed in the presence of such recursion, so - * it should be replaced by using more than one copy of the data flow library. - */ -abstract deprecated private class ConfigurationRecursionPrevention extends Configuration { - bindingset[this] - ConfigurationRecursionPrevention() { any() } - - override predicate hasFlow(Node source, Node sink) { - strictcount(Node n | this.isSource(n)) < 0 - or - strictcount(Node n | this.isSource(n, _)) < 0 - or - strictcount(Node n | this.isSink(n)) < 0 - or - strictcount(Node n | this.isSink(n, _)) < 0 - or - strictcount(Node n1, Node n2 | this.isAdditionalFlowStep(n1, n2)) < 0 - or - strictcount(Node n1, Node n2 | this.isAdditionalFlowStep(n1, _, n2, _)) < 0 - or - super.hasFlow(source, sink) - } -} - -deprecated private FlowState relevantState(Configuration config) { - config.isSource(_, result) or - config.isSink(_, result) or - config.isBarrier(_, result) or - config.isAdditionalFlowStep(_, result, _, _) or - config.isAdditionalFlowStep(_, _, _, result) -} - -private newtype TConfigState = - deprecated TMkConfigState(Configuration config, FlowState state) { - state = relevantState(config) or state instanceof FlowStateEmpty - } - -deprecated private Configuration getConfig(TConfigState state) { state = TMkConfigState(result, _) } - -deprecated private FlowState getState(TConfigState state) { state = TMkConfigState(_, result) } - -deprecated private predicate singleConfiguration() { 1 = strictcount(Configuration c) } - -deprecated private module Config implements FullStateConfigSig { - class FlowState = TConfigState; - - predicate isSource(Node source, FlowState state) { - getConfig(state).isSource(source, getState(state)) - or - getConfig(state).isSource(source) and getState(state) instanceof FlowStateEmpty - } - - predicate isSink(Node sink) { none() } - - predicate isSink(Node sink, FlowState state) { - getConfig(state).isSink(sink, getState(state)) - or - getConfig(state).isSink(sink) and getState(state) instanceof FlowStateEmpty - } - - predicate isBarrier(Node node) { none() } - - predicate isBarrier(Node node, FlowState state) { - getConfig(state).isBarrier(node, getState(state)) or - getConfig(state).isBarrier(node) - } - - predicate isBarrierIn(Node node) { any(Configuration config).isBarrierIn(node) } - - predicate isBarrierOut(Node node) { any(Configuration config).isBarrierOut(node) } - - predicate isBarrierIn(Node node, FlowState state) { none() } - - predicate isBarrierOut(Node node, FlowState state) { none() } - - predicate isAdditionalFlowStep(Node node1, Node node2, string model) { - singleConfiguration() and - any(Configuration config).isAdditionalFlowStep(node1, node2) and - model = "" - } - - predicate isAdditionalFlowStep( - Node node1, FlowState state1, Node node2, FlowState state2, string model - ) { - getConfig(state1).isAdditionalFlowStep(node1, getState(state1), node2, getState(state2)) and - getConfig(state2) = getConfig(state1) and - model = "" - or - not singleConfiguration() and - getConfig(state1).isAdditionalFlowStep(node1, node2) and - state2 = state1 and - model = "" - } - - predicate allowImplicitRead(Node node, ContentSet c) { - any(Configuration config).allowImplicitRead(node, c) - } - - predicate neverSkip(Node node) { none() } - - int fieldFlowBranchLimit() { result = min(any(Configuration config).fieldFlowBranchLimit()) } - - int accessPathLimit() { result = 5 } - - FlowFeature getAFeature() { result = any(Configuration config).getAFeature() } - - predicate includeHiddenNodes() { any(Configuration config).includeHiddenNodes() } - - predicate observeDiffInformedIncrementalMode() { none() } -} - -deprecated private import Impl as I - -/** - * A `Node` augmented with a call context (except for sinks), an access path, and a configuration. - * Only those `PathNode`s that are reachable from a source, and which can reach a sink, are generated. - */ -deprecated class PathNode instanceof I::PathNode { - /** Gets a textual representation of this element. */ - final string toString() { result = super.toString() } - - /** - * Gets a textual representation of this element, including a textual - * representation of the call context. - */ - final string toStringWithContext() { result = super.toStringWithContext() } - - /** - * Holds if this element is at the specified location. - * The location spans column `startcolumn` of line `startline` to - * column `endcolumn` of line `endline` in file `filepath`. - * For more information, see - * [Locations](https://codeql.github.com/docs/writing-codeql-queries/providing-locations-in-codeql-queries/). - */ - final predicate hasLocationInfo( - string filepath, int startline, int startcolumn, int endline, int endcolumn - ) { - super.hasLocationInfo(filepath, startline, startcolumn, endline, endcolumn) - } - - /** Gets the underlying `Node`. */ - final Node getNode() { result = super.getNode() } - - /** Gets the `FlowState` of this node. */ - deprecated final FlowState getState() { result = getState(super.getState()) } - - /** Gets the associated configuration. */ - deprecated final Configuration getConfiguration() { result = getConfig(super.getState()) } - - /** Gets a successor of this node, if any. */ - final PathNode getASuccessor() { result = super.getASuccessor() } - - /** Holds if this node is a source. */ - final predicate isSource() { super.isSource() } - - /** Holds if this node is a grouping of source nodes. */ - final predicate isSourceGroup(string group) { super.isSourceGroup(group) } - - /** Holds if this node is a grouping of sink nodes. */ - final predicate isSinkGroup(string group) { super.isSinkGroup(group) } -} - -deprecated module PathGraph = I::PathGraph; - -deprecated private predicate hasFlow(Node source, Node sink, Configuration config) { - exists(PathNode source0, PathNode sink0 | - hasFlowPath(source0, sink0, config) and - source0.getNode() = source and - sink0.getNode() = sink - ) -} - -deprecated private predicate hasFlowPath(PathNode source, PathNode sink, Configuration config) { - I::flowPath(source, sink) and source.getConfiguration() = config -} - -deprecated private predicate hasFlowTo(Node sink, Configuration config) { hasFlow(_, sink, config) } - -deprecated predicate flowsTo = hasFlow/3; diff --git a/java/ql/lib/semmle/code/java/dataflow/internal/DataFlowImpl2.qll b/java/ql/lib/semmle/code/java/dataflow/internal/DataFlowImpl2.qll deleted file mode 100644 index 17def0c431d..00000000000 --- a/java/ql/lib/semmle/code/java/dataflow/internal/DataFlowImpl2.qll +++ /dev/null @@ -1,361 +0,0 @@ -/** - * DEPRECATED: Use `Global` and `GlobalWithState` instead. - * - * Provides a `Configuration` class backwards-compatible interface to the data - * flow library. - */ - -private import DataFlowImplCommon -private import DataFlowImplSpecific::Private -import DataFlowImplSpecific::Public -private import DataFlowImpl -import DataFlowImplCommonPublic -deprecated import FlowStateString -private import codeql.util.Unit - -/** - * DEPRECATED: Use `Global` and `GlobalWithState` instead. - * - * A configuration of interprocedural data flow analysis. This defines - * sources, sinks, and any other configurable aspect of the analysis. Each - * use of the global data flow library must define its own unique extension - * of this abstract class. To create a configuration, extend this class with - * a subclass whose characteristic predicate is a unique singleton string. - * For example, write - * - * ```ql - * class MyAnalysisConfiguration extends DataFlow::Configuration { - * MyAnalysisConfiguration() { this = "MyAnalysisConfiguration" } - * // Override `isSource` and `isSink`. - * // Optionally override `isBarrier`. - * // Optionally override `isAdditionalFlowStep`. - * } - * ``` - * Conceptually, this defines a graph where the nodes are `DataFlow::Node`s and - * the edges are those data-flow steps that preserve the value of the node - * along with any additional edges defined by `isAdditionalFlowStep`. - * Specifying nodes in `isBarrier` will remove those nodes from the graph, and - * specifying nodes in `isBarrierIn` and/or `isBarrierOut` will remove in-going - * and/or out-going edges from those nodes, respectively. - * - * Then, to query whether there is flow between some `source` and `sink`, - * write - * - * ```ql - * exists(MyAnalysisConfiguration cfg | cfg.hasFlow(source, sink)) - * ``` - * - * Multiple configurations can coexist, but two classes extending - * `DataFlow::Configuration` should never depend on each other. One of them - * should instead depend on a `DataFlow2::Configuration`, a - * `DataFlow3::Configuration`, or a `DataFlow4::Configuration`. - */ -abstract deprecated class Configuration extends string { - bindingset[this] - Configuration() { any() } - - /** - * Holds if `source` is a relevant data flow source. - */ - predicate isSource(Node source) { none() } - - /** - * Holds if `source` is a relevant data flow source with the given initial - * `state`. - */ - predicate isSource(Node source, FlowState state) { none() } - - /** - * Holds if `sink` is a relevant data flow sink. - */ - predicate isSink(Node sink) { none() } - - /** - * Holds if `sink` is a relevant data flow sink accepting `state`. - */ - predicate isSink(Node sink, FlowState state) { none() } - - /** - * Holds if data flow through `node` is prohibited. This completely removes - * `node` from the data flow graph. - */ - predicate isBarrier(Node node) { none() } - - /** - * Holds if data flow through `node` is prohibited when the flow state is - * `state`. - */ - predicate isBarrier(Node node, FlowState state) { none() } - - /** Holds if data flow into `node` is prohibited. */ - predicate isBarrierIn(Node node) { none() } - - /** Holds if data flow out of `node` is prohibited. */ - predicate isBarrierOut(Node node) { none() } - - /** - * Holds if data may flow from `node1` to `node2` in addition to the normal data-flow steps. - */ - predicate isAdditionalFlowStep(Node node1, Node node2) { none() } - - /** - * Holds if data may flow from `node1` to `node2` in addition to the normal data-flow steps. - * This step is only applicable in `state1` and updates the flow state to `state2`. - */ - predicate isAdditionalFlowStep(Node node1, FlowState state1, Node node2, FlowState state2) { - none() - } - - /** - * Holds if an arbitrary number of implicit read steps of content `c` may be - * taken at `node`. - */ - predicate allowImplicitRead(Node node, ContentSet c) { none() } - - /** - * Gets the virtual dispatch branching limit when calculating field flow. - * This can be overridden to a smaller value to improve performance (a - * value of 0 disables field flow), or a larger value to get more results. - */ - int fieldFlowBranchLimit() { result = 2 } - - /** - * Gets a data flow configuration feature to add restrictions to the set of - * valid flow paths. - * - * - `FeatureHasSourceCallContext`: - * Assume that sources have some existing call context to disallow - * conflicting return-flow directly following the source. - * - `FeatureHasSinkCallContext`: - * Assume that sinks have some existing call context to disallow - * conflicting argument-to-parameter flow directly preceding the sink. - * - `FeatureEqualSourceSinkCallContext`: - * Implies both of the above and additionally ensures that the entire flow - * path preserves the call context. - * - * These features are generally not relevant for typical end-to-end data flow - * queries, but should only be used for constructing paths that need to - * somehow be pluggable in another path context. - */ - FlowFeature getAFeature() { none() } - - /** Holds if sources should be grouped in the result of `hasFlowPath`. */ - predicate sourceGrouping(Node source, string sourceGroup) { none() } - - /** Holds if sinks should be grouped in the result of `hasFlowPath`. */ - predicate sinkGrouping(Node sink, string sinkGroup) { none() } - - /** - * Holds if data may flow from `source` to `sink` for this configuration. - */ - predicate hasFlow(Node source, Node sink) { hasFlow(source, sink, this) } - - /** - * Holds if data may flow from `source` to `sink` for this configuration. - * - * The corresponding paths are generated from the end-points and the graph - * included in the module `PathGraph`. - */ - predicate hasFlowPath(PathNode source, PathNode sink) { hasFlowPath(source, sink, this) } - - /** - * Holds if data may flow from some source to `sink` for this configuration. - */ - predicate hasFlowTo(Node sink) { hasFlowTo(sink, this) } - - /** - * Holds if data may flow from some source to `sink` for this configuration. - */ - predicate hasFlowToExpr(DataFlowExpr sink) { this.hasFlowTo(exprNode(sink)) } - - /** - * Holds if hidden nodes should be included in the data flow graph. - * - * This feature should only be used for debugging or when the data flow graph - * is not visualized (for example in a `path-problem` query). - */ - predicate includeHiddenNodes() { none() } -} - -/** - * This class exists to prevent mutual recursion between the user-overridden - * member predicates of `Configuration` and the rest of the data-flow library. - * Good performance cannot be guaranteed in the presence of such recursion, so - * it should be replaced by using more than one copy of the data flow library. - */ -abstract deprecated private class ConfigurationRecursionPrevention extends Configuration { - bindingset[this] - ConfigurationRecursionPrevention() { any() } - - override predicate hasFlow(Node source, Node sink) { - strictcount(Node n | this.isSource(n)) < 0 - or - strictcount(Node n | this.isSource(n, _)) < 0 - or - strictcount(Node n | this.isSink(n)) < 0 - or - strictcount(Node n | this.isSink(n, _)) < 0 - or - strictcount(Node n1, Node n2 | this.isAdditionalFlowStep(n1, n2)) < 0 - or - strictcount(Node n1, Node n2 | this.isAdditionalFlowStep(n1, _, n2, _)) < 0 - or - super.hasFlow(source, sink) - } -} - -deprecated private FlowState relevantState(Configuration config) { - config.isSource(_, result) or - config.isSink(_, result) or - config.isBarrier(_, result) or - config.isAdditionalFlowStep(_, result, _, _) or - config.isAdditionalFlowStep(_, _, _, result) -} - -private newtype TConfigState = - deprecated TMkConfigState(Configuration config, FlowState state) { - state = relevantState(config) or state instanceof FlowStateEmpty - } - -deprecated private Configuration getConfig(TConfigState state) { state = TMkConfigState(result, _) } - -deprecated private FlowState getState(TConfigState state) { state = TMkConfigState(_, result) } - -deprecated private predicate singleConfiguration() { 1 = strictcount(Configuration c) } - -deprecated private module Config implements FullStateConfigSig { - class FlowState = TConfigState; - - predicate isSource(Node source, FlowState state) { - getConfig(state).isSource(source, getState(state)) - or - getConfig(state).isSource(source) and getState(state) instanceof FlowStateEmpty - } - - predicate isSink(Node sink) { none() } - - predicate isSink(Node sink, FlowState state) { - getConfig(state).isSink(sink, getState(state)) - or - getConfig(state).isSink(sink) and getState(state) instanceof FlowStateEmpty - } - - predicate isBarrier(Node node) { none() } - - predicate isBarrier(Node node, FlowState state) { - getConfig(state).isBarrier(node, getState(state)) or - getConfig(state).isBarrier(node) - } - - predicate isBarrierIn(Node node) { any(Configuration config).isBarrierIn(node) } - - predicate isBarrierOut(Node node) { any(Configuration config).isBarrierOut(node) } - - predicate isBarrierIn(Node node, FlowState state) { none() } - - predicate isBarrierOut(Node node, FlowState state) { none() } - - predicate isAdditionalFlowStep(Node node1, Node node2, string model) { - singleConfiguration() and - any(Configuration config).isAdditionalFlowStep(node1, node2) and - model = "" - } - - predicate isAdditionalFlowStep( - Node node1, FlowState state1, Node node2, FlowState state2, string model - ) { - getConfig(state1).isAdditionalFlowStep(node1, getState(state1), node2, getState(state2)) and - getConfig(state2) = getConfig(state1) and - model = "" - or - not singleConfiguration() and - getConfig(state1).isAdditionalFlowStep(node1, node2) and - state2 = state1 and - model = "" - } - - predicate allowImplicitRead(Node node, ContentSet c) { - any(Configuration config).allowImplicitRead(node, c) - } - - predicate neverSkip(Node node) { none() } - - int fieldFlowBranchLimit() { result = min(any(Configuration config).fieldFlowBranchLimit()) } - - int accessPathLimit() { result = 5 } - - FlowFeature getAFeature() { result = any(Configuration config).getAFeature() } - - predicate includeHiddenNodes() { any(Configuration config).includeHiddenNodes() } - - predicate observeDiffInformedIncrementalMode() { none() } -} - -deprecated private import Impl as I - -/** - * A `Node` augmented with a call context (except for sinks), an access path, and a configuration. - * Only those `PathNode`s that are reachable from a source, and which can reach a sink, are generated. - */ -deprecated class PathNode instanceof I::PathNode { - /** Gets a textual representation of this element. */ - final string toString() { result = super.toString() } - - /** - * Gets a textual representation of this element, including a textual - * representation of the call context. - */ - final string toStringWithContext() { result = super.toStringWithContext() } - - /** - * Holds if this element is at the specified location. - * The location spans column `startcolumn` of line `startline` to - * column `endcolumn` of line `endline` in file `filepath`. - * For more information, see - * [Locations](https://codeql.github.com/docs/writing-codeql-queries/providing-locations-in-codeql-queries/). - */ - final predicate hasLocationInfo( - string filepath, int startline, int startcolumn, int endline, int endcolumn - ) { - super.hasLocationInfo(filepath, startline, startcolumn, endline, endcolumn) - } - - /** Gets the underlying `Node`. */ - final Node getNode() { result = super.getNode() } - - /** Gets the `FlowState` of this node. */ - deprecated final FlowState getState() { result = getState(super.getState()) } - - /** Gets the associated configuration. */ - deprecated final Configuration getConfiguration() { result = getConfig(super.getState()) } - - /** Gets a successor of this node, if any. */ - final PathNode getASuccessor() { result = super.getASuccessor() } - - /** Holds if this node is a source. */ - final predicate isSource() { super.isSource() } - - /** Holds if this node is a grouping of source nodes. */ - final predicate isSourceGroup(string group) { super.isSourceGroup(group) } - - /** Holds if this node is a grouping of sink nodes. */ - final predicate isSinkGroup(string group) { super.isSinkGroup(group) } -} - -deprecated module PathGraph = I::PathGraph; - -deprecated private predicate hasFlow(Node source, Node sink, Configuration config) { - exists(PathNode source0, PathNode sink0 | - hasFlowPath(source0, sink0, config) and - source0.getNode() = source and - sink0.getNode() = sink - ) -} - -deprecated private predicate hasFlowPath(PathNode source, PathNode sink, Configuration config) { - I::flowPath(source, sink) and source.getConfiguration() = config -} - -deprecated private predicate hasFlowTo(Node sink, Configuration config) { hasFlow(_, sink, config) } - -deprecated predicate flowsTo = hasFlow/3; diff --git a/java/ql/lib/semmle/code/java/dataflow/internal/DataFlowImpl3.qll b/java/ql/lib/semmle/code/java/dataflow/internal/DataFlowImpl3.qll deleted file mode 100644 index 17def0c431d..00000000000 --- a/java/ql/lib/semmle/code/java/dataflow/internal/DataFlowImpl3.qll +++ /dev/null @@ -1,361 +0,0 @@ -/** - * DEPRECATED: Use `Global` and `GlobalWithState` instead. - * - * Provides a `Configuration` class backwards-compatible interface to the data - * flow library. - */ - -private import DataFlowImplCommon -private import DataFlowImplSpecific::Private -import DataFlowImplSpecific::Public -private import DataFlowImpl -import DataFlowImplCommonPublic -deprecated import FlowStateString -private import codeql.util.Unit - -/** - * DEPRECATED: Use `Global` and `GlobalWithState` instead. - * - * A configuration of interprocedural data flow analysis. This defines - * sources, sinks, and any other configurable aspect of the analysis. Each - * use of the global data flow library must define its own unique extension - * of this abstract class. To create a configuration, extend this class with - * a subclass whose characteristic predicate is a unique singleton string. - * For example, write - * - * ```ql - * class MyAnalysisConfiguration extends DataFlow::Configuration { - * MyAnalysisConfiguration() { this = "MyAnalysisConfiguration" } - * // Override `isSource` and `isSink`. - * // Optionally override `isBarrier`. - * // Optionally override `isAdditionalFlowStep`. - * } - * ``` - * Conceptually, this defines a graph where the nodes are `DataFlow::Node`s and - * the edges are those data-flow steps that preserve the value of the node - * along with any additional edges defined by `isAdditionalFlowStep`. - * Specifying nodes in `isBarrier` will remove those nodes from the graph, and - * specifying nodes in `isBarrierIn` and/or `isBarrierOut` will remove in-going - * and/or out-going edges from those nodes, respectively. - * - * Then, to query whether there is flow between some `source` and `sink`, - * write - * - * ```ql - * exists(MyAnalysisConfiguration cfg | cfg.hasFlow(source, sink)) - * ``` - * - * Multiple configurations can coexist, but two classes extending - * `DataFlow::Configuration` should never depend on each other. One of them - * should instead depend on a `DataFlow2::Configuration`, a - * `DataFlow3::Configuration`, or a `DataFlow4::Configuration`. - */ -abstract deprecated class Configuration extends string { - bindingset[this] - Configuration() { any() } - - /** - * Holds if `source` is a relevant data flow source. - */ - predicate isSource(Node source) { none() } - - /** - * Holds if `source` is a relevant data flow source with the given initial - * `state`. - */ - predicate isSource(Node source, FlowState state) { none() } - - /** - * Holds if `sink` is a relevant data flow sink. - */ - predicate isSink(Node sink) { none() } - - /** - * Holds if `sink` is a relevant data flow sink accepting `state`. - */ - predicate isSink(Node sink, FlowState state) { none() } - - /** - * Holds if data flow through `node` is prohibited. This completely removes - * `node` from the data flow graph. - */ - predicate isBarrier(Node node) { none() } - - /** - * Holds if data flow through `node` is prohibited when the flow state is - * `state`. - */ - predicate isBarrier(Node node, FlowState state) { none() } - - /** Holds if data flow into `node` is prohibited. */ - predicate isBarrierIn(Node node) { none() } - - /** Holds if data flow out of `node` is prohibited. */ - predicate isBarrierOut(Node node) { none() } - - /** - * Holds if data may flow from `node1` to `node2` in addition to the normal data-flow steps. - */ - predicate isAdditionalFlowStep(Node node1, Node node2) { none() } - - /** - * Holds if data may flow from `node1` to `node2` in addition to the normal data-flow steps. - * This step is only applicable in `state1` and updates the flow state to `state2`. - */ - predicate isAdditionalFlowStep(Node node1, FlowState state1, Node node2, FlowState state2) { - none() - } - - /** - * Holds if an arbitrary number of implicit read steps of content `c` may be - * taken at `node`. - */ - predicate allowImplicitRead(Node node, ContentSet c) { none() } - - /** - * Gets the virtual dispatch branching limit when calculating field flow. - * This can be overridden to a smaller value to improve performance (a - * value of 0 disables field flow), or a larger value to get more results. - */ - int fieldFlowBranchLimit() { result = 2 } - - /** - * Gets a data flow configuration feature to add restrictions to the set of - * valid flow paths. - * - * - `FeatureHasSourceCallContext`: - * Assume that sources have some existing call context to disallow - * conflicting return-flow directly following the source. - * - `FeatureHasSinkCallContext`: - * Assume that sinks have some existing call context to disallow - * conflicting argument-to-parameter flow directly preceding the sink. - * - `FeatureEqualSourceSinkCallContext`: - * Implies both of the above and additionally ensures that the entire flow - * path preserves the call context. - * - * These features are generally not relevant for typical end-to-end data flow - * queries, but should only be used for constructing paths that need to - * somehow be pluggable in another path context. - */ - FlowFeature getAFeature() { none() } - - /** Holds if sources should be grouped in the result of `hasFlowPath`. */ - predicate sourceGrouping(Node source, string sourceGroup) { none() } - - /** Holds if sinks should be grouped in the result of `hasFlowPath`. */ - predicate sinkGrouping(Node sink, string sinkGroup) { none() } - - /** - * Holds if data may flow from `source` to `sink` for this configuration. - */ - predicate hasFlow(Node source, Node sink) { hasFlow(source, sink, this) } - - /** - * Holds if data may flow from `source` to `sink` for this configuration. - * - * The corresponding paths are generated from the end-points and the graph - * included in the module `PathGraph`. - */ - predicate hasFlowPath(PathNode source, PathNode sink) { hasFlowPath(source, sink, this) } - - /** - * Holds if data may flow from some source to `sink` for this configuration. - */ - predicate hasFlowTo(Node sink) { hasFlowTo(sink, this) } - - /** - * Holds if data may flow from some source to `sink` for this configuration. - */ - predicate hasFlowToExpr(DataFlowExpr sink) { this.hasFlowTo(exprNode(sink)) } - - /** - * Holds if hidden nodes should be included in the data flow graph. - * - * This feature should only be used for debugging or when the data flow graph - * is not visualized (for example in a `path-problem` query). - */ - predicate includeHiddenNodes() { none() } -} - -/** - * This class exists to prevent mutual recursion between the user-overridden - * member predicates of `Configuration` and the rest of the data-flow library. - * Good performance cannot be guaranteed in the presence of such recursion, so - * it should be replaced by using more than one copy of the data flow library. - */ -abstract deprecated private class ConfigurationRecursionPrevention extends Configuration { - bindingset[this] - ConfigurationRecursionPrevention() { any() } - - override predicate hasFlow(Node source, Node sink) { - strictcount(Node n | this.isSource(n)) < 0 - or - strictcount(Node n | this.isSource(n, _)) < 0 - or - strictcount(Node n | this.isSink(n)) < 0 - or - strictcount(Node n | this.isSink(n, _)) < 0 - or - strictcount(Node n1, Node n2 | this.isAdditionalFlowStep(n1, n2)) < 0 - or - strictcount(Node n1, Node n2 | this.isAdditionalFlowStep(n1, _, n2, _)) < 0 - or - super.hasFlow(source, sink) - } -} - -deprecated private FlowState relevantState(Configuration config) { - config.isSource(_, result) or - config.isSink(_, result) or - config.isBarrier(_, result) or - config.isAdditionalFlowStep(_, result, _, _) or - config.isAdditionalFlowStep(_, _, _, result) -} - -private newtype TConfigState = - deprecated TMkConfigState(Configuration config, FlowState state) { - state = relevantState(config) or state instanceof FlowStateEmpty - } - -deprecated private Configuration getConfig(TConfigState state) { state = TMkConfigState(result, _) } - -deprecated private FlowState getState(TConfigState state) { state = TMkConfigState(_, result) } - -deprecated private predicate singleConfiguration() { 1 = strictcount(Configuration c) } - -deprecated private module Config implements FullStateConfigSig { - class FlowState = TConfigState; - - predicate isSource(Node source, FlowState state) { - getConfig(state).isSource(source, getState(state)) - or - getConfig(state).isSource(source) and getState(state) instanceof FlowStateEmpty - } - - predicate isSink(Node sink) { none() } - - predicate isSink(Node sink, FlowState state) { - getConfig(state).isSink(sink, getState(state)) - or - getConfig(state).isSink(sink) and getState(state) instanceof FlowStateEmpty - } - - predicate isBarrier(Node node) { none() } - - predicate isBarrier(Node node, FlowState state) { - getConfig(state).isBarrier(node, getState(state)) or - getConfig(state).isBarrier(node) - } - - predicate isBarrierIn(Node node) { any(Configuration config).isBarrierIn(node) } - - predicate isBarrierOut(Node node) { any(Configuration config).isBarrierOut(node) } - - predicate isBarrierIn(Node node, FlowState state) { none() } - - predicate isBarrierOut(Node node, FlowState state) { none() } - - predicate isAdditionalFlowStep(Node node1, Node node2, string model) { - singleConfiguration() and - any(Configuration config).isAdditionalFlowStep(node1, node2) and - model = "" - } - - predicate isAdditionalFlowStep( - Node node1, FlowState state1, Node node2, FlowState state2, string model - ) { - getConfig(state1).isAdditionalFlowStep(node1, getState(state1), node2, getState(state2)) and - getConfig(state2) = getConfig(state1) and - model = "" - or - not singleConfiguration() and - getConfig(state1).isAdditionalFlowStep(node1, node2) and - state2 = state1 and - model = "" - } - - predicate allowImplicitRead(Node node, ContentSet c) { - any(Configuration config).allowImplicitRead(node, c) - } - - predicate neverSkip(Node node) { none() } - - int fieldFlowBranchLimit() { result = min(any(Configuration config).fieldFlowBranchLimit()) } - - int accessPathLimit() { result = 5 } - - FlowFeature getAFeature() { result = any(Configuration config).getAFeature() } - - predicate includeHiddenNodes() { any(Configuration config).includeHiddenNodes() } - - predicate observeDiffInformedIncrementalMode() { none() } -} - -deprecated private import Impl as I - -/** - * A `Node` augmented with a call context (except for sinks), an access path, and a configuration. - * Only those `PathNode`s that are reachable from a source, and which can reach a sink, are generated. - */ -deprecated class PathNode instanceof I::PathNode { - /** Gets a textual representation of this element. */ - final string toString() { result = super.toString() } - - /** - * Gets a textual representation of this element, including a textual - * representation of the call context. - */ - final string toStringWithContext() { result = super.toStringWithContext() } - - /** - * Holds if this element is at the specified location. - * The location spans column `startcolumn` of line `startline` to - * column `endcolumn` of line `endline` in file `filepath`. - * For more information, see - * [Locations](https://codeql.github.com/docs/writing-codeql-queries/providing-locations-in-codeql-queries/). - */ - final predicate hasLocationInfo( - string filepath, int startline, int startcolumn, int endline, int endcolumn - ) { - super.hasLocationInfo(filepath, startline, startcolumn, endline, endcolumn) - } - - /** Gets the underlying `Node`. */ - final Node getNode() { result = super.getNode() } - - /** Gets the `FlowState` of this node. */ - deprecated final FlowState getState() { result = getState(super.getState()) } - - /** Gets the associated configuration. */ - deprecated final Configuration getConfiguration() { result = getConfig(super.getState()) } - - /** Gets a successor of this node, if any. */ - final PathNode getASuccessor() { result = super.getASuccessor() } - - /** Holds if this node is a source. */ - final predicate isSource() { super.isSource() } - - /** Holds if this node is a grouping of source nodes. */ - final predicate isSourceGroup(string group) { super.isSourceGroup(group) } - - /** Holds if this node is a grouping of sink nodes. */ - final predicate isSinkGroup(string group) { super.isSinkGroup(group) } -} - -deprecated module PathGraph = I::PathGraph; - -deprecated private predicate hasFlow(Node source, Node sink, Configuration config) { - exists(PathNode source0, PathNode sink0 | - hasFlowPath(source0, sink0, config) and - source0.getNode() = source and - sink0.getNode() = sink - ) -} - -deprecated private predicate hasFlowPath(PathNode source, PathNode sink, Configuration config) { - I::flowPath(source, sink) and source.getConfiguration() = config -} - -deprecated private predicate hasFlowTo(Node sink, Configuration config) { hasFlow(_, sink, config) } - -deprecated predicate flowsTo = hasFlow/3; diff --git a/java/ql/lib/semmle/code/java/dataflow/internal/DataFlowImpl4.qll b/java/ql/lib/semmle/code/java/dataflow/internal/DataFlowImpl4.qll deleted file mode 100644 index 17def0c431d..00000000000 --- a/java/ql/lib/semmle/code/java/dataflow/internal/DataFlowImpl4.qll +++ /dev/null @@ -1,361 +0,0 @@ -/** - * DEPRECATED: Use `Global` and `GlobalWithState` instead. - * - * Provides a `Configuration` class backwards-compatible interface to the data - * flow library. - */ - -private import DataFlowImplCommon -private import DataFlowImplSpecific::Private -import DataFlowImplSpecific::Public -private import DataFlowImpl -import DataFlowImplCommonPublic -deprecated import FlowStateString -private import codeql.util.Unit - -/** - * DEPRECATED: Use `Global` and `GlobalWithState` instead. - * - * A configuration of interprocedural data flow analysis. This defines - * sources, sinks, and any other configurable aspect of the analysis. Each - * use of the global data flow library must define its own unique extension - * of this abstract class. To create a configuration, extend this class with - * a subclass whose characteristic predicate is a unique singleton string. - * For example, write - * - * ```ql - * class MyAnalysisConfiguration extends DataFlow::Configuration { - * MyAnalysisConfiguration() { this = "MyAnalysisConfiguration" } - * // Override `isSource` and `isSink`. - * // Optionally override `isBarrier`. - * // Optionally override `isAdditionalFlowStep`. - * } - * ``` - * Conceptually, this defines a graph where the nodes are `DataFlow::Node`s and - * the edges are those data-flow steps that preserve the value of the node - * along with any additional edges defined by `isAdditionalFlowStep`. - * Specifying nodes in `isBarrier` will remove those nodes from the graph, and - * specifying nodes in `isBarrierIn` and/or `isBarrierOut` will remove in-going - * and/or out-going edges from those nodes, respectively. - * - * Then, to query whether there is flow between some `source` and `sink`, - * write - * - * ```ql - * exists(MyAnalysisConfiguration cfg | cfg.hasFlow(source, sink)) - * ``` - * - * Multiple configurations can coexist, but two classes extending - * `DataFlow::Configuration` should never depend on each other. One of them - * should instead depend on a `DataFlow2::Configuration`, a - * `DataFlow3::Configuration`, or a `DataFlow4::Configuration`. - */ -abstract deprecated class Configuration extends string { - bindingset[this] - Configuration() { any() } - - /** - * Holds if `source` is a relevant data flow source. - */ - predicate isSource(Node source) { none() } - - /** - * Holds if `source` is a relevant data flow source with the given initial - * `state`. - */ - predicate isSource(Node source, FlowState state) { none() } - - /** - * Holds if `sink` is a relevant data flow sink. - */ - predicate isSink(Node sink) { none() } - - /** - * Holds if `sink` is a relevant data flow sink accepting `state`. - */ - predicate isSink(Node sink, FlowState state) { none() } - - /** - * Holds if data flow through `node` is prohibited. This completely removes - * `node` from the data flow graph. - */ - predicate isBarrier(Node node) { none() } - - /** - * Holds if data flow through `node` is prohibited when the flow state is - * `state`. - */ - predicate isBarrier(Node node, FlowState state) { none() } - - /** Holds if data flow into `node` is prohibited. */ - predicate isBarrierIn(Node node) { none() } - - /** Holds if data flow out of `node` is prohibited. */ - predicate isBarrierOut(Node node) { none() } - - /** - * Holds if data may flow from `node1` to `node2` in addition to the normal data-flow steps. - */ - predicate isAdditionalFlowStep(Node node1, Node node2) { none() } - - /** - * Holds if data may flow from `node1` to `node2` in addition to the normal data-flow steps. - * This step is only applicable in `state1` and updates the flow state to `state2`. - */ - predicate isAdditionalFlowStep(Node node1, FlowState state1, Node node2, FlowState state2) { - none() - } - - /** - * Holds if an arbitrary number of implicit read steps of content `c` may be - * taken at `node`. - */ - predicate allowImplicitRead(Node node, ContentSet c) { none() } - - /** - * Gets the virtual dispatch branching limit when calculating field flow. - * This can be overridden to a smaller value to improve performance (a - * value of 0 disables field flow), or a larger value to get more results. - */ - int fieldFlowBranchLimit() { result = 2 } - - /** - * Gets a data flow configuration feature to add restrictions to the set of - * valid flow paths. - * - * - `FeatureHasSourceCallContext`: - * Assume that sources have some existing call context to disallow - * conflicting return-flow directly following the source. - * - `FeatureHasSinkCallContext`: - * Assume that sinks have some existing call context to disallow - * conflicting argument-to-parameter flow directly preceding the sink. - * - `FeatureEqualSourceSinkCallContext`: - * Implies both of the above and additionally ensures that the entire flow - * path preserves the call context. - * - * These features are generally not relevant for typical end-to-end data flow - * queries, but should only be used for constructing paths that need to - * somehow be pluggable in another path context. - */ - FlowFeature getAFeature() { none() } - - /** Holds if sources should be grouped in the result of `hasFlowPath`. */ - predicate sourceGrouping(Node source, string sourceGroup) { none() } - - /** Holds if sinks should be grouped in the result of `hasFlowPath`. */ - predicate sinkGrouping(Node sink, string sinkGroup) { none() } - - /** - * Holds if data may flow from `source` to `sink` for this configuration. - */ - predicate hasFlow(Node source, Node sink) { hasFlow(source, sink, this) } - - /** - * Holds if data may flow from `source` to `sink` for this configuration. - * - * The corresponding paths are generated from the end-points and the graph - * included in the module `PathGraph`. - */ - predicate hasFlowPath(PathNode source, PathNode sink) { hasFlowPath(source, sink, this) } - - /** - * Holds if data may flow from some source to `sink` for this configuration. - */ - predicate hasFlowTo(Node sink) { hasFlowTo(sink, this) } - - /** - * Holds if data may flow from some source to `sink` for this configuration. - */ - predicate hasFlowToExpr(DataFlowExpr sink) { this.hasFlowTo(exprNode(sink)) } - - /** - * Holds if hidden nodes should be included in the data flow graph. - * - * This feature should only be used for debugging or when the data flow graph - * is not visualized (for example in a `path-problem` query). - */ - predicate includeHiddenNodes() { none() } -} - -/** - * This class exists to prevent mutual recursion between the user-overridden - * member predicates of `Configuration` and the rest of the data-flow library. - * Good performance cannot be guaranteed in the presence of such recursion, so - * it should be replaced by using more than one copy of the data flow library. - */ -abstract deprecated private class ConfigurationRecursionPrevention extends Configuration { - bindingset[this] - ConfigurationRecursionPrevention() { any() } - - override predicate hasFlow(Node source, Node sink) { - strictcount(Node n | this.isSource(n)) < 0 - or - strictcount(Node n | this.isSource(n, _)) < 0 - or - strictcount(Node n | this.isSink(n)) < 0 - or - strictcount(Node n | this.isSink(n, _)) < 0 - or - strictcount(Node n1, Node n2 | this.isAdditionalFlowStep(n1, n2)) < 0 - or - strictcount(Node n1, Node n2 | this.isAdditionalFlowStep(n1, _, n2, _)) < 0 - or - super.hasFlow(source, sink) - } -} - -deprecated private FlowState relevantState(Configuration config) { - config.isSource(_, result) or - config.isSink(_, result) or - config.isBarrier(_, result) or - config.isAdditionalFlowStep(_, result, _, _) or - config.isAdditionalFlowStep(_, _, _, result) -} - -private newtype TConfigState = - deprecated TMkConfigState(Configuration config, FlowState state) { - state = relevantState(config) or state instanceof FlowStateEmpty - } - -deprecated private Configuration getConfig(TConfigState state) { state = TMkConfigState(result, _) } - -deprecated private FlowState getState(TConfigState state) { state = TMkConfigState(_, result) } - -deprecated private predicate singleConfiguration() { 1 = strictcount(Configuration c) } - -deprecated private module Config implements FullStateConfigSig { - class FlowState = TConfigState; - - predicate isSource(Node source, FlowState state) { - getConfig(state).isSource(source, getState(state)) - or - getConfig(state).isSource(source) and getState(state) instanceof FlowStateEmpty - } - - predicate isSink(Node sink) { none() } - - predicate isSink(Node sink, FlowState state) { - getConfig(state).isSink(sink, getState(state)) - or - getConfig(state).isSink(sink) and getState(state) instanceof FlowStateEmpty - } - - predicate isBarrier(Node node) { none() } - - predicate isBarrier(Node node, FlowState state) { - getConfig(state).isBarrier(node, getState(state)) or - getConfig(state).isBarrier(node) - } - - predicate isBarrierIn(Node node) { any(Configuration config).isBarrierIn(node) } - - predicate isBarrierOut(Node node) { any(Configuration config).isBarrierOut(node) } - - predicate isBarrierIn(Node node, FlowState state) { none() } - - predicate isBarrierOut(Node node, FlowState state) { none() } - - predicate isAdditionalFlowStep(Node node1, Node node2, string model) { - singleConfiguration() and - any(Configuration config).isAdditionalFlowStep(node1, node2) and - model = "" - } - - predicate isAdditionalFlowStep( - Node node1, FlowState state1, Node node2, FlowState state2, string model - ) { - getConfig(state1).isAdditionalFlowStep(node1, getState(state1), node2, getState(state2)) and - getConfig(state2) = getConfig(state1) and - model = "" - or - not singleConfiguration() and - getConfig(state1).isAdditionalFlowStep(node1, node2) and - state2 = state1 and - model = "" - } - - predicate allowImplicitRead(Node node, ContentSet c) { - any(Configuration config).allowImplicitRead(node, c) - } - - predicate neverSkip(Node node) { none() } - - int fieldFlowBranchLimit() { result = min(any(Configuration config).fieldFlowBranchLimit()) } - - int accessPathLimit() { result = 5 } - - FlowFeature getAFeature() { result = any(Configuration config).getAFeature() } - - predicate includeHiddenNodes() { any(Configuration config).includeHiddenNodes() } - - predicate observeDiffInformedIncrementalMode() { none() } -} - -deprecated private import Impl as I - -/** - * A `Node` augmented with a call context (except for sinks), an access path, and a configuration. - * Only those `PathNode`s that are reachable from a source, and which can reach a sink, are generated. - */ -deprecated class PathNode instanceof I::PathNode { - /** Gets a textual representation of this element. */ - final string toString() { result = super.toString() } - - /** - * Gets a textual representation of this element, including a textual - * representation of the call context. - */ - final string toStringWithContext() { result = super.toStringWithContext() } - - /** - * Holds if this element is at the specified location. - * The location spans column `startcolumn` of line `startline` to - * column `endcolumn` of line `endline` in file `filepath`. - * For more information, see - * [Locations](https://codeql.github.com/docs/writing-codeql-queries/providing-locations-in-codeql-queries/). - */ - final predicate hasLocationInfo( - string filepath, int startline, int startcolumn, int endline, int endcolumn - ) { - super.hasLocationInfo(filepath, startline, startcolumn, endline, endcolumn) - } - - /** Gets the underlying `Node`. */ - final Node getNode() { result = super.getNode() } - - /** Gets the `FlowState` of this node. */ - deprecated final FlowState getState() { result = getState(super.getState()) } - - /** Gets the associated configuration. */ - deprecated final Configuration getConfiguration() { result = getConfig(super.getState()) } - - /** Gets a successor of this node, if any. */ - final PathNode getASuccessor() { result = super.getASuccessor() } - - /** Holds if this node is a source. */ - final predicate isSource() { super.isSource() } - - /** Holds if this node is a grouping of source nodes. */ - final predicate isSourceGroup(string group) { super.isSourceGroup(group) } - - /** Holds if this node is a grouping of sink nodes. */ - final predicate isSinkGroup(string group) { super.isSinkGroup(group) } -} - -deprecated module PathGraph = I::PathGraph; - -deprecated private predicate hasFlow(Node source, Node sink, Configuration config) { - exists(PathNode source0, PathNode sink0 | - hasFlowPath(source0, sink0, config) and - source0.getNode() = source and - sink0.getNode() = sink - ) -} - -deprecated private predicate hasFlowPath(PathNode source, PathNode sink, Configuration config) { - I::flowPath(source, sink) and source.getConfiguration() = config -} - -deprecated private predicate hasFlowTo(Node sink, Configuration config) { hasFlow(_, sink, config) } - -deprecated predicate flowsTo = hasFlow/3; diff --git a/java/ql/lib/semmle/code/java/dataflow/internal/DataFlowImpl5.qll b/java/ql/lib/semmle/code/java/dataflow/internal/DataFlowImpl5.qll deleted file mode 100644 index 17def0c431d..00000000000 --- a/java/ql/lib/semmle/code/java/dataflow/internal/DataFlowImpl5.qll +++ /dev/null @@ -1,361 +0,0 @@ -/** - * DEPRECATED: Use `Global` and `GlobalWithState` instead. - * - * Provides a `Configuration` class backwards-compatible interface to the data - * flow library. - */ - -private import DataFlowImplCommon -private import DataFlowImplSpecific::Private -import DataFlowImplSpecific::Public -private import DataFlowImpl -import DataFlowImplCommonPublic -deprecated import FlowStateString -private import codeql.util.Unit - -/** - * DEPRECATED: Use `Global` and `GlobalWithState` instead. - * - * A configuration of interprocedural data flow analysis. This defines - * sources, sinks, and any other configurable aspect of the analysis. Each - * use of the global data flow library must define its own unique extension - * of this abstract class. To create a configuration, extend this class with - * a subclass whose characteristic predicate is a unique singleton string. - * For example, write - * - * ```ql - * class MyAnalysisConfiguration extends DataFlow::Configuration { - * MyAnalysisConfiguration() { this = "MyAnalysisConfiguration" } - * // Override `isSource` and `isSink`. - * // Optionally override `isBarrier`. - * // Optionally override `isAdditionalFlowStep`. - * } - * ``` - * Conceptually, this defines a graph where the nodes are `DataFlow::Node`s and - * the edges are those data-flow steps that preserve the value of the node - * along with any additional edges defined by `isAdditionalFlowStep`. - * Specifying nodes in `isBarrier` will remove those nodes from the graph, and - * specifying nodes in `isBarrierIn` and/or `isBarrierOut` will remove in-going - * and/or out-going edges from those nodes, respectively. - * - * Then, to query whether there is flow between some `source` and `sink`, - * write - * - * ```ql - * exists(MyAnalysisConfiguration cfg | cfg.hasFlow(source, sink)) - * ``` - * - * Multiple configurations can coexist, but two classes extending - * `DataFlow::Configuration` should never depend on each other. One of them - * should instead depend on a `DataFlow2::Configuration`, a - * `DataFlow3::Configuration`, or a `DataFlow4::Configuration`. - */ -abstract deprecated class Configuration extends string { - bindingset[this] - Configuration() { any() } - - /** - * Holds if `source` is a relevant data flow source. - */ - predicate isSource(Node source) { none() } - - /** - * Holds if `source` is a relevant data flow source with the given initial - * `state`. - */ - predicate isSource(Node source, FlowState state) { none() } - - /** - * Holds if `sink` is a relevant data flow sink. - */ - predicate isSink(Node sink) { none() } - - /** - * Holds if `sink` is a relevant data flow sink accepting `state`. - */ - predicate isSink(Node sink, FlowState state) { none() } - - /** - * Holds if data flow through `node` is prohibited. This completely removes - * `node` from the data flow graph. - */ - predicate isBarrier(Node node) { none() } - - /** - * Holds if data flow through `node` is prohibited when the flow state is - * `state`. - */ - predicate isBarrier(Node node, FlowState state) { none() } - - /** Holds if data flow into `node` is prohibited. */ - predicate isBarrierIn(Node node) { none() } - - /** Holds if data flow out of `node` is prohibited. */ - predicate isBarrierOut(Node node) { none() } - - /** - * Holds if data may flow from `node1` to `node2` in addition to the normal data-flow steps. - */ - predicate isAdditionalFlowStep(Node node1, Node node2) { none() } - - /** - * Holds if data may flow from `node1` to `node2` in addition to the normal data-flow steps. - * This step is only applicable in `state1` and updates the flow state to `state2`. - */ - predicate isAdditionalFlowStep(Node node1, FlowState state1, Node node2, FlowState state2) { - none() - } - - /** - * Holds if an arbitrary number of implicit read steps of content `c` may be - * taken at `node`. - */ - predicate allowImplicitRead(Node node, ContentSet c) { none() } - - /** - * Gets the virtual dispatch branching limit when calculating field flow. - * This can be overridden to a smaller value to improve performance (a - * value of 0 disables field flow), or a larger value to get more results. - */ - int fieldFlowBranchLimit() { result = 2 } - - /** - * Gets a data flow configuration feature to add restrictions to the set of - * valid flow paths. - * - * - `FeatureHasSourceCallContext`: - * Assume that sources have some existing call context to disallow - * conflicting return-flow directly following the source. - * - `FeatureHasSinkCallContext`: - * Assume that sinks have some existing call context to disallow - * conflicting argument-to-parameter flow directly preceding the sink. - * - `FeatureEqualSourceSinkCallContext`: - * Implies both of the above and additionally ensures that the entire flow - * path preserves the call context. - * - * These features are generally not relevant for typical end-to-end data flow - * queries, but should only be used for constructing paths that need to - * somehow be pluggable in another path context. - */ - FlowFeature getAFeature() { none() } - - /** Holds if sources should be grouped in the result of `hasFlowPath`. */ - predicate sourceGrouping(Node source, string sourceGroup) { none() } - - /** Holds if sinks should be grouped in the result of `hasFlowPath`. */ - predicate sinkGrouping(Node sink, string sinkGroup) { none() } - - /** - * Holds if data may flow from `source` to `sink` for this configuration. - */ - predicate hasFlow(Node source, Node sink) { hasFlow(source, sink, this) } - - /** - * Holds if data may flow from `source` to `sink` for this configuration. - * - * The corresponding paths are generated from the end-points and the graph - * included in the module `PathGraph`. - */ - predicate hasFlowPath(PathNode source, PathNode sink) { hasFlowPath(source, sink, this) } - - /** - * Holds if data may flow from some source to `sink` for this configuration. - */ - predicate hasFlowTo(Node sink) { hasFlowTo(sink, this) } - - /** - * Holds if data may flow from some source to `sink` for this configuration. - */ - predicate hasFlowToExpr(DataFlowExpr sink) { this.hasFlowTo(exprNode(sink)) } - - /** - * Holds if hidden nodes should be included in the data flow graph. - * - * This feature should only be used for debugging or when the data flow graph - * is not visualized (for example in a `path-problem` query). - */ - predicate includeHiddenNodes() { none() } -} - -/** - * This class exists to prevent mutual recursion between the user-overridden - * member predicates of `Configuration` and the rest of the data-flow library. - * Good performance cannot be guaranteed in the presence of such recursion, so - * it should be replaced by using more than one copy of the data flow library. - */ -abstract deprecated private class ConfigurationRecursionPrevention extends Configuration { - bindingset[this] - ConfigurationRecursionPrevention() { any() } - - override predicate hasFlow(Node source, Node sink) { - strictcount(Node n | this.isSource(n)) < 0 - or - strictcount(Node n | this.isSource(n, _)) < 0 - or - strictcount(Node n | this.isSink(n)) < 0 - or - strictcount(Node n | this.isSink(n, _)) < 0 - or - strictcount(Node n1, Node n2 | this.isAdditionalFlowStep(n1, n2)) < 0 - or - strictcount(Node n1, Node n2 | this.isAdditionalFlowStep(n1, _, n2, _)) < 0 - or - super.hasFlow(source, sink) - } -} - -deprecated private FlowState relevantState(Configuration config) { - config.isSource(_, result) or - config.isSink(_, result) or - config.isBarrier(_, result) or - config.isAdditionalFlowStep(_, result, _, _) or - config.isAdditionalFlowStep(_, _, _, result) -} - -private newtype TConfigState = - deprecated TMkConfigState(Configuration config, FlowState state) { - state = relevantState(config) or state instanceof FlowStateEmpty - } - -deprecated private Configuration getConfig(TConfigState state) { state = TMkConfigState(result, _) } - -deprecated private FlowState getState(TConfigState state) { state = TMkConfigState(_, result) } - -deprecated private predicate singleConfiguration() { 1 = strictcount(Configuration c) } - -deprecated private module Config implements FullStateConfigSig { - class FlowState = TConfigState; - - predicate isSource(Node source, FlowState state) { - getConfig(state).isSource(source, getState(state)) - or - getConfig(state).isSource(source) and getState(state) instanceof FlowStateEmpty - } - - predicate isSink(Node sink) { none() } - - predicate isSink(Node sink, FlowState state) { - getConfig(state).isSink(sink, getState(state)) - or - getConfig(state).isSink(sink) and getState(state) instanceof FlowStateEmpty - } - - predicate isBarrier(Node node) { none() } - - predicate isBarrier(Node node, FlowState state) { - getConfig(state).isBarrier(node, getState(state)) or - getConfig(state).isBarrier(node) - } - - predicate isBarrierIn(Node node) { any(Configuration config).isBarrierIn(node) } - - predicate isBarrierOut(Node node) { any(Configuration config).isBarrierOut(node) } - - predicate isBarrierIn(Node node, FlowState state) { none() } - - predicate isBarrierOut(Node node, FlowState state) { none() } - - predicate isAdditionalFlowStep(Node node1, Node node2, string model) { - singleConfiguration() and - any(Configuration config).isAdditionalFlowStep(node1, node2) and - model = "" - } - - predicate isAdditionalFlowStep( - Node node1, FlowState state1, Node node2, FlowState state2, string model - ) { - getConfig(state1).isAdditionalFlowStep(node1, getState(state1), node2, getState(state2)) and - getConfig(state2) = getConfig(state1) and - model = "" - or - not singleConfiguration() and - getConfig(state1).isAdditionalFlowStep(node1, node2) and - state2 = state1 and - model = "" - } - - predicate allowImplicitRead(Node node, ContentSet c) { - any(Configuration config).allowImplicitRead(node, c) - } - - predicate neverSkip(Node node) { none() } - - int fieldFlowBranchLimit() { result = min(any(Configuration config).fieldFlowBranchLimit()) } - - int accessPathLimit() { result = 5 } - - FlowFeature getAFeature() { result = any(Configuration config).getAFeature() } - - predicate includeHiddenNodes() { any(Configuration config).includeHiddenNodes() } - - predicate observeDiffInformedIncrementalMode() { none() } -} - -deprecated private import Impl as I - -/** - * A `Node` augmented with a call context (except for sinks), an access path, and a configuration. - * Only those `PathNode`s that are reachable from a source, and which can reach a sink, are generated. - */ -deprecated class PathNode instanceof I::PathNode { - /** Gets a textual representation of this element. */ - final string toString() { result = super.toString() } - - /** - * Gets a textual representation of this element, including a textual - * representation of the call context. - */ - final string toStringWithContext() { result = super.toStringWithContext() } - - /** - * Holds if this element is at the specified location. - * The location spans column `startcolumn` of line `startline` to - * column `endcolumn` of line `endline` in file `filepath`. - * For more information, see - * [Locations](https://codeql.github.com/docs/writing-codeql-queries/providing-locations-in-codeql-queries/). - */ - final predicate hasLocationInfo( - string filepath, int startline, int startcolumn, int endline, int endcolumn - ) { - super.hasLocationInfo(filepath, startline, startcolumn, endline, endcolumn) - } - - /** Gets the underlying `Node`. */ - final Node getNode() { result = super.getNode() } - - /** Gets the `FlowState` of this node. */ - deprecated final FlowState getState() { result = getState(super.getState()) } - - /** Gets the associated configuration. */ - deprecated final Configuration getConfiguration() { result = getConfig(super.getState()) } - - /** Gets a successor of this node, if any. */ - final PathNode getASuccessor() { result = super.getASuccessor() } - - /** Holds if this node is a source. */ - final predicate isSource() { super.isSource() } - - /** Holds if this node is a grouping of source nodes. */ - final predicate isSourceGroup(string group) { super.isSourceGroup(group) } - - /** Holds if this node is a grouping of sink nodes. */ - final predicate isSinkGroup(string group) { super.isSinkGroup(group) } -} - -deprecated module PathGraph = I::PathGraph; - -deprecated private predicate hasFlow(Node source, Node sink, Configuration config) { - exists(PathNode source0, PathNode sink0 | - hasFlowPath(source0, sink0, config) and - source0.getNode() = source and - sink0.getNode() = sink - ) -} - -deprecated private predicate hasFlowPath(PathNode source, PathNode sink, Configuration config) { - I::flowPath(source, sink) and source.getConfiguration() = config -} - -deprecated private predicate hasFlowTo(Node sink, Configuration config) { hasFlow(_, sink, config) } - -deprecated predicate flowsTo = hasFlow/3; diff --git a/java/ql/lib/semmle/code/java/dataflow/internal/DataFlowImpl6.qll b/java/ql/lib/semmle/code/java/dataflow/internal/DataFlowImpl6.qll deleted file mode 100644 index 17def0c431d..00000000000 --- a/java/ql/lib/semmle/code/java/dataflow/internal/DataFlowImpl6.qll +++ /dev/null @@ -1,361 +0,0 @@ -/** - * DEPRECATED: Use `Global` and `GlobalWithState` instead. - * - * Provides a `Configuration` class backwards-compatible interface to the data - * flow library. - */ - -private import DataFlowImplCommon -private import DataFlowImplSpecific::Private -import DataFlowImplSpecific::Public -private import DataFlowImpl -import DataFlowImplCommonPublic -deprecated import FlowStateString -private import codeql.util.Unit - -/** - * DEPRECATED: Use `Global` and `GlobalWithState` instead. - * - * A configuration of interprocedural data flow analysis. This defines - * sources, sinks, and any other configurable aspect of the analysis. Each - * use of the global data flow library must define its own unique extension - * of this abstract class. To create a configuration, extend this class with - * a subclass whose characteristic predicate is a unique singleton string. - * For example, write - * - * ```ql - * class MyAnalysisConfiguration extends DataFlow::Configuration { - * MyAnalysisConfiguration() { this = "MyAnalysisConfiguration" } - * // Override `isSource` and `isSink`. - * // Optionally override `isBarrier`. - * // Optionally override `isAdditionalFlowStep`. - * } - * ``` - * Conceptually, this defines a graph where the nodes are `DataFlow::Node`s and - * the edges are those data-flow steps that preserve the value of the node - * along with any additional edges defined by `isAdditionalFlowStep`. - * Specifying nodes in `isBarrier` will remove those nodes from the graph, and - * specifying nodes in `isBarrierIn` and/or `isBarrierOut` will remove in-going - * and/or out-going edges from those nodes, respectively. - * - * Then, to query whether there is flow between some `source` and `sink`, - * write - * - * ```ql - * exists(MyAnalysisConfiguration cfg | cfg.hasFlow(source, sink)) - * ``` - * - * Multiple configurations can coexist, but two classes extending - * `DataFlow::Configuration` should never depend on each other. One of them - * should instead depend on a `DataFlow2::Configuration`, a - * `DataFlow3::Configuration`, or a `DataFlow4::Configuration`. - */ -abstract deprecated class Configuration extends string { - bindingset[this] - Configuration() { any() } - - /** - * Holds if `source` is a relevant data flow source. - */ - predicate isSource(Node source) { none() } - - /** - * Holds if `source` is a relevant data flow source with the given initial - * `state`. - */ - predicate isSource(Node source, FlowState state) { none() } - - /** - * Holds if `sink` is a relevant data flow sink. - */ - predicate isSink(Node sink) { none() } - - /** - * Holds if `sink` is a relevant data flow sink accepting `state`. - */ - predicate isSink(Node sink, FlowState state) { none() } - - /** - * Holds if data flow through `node` is prohibited. This completely removes - * `node` from the data flow graph. - */ - predicate isBarrier(Node node) { none() } - - /** - * Holds if data flow through `node` is prohibited when the flow state is - * `state`. - */ - predicate isBarrier(Node node, FlowState state) { none() } - - /** Holds if data flow into `node` is prohibited. */ - predicate isBarrierIn(Node node) { none() } - - /** Holds if data flow out of `node` is prohibited. */ - predicate isBarrierOut(Node node) { none() } - - /** - * Holds if data may flow from `node1` to `node2` in addition to the normal data-flow steps. - */ - predicate isAdditionalFlowStep(Node node1, Node node2) { none() } - - /** - * Holds if data may flow from `node1` to `node2` in addition to the normal data-flow steps. - * This step is only applicable in `state1` and updates the flow state to `state2`. - */ - predicate isAdditionalFlowStep(Node node1, FlowState state1, Node node2, FlowState state2) { - none() - } - - /** - * Holds if an arbitrary number of implicit read steps of content `c` may be - * taken at `node`. - */ - predicate allowImplicitRead(Node node, ContentSet c) { none() } - - /** - * Gets the virtual dispatch branching limit when calculating field flow. - * This can be overridden to a smaller value to improve performance (a - * value of 0 disables field flow), or a larger value to get more results. - */ - int fieldFlowBranchLimit() { result = 2 } - - /** - * Gets a data flow configuration feature to add restrictions to the set of - * valid flow paths. - * - * - `FeatureHasSourceCallContext`: - * Assume that sources have some existing call context to disallow - * conflicting return-flow directly following the source. - * - `FeatureHasSinkCallContext`: - * Assume that sinks have some existing call context to disallow - * conflicting argument-to-parameter flow directly preceding the sink. - * - `FeatureEqualSourceSinkCallContext`: - * Implies both of the above and additionally ensures that the entire flow - * path preserves the call context. - * - * These features are generally not relevant for typical end-to-end data flow - * queries, but should only be used for constructing paths that need to - * somehow be pluggable in another path context. - */ - FlowFeature getAFeature() { none() } - - /** Holds if sources should be grouped in the result of `hasFlowPath`. */ - predicate sourceGrouping(Node source, string sourceGroup) { none() } - - /** Holds if sinks should be grouped in the result of `hasFlowPath`. */ - predicate sinkGrouping(Node sink, string sinkGroup) { none() } - - /** - * Holds if data may flow from `source` to `sink` for this configuration. - */ - predicate hasFlow(Node source, Node sink) { hasFlow(source, sink, this) } - - /** - * Holds if data may flow from `source` to `sink` for this configuration. - * - * The corresponding paths are generated from the end-points and the graph - * included in the module `PathGraph`. - */ - predicate hasFlowPath(PathNode source, PathNode sink) { hasFlowPath(source, sink, this) } - - /** - * Holds if data may flow from some source to `sink` for this configuration. - */ - predicate hasFlowTo(Node sink) { hasFlowTo(sink, this) } - - /** - * Holds if data may flow from some source to `sink` for this configuration. - */ - predicate hasFlowToExpr(DataFlowExpr sink) { this.hasFlowTo(exprNode(sink)) } - - /** - * Holds if hidden nodes should be included in the data flow graph. - * - * This feature should only be used for debugging or when the data flow graph - * is not visualized (for example in a `path-problem` query). - */ - predicate includeHiddenNodes() { none() } -} - -/** - * This class exists to prevent mutual recursion between the user-overridden - * member predicates of `Configuration` and the rest of the data-flow library. - * Good performance cannot be guaranteed in the presence of such recursion, so - * it should be replaced by using more than one copy of the data flow library. - */ -abstract deprecated private class ConfigurationRecursionPrevention extends Configuration { - bindingset[this] - ConfigurationRecursionPrevention() { any() } - - override predicate hasFlow(Node source, Node sink) { - strictcount(Node n | this.isSource(n)) < 0 - or - strictcount(Node n | this.isSource(n, _)) < 0 - or - strictcount(Node n | this.isSink(n)) < 0 - or - strictcount(Node n | this.isSink(n, _)) < 0 - or - strictcount(Node n1, Node n2 | this.isAdditionalFlowStep(n1, n2)) < 0 - or - strictcount(Node n1, Node n2 | this.isAdditionalFlowStep(n1, _, n2, _)) < 0 - or - super.hasFlow(source, sink) - } -} - -deprecated private FlowState relevantState(Configuration config) { - config.isSource(_, result) or - config.isSink(_, result) or - config.isBarrier(_, result) or - config.isAdditionalFlowStep(_, result, _, _) or - config.isAdditionalFlowStep(_, _, _, result) -} - -private newtype TConfigState = - deprecated TMkConfigState(Configuration config, FlowState state) { - state = relevantState(config) or state instanceof FlowStateEmpty - } - -deprecated private Configuration getConfig(TConfigState state) { state = TMkConfigState(result, _) } - -deprecated private FlowState getState(TConfigState state) { state = TMkConfigState(_, result) } - -deprecated private predicate singleConfiguration() { 1 = strictcount(Configuration c) } - -deprecated private module Config implements FullStateConfigSig { - class FlowState = TConfigState; - - predicate isSource(Node source, FlowState state) { - getConfig(state).isSource(source, getState(state)) - or - getConfig(state).isSource(source) and getState(state) instanceof FlowStateEmpty - } - - predicate isSink(Node sink) { none() } - - predicate isSink(Node sink, FlowState state) { - getConfig(state).isSink(sink, getState(state)) - or - getConfig(state).isSink(sink) and getState(state) instanceof FlowStateEmpty - } - - predicate isBarrier(Node node) { none() } - - predicate isBarrier(Node node, FlowState state) { - getConfig(state).isBarrier(node, getState(state)) or - getConfig(state).isBarrier(node) - } - - predicate isBarrierIn(Node node) { any(Configuration config).isBarrierIn(node) } - - predicate isBarrierOut(Node node) { any(Configuration config).isBarrierOut(node) } - - predicate isBarrierIn(Node node, FlowState state) { none() } - - predicate isBarrierOut(Node node, FlowState state) { none() } - - predicate isAdditionalFlowStep(Node node1, Node node2, string model) { - singleConfiguration() and - any(Configuration config).isAdditionalFlowStep(node1, node2) and - model = "" - } - - predicate isAdditionalFlowStep( - Node node1, FlowState state1, Node node2, FlowState state2, string model - ) { - getConfig(state1).isAdditionalFlowStep(node1, getState(state1), node2, getState(state2)) and - getConfig(state2) = getConfig(state1) and - model = "" - or - not singleConfiguration() and - getConfig(state1).isAdditionalFlowStep(node1, node2) and - state2 = state1 and - model = "" - } - - predicate allowImplicitRead(Node node, ContentSet c) { - any(Configuration config).allowImplicitRead(node, c) - } - - predicate neverSkip(Node node) { none() } - - int fieldFlowBranchLimit() { result = min(any(Configuration config).fieldFlowBranchLimit()) } - - int accessPathLimit() { result = 5 } - - FlowFeature getAFeature() { result = any(Configuration config).getAFeature() } - - predicate includeHiddenNodes() { any(Configuration config).includeHiddenNodes() } - - predicate observeDiffInformedIncrementalMode() { none() } -} - -deprecated private import Impl as I - -/** - * A `Node` augmented with a call context (except for sinks), an access path, and a configuration. - * Only those `PathNode`s that are reachable from a source, and which can reach a sink, are generated. - */ -deprecated class PathNode instanceof I::PathNode { - /** Gets a textual representation of this element. */ - final string toString() { result = super.toString() } - - /** - * Gets a textual representation of this element, including a textual - * representation of the call context. - */ - final string toStringWithContext() { result = super.toStringWithContext() } - - /** - * Holds if this element is at the specified location. - * The location spans column `startcolumn` of line `startline` to - * column `endcolumn` of line `endline` in file `filepath`. - * For more information, see - * [Locations](https://codeql.github.com/docs/writing-codeql-queries/providing-locations-in-codeql-queries/). - */ - final predicate hasLocationInfo( - string filepath, int startline, int startcolumn, int endline, int endcolumn - ) { - super.hasLocationInfo(filepath, startline, startcolumn, endline, endcolumn) - } - - /** Gets the underlying `Node`. */ - final Node getNode() { result = super.getNode() } - - /** Gets the `FlowState` of this node. */ - deprecated final FlowState getState() { result = getState(super.getState()) } - - /** Gets the associated configuration. */ - deprecated final Configuration getConfiguration() { result = getConfig(super.getState()) } - - /** Gets a successor of this node, if any. */ - final PathNode getASuccessor() { result = super.getASuccessor() } - - /** Holds if this node is a source. */ - final predicate isSource() { super.isSource() } - - /** Holds if this node is a grouping of source nodes. */ - final predicate isSourceGroup(string group) { super.isSourceGroup(group) } - - /** Holds if this node is a grouping of sink nodes. */ - final predicate isSinkGroup(string group) { super.isSinkGroup(group) } -} - -deprecated module PathGraph = I::PathGraph; - -deprecated private predicate hasFlow(Node source, Node sink, Configuration config) { - exists(PathNode source0, PathNode sink0 | - hasFlowPath(source0, sink0, config) and - source0.getNode() = source and - sink0.getNode() = sink - ) -} - -deprecated private predicate hasFlowPath(PathNode source, PathNode sink, Configuration config) { - I::flowPath(source, sink) and source.getConfiguration() = config -} - -deprecated private predicate hasFlowTo(Node sink, Configuration config) { hasFlow(_, sink, config) } - -deprecated predicate flowsTo = hasFlow/3; diff --git a/java/ql/lib/semmle/code/java/dataflow/internal/DataFlowUtil.qll b/java/ql/lib/semmle/code/java/dataflow/internal/DataFlowUtil.qll index c1fc51bff04..bb71ed25c73 100644 --- a/java/ql/lib/semmle/code/java/dataflow/internal/DataFlowUtil.qll +++ b/java/ql/lib/semmle/code/java/dataflow/internal/DataFlowUtil.qll @@ -160,11 +160,8 @@ predicate localMustFlowStep(Node node1, Node node2) { or node2.asExpr().(AssignExpr).getSource() = node1.asExpr() or - node1 = - unique(FlowSummaryNode n1 | - FlowSummaryImpl::Private::Steps::summaryLocalStep(n1.getSummaryNode(), - node2.(FlowSummaryNode).getSummaryNode(), true, _) - ) + FlowSummaryImpl::Private::Steps::summaryLocalMustFlowStep(node1.(FlowSummaryNode).getSummaryNode(), + node2.(FlowSummaryNode).getSummaryNode()) } import Cached diff --git a/java/ql/lib/semmle/code/java/dataflow/internal/tainttracking1/TaintTrackingImpl.qll b/java/ql/lib/semmle/code/java/dataflow/internal/tainttracking1/TaintTrackingImpl.qll deleted file mode 100644 index 75e7856fd26..00000000000 --- a/java/ql/lib/semmle/code/java/dataflow/internal/tainttracking1/TaintTrackingImpl.qll +++ /dev/null @@ -1,168 +0,0 @@ -/** - * DEPRECATED: Use `Global` and `GlobalWithState` instead. - * - * Provides an implementation of global (interprocedural) taint tracking. - * This file re-exports the local (intraprocedural) taint-tracking analysis - * from `TaintTrackingParameter::Public` and adds a global analysis, mainly - * exposed through the `Configuration` class. For some languages, this file - * exists in several identical copies, allowing queries to use multiple - * `Configuration` classes that depend on each other without introducing - * mutual recursion among those configurations. - */ - -import TaintTrackingParameter::Public -private import TaintTrackingParameter::Private - -/** - * DEPRECATED: Use `Global` and `GlobalWithState` instead. - * - * A configuration of interprocedural taint tracking analysis. This defines - * sources, sinks, and any other configurable aspect of the analysis. Each - * use of the taint tracking library must define its own unique extension of - * this abstract class. - * - * A taint-tracking configuration is a special data flow configuration - * (`DataFlow::Configuration`) that allows for flow through nodes that do not - * necessarily preserve values but are still relevant from a taint tracking - * perspective. (For example, string concatenation, where one of the operands - * is tainted.) - * - * To create a configuration, extend this class with a subclass whose - * characteristic predicate is a unique singleton string. For example, write - * - * ```ql - * class MyAnalysisConfiguration extends TaintTracking::Configuration { - * MyAnalysisConfiguration() { this = "MyAnalysisConfiguration" } - * // Override `isSource` and `isSink`. - * // Optionally override `isSanitizer`. - * // Optionally override `isSanitizerIn`. - * // Optionally override `isSanitizerOut`. - * // Optionally override `isSanitizerGuard`. - * // Optionally override `isAdditionalTaintStep`. - * } - * ``` - * - * Then, to query whether there is flow between some `source` and `sink`, - * write - * - * ```ql - * exists(MyAnalysisConfiguration cfg | cfg.hasFlow(source, sink)) - * ``` - * - * Multiple configurations can coexist, but it is unsupported to depend on - * another `TaintTracking::Configuration` or a `DataFlow::Configuration` in the - * overridden predicates that define sources, sinks, or additional steps. - * Instead, the dependency should go to a `TaintTracking2::Configuration` or a - * `DataFlow2::Configuration`, `DataFlow3::Configuration`, etc. - */ -abstract deprecated class Configuration extends DataFlow::Configuration { - bindingset[this] - Configuration() { any() } - - /** - * Holds if `source` is a relevant taint source. - * - * The smaller this predicate is, the faster `hasFlow()` will converge. - */ - // overridden to provide taint-tracking specific qldoc - override predicate isSource(DataFlow::Node source) { none() } - - /** - * Holds if `source` is a relevant taint source with the given initial - * `state`. - * - * The smaller this predicate is, the faster `hasFlow()` will converge. - */ - // overridden to provide taint-tracking specific qldoc - override predicate isSource(DataFlow::Node source, DataFlow::FlowState state) { none() } - - /** - * Holds if `sink` is a relevant taint sink - * - * The smaller this predicate is, the faster `hasFlow()` will converge. - */ - // overridden to provide taint-tracking specific qldoc - override predicate isSink(DataFlow::Node sink) { none() } - - /** - * Holds if `sink` is a relevant taint sink accepting `state`. - * - * The smaller this predicate is, the faster `hasFlow()` will converge. - */ - // overridden to provide taint-tracking specific qldoc - override predicate isSink(DataFlow::Node sink, DataFlow::FlowState state) { none() } - - /** Holds if the node `node` is a taint sanitizer. */ - predicate isSanitizer(DataFlow::Node node) { none() } - - final override predicate isBarrier(DataFlow::Node node) { - this.isSanitizer(node) or - defaultTaintSanitizer(node) - } - - /** - * Holds if the node `node` is a taint sanitizer when the flow state is - * `state`. - */ - predicate isSanitizer(DataFlow::Node node, DataFlow::FlowState state) { none() } - - final override predicate isBarrier(DataFlow::Node node, DataFlow::FlowState state) { - this.isSanitizer(node, state) - } - - /** Holds if taint propagation into `node` is prohibited. */ - predicate isSanitizerIn(DataFlow::Node node) { none() } - - final override predicate isBarrierIn(DataFlow::Node node) { this.isSanitizerIn(node) } - - /** Holds if taint propagation out of `node` is prohibited. */ - predicate isSanitizerOut(DataFlow::Node node) { none() } - - final override predicate isBarrierOut(DataFlow::Node node) { this.isSanitizerOut(node) } - - /** - * Holds if taint may propagate from `node1` to `node2` in addition to the normal data-flow and taint steps. - */ - predicate isAdditionalTaintStep(DataFlow::Node node1, DataFlow::Node node2) { none() } - - final override predicate isAdditionalFlowStep(DataFlow::Node node1, DataFlow::Node node2) { - this.isAdditionalTaintStep(node1, node2) or - defaultAdditionalTaintStep(node1, node2, _) - } - - /** - * Holds if taint may propagate from `node1` to `node2` in addition to the normal data-flow and taint steps. - * This step is only applicable in `state1` and updates the flow state to `state2`. - */ - predicate isAdditionalTaintStep( - DataFlow::Node node1, DataFlow::FlowState state1, DataFlow::Node node2, - DataFlow::FlowState state2 - ) { - none() - } - - final override predicate isAdditionalFlowStep( - DataFlow::Node node1, DataFlow::FlowState state1, DataFlow::Node node2, - DataFlow::FlowState state2 - ) { - this.isAdditionalTaintStep(node1, state1, node2, state2) - } - - override predicate allowImplicitRead(DataFlow::Node node, DataFlow::ContentSet c) { - ( - this.isSink(node) or - this.isSink(node, _) or - this.isAdditionalTaintStep(node, _) or - this.isAdditionalTaintStep(node, _, _, _) - ) and - defaultImplicitTaintRead(node, c) - } - - /** - * Holds if taint may flow from `source` to `sink` for this configuration. - */ - // overridden to provide taint-tracking specific qldoc - override predicate hasFlow(DataFlow::Node source, DataFlow::Node sink) { - super.hasFlow(source, sink) - } -} diff --git a/java/ql/lib/semmle/code/java/dataflow/internal/tainttracking1/TaintTrackingParameter.qll b/java/ql/lib/semmle/code/java/dataflow/internal/tainttracking1/TaintTrackingParameter.qll deleted file mode 100644 index 2608adffda3..00000000000 --- a/java/ql/lib/semmle/code/java/dataflow/internal/tainttracking1/TaintTrackingParameter.qll +++ /dev/null @@ -1,6 +0,0 @@ -import semmle.code.java.dataflow.internal.TaintTrackingUtil as Public - -module Private { - import semmle.code.java.dataflow.DataFlow::DataFlow as DataFlow - import semmle.code.java.dataflow.internal.DataFlowImpl as DataFlowInternal -} diff --git a/java/ql/lib/semmle/code/java/dataflow/internal/tainttracking2/TaintTrackingImpl.qll b/java/ql/lib/semmle/code/java/dataflow/internal/tainttracking2/TaintTrackingImpl.qll deleted file mode 100644 index 75e7856fd26..00000000000 --- a/java/ql/lib/semmle/code/java/dataflow/internal/tainttracking2/TaintTrackingImpl.qll +++ /dev/null @@ -1,168 +0,0 @@ -/** - * DEPRECATED: Use `Global` and `GlobalWithState` instead. - * - * Provides an implementation of global (interprocedural) taint tracking. - * This file re-exports the local (intraprocedural) taint-tracking analysis - * from `TaintTrackingParameter::Public` and adds a global analysis, mainly - * exposed through the `Configuration` class. For some languages, this file - * exists in several identical copies, allowing queries to use multiple - * `Configuration` classes that depend on each other without introducing - * mutual recursion among those configurations. - */ - -import TaintTrackingParameter::Public -private import TaintTrackingParameter::Private - -/** - * DEPRECATED: Use `Global` and `GlobalWithState` instead. - * - * A configuration of interprocedural taint tracking analysis. This defines - * sources, sinks, and any other configurable aspect of the analysis. Each - * use of the taint tracking library must define its own unique extension of - * this abstract class. - * - * A taint-tracking configuration is a special data flow configuration - * (`DataFlow::Configuration`) that allows for flow through nodes that do not - * necessarily preserve values but are still relevant from a taint tracking - * perspective. (For example, string concatenation, where one of the operands - * is tainted.) - * - * To create a configuration, extend this class with a subclass whose - * characteristic predicate is a unique singleton string. For example, write - * - * ```ql - * class MyAnalysisConfiguration extends TaintTracking::Configuration { - * MyAnalysisConfiguration() { this = "MyAnalysisConfiguration" } - * // Override `isSource` and `isSink`. - * // Optionally override `isSanitizer`. - * // Optionally override `isSanitizerIn`. - * // Optionally override `isSanitizerOut`. - * // Optionally override `isSanitizerGuard`. - * // Optionally override `isAdditionalTaintStep`. - * } - * ``` - * - * Then, to query whether there is flow between some `source` and `sink`, - * write - * - * ```ql - * exists(MyAnalysisConfiguration cfg | cfg.hasFlow(source, sink)) - * ``` - * - * Multiple configurations can coexist, but it is unsupported to depend on - * another `TaintTracking::Configuration` or a `DataFlow::Configuration` in the - * overridden predicates that define sources, sinks, or additional steps. - * Instead, the dependency should go to a `TaintTracking2::Configuration` or a - * `DataFlow2::Configuration`, `DataFlow3::Configuration`, etc. - */ -abstract deprecated class Configuration extends DataFlow::Configuration { - bindingset[this] - Configuration() { any() } - - /** - * Holds if `source` is a relevant taint source. - * - * The smaller this predicate is, the faster `hasFlow()` will converge. - */ - // overridden to provide taint-tracking specific qldoc - override predicate isSource(DataFlow::Node source) { none() } - - /** - * Holds if `source` is a relevant taint source with the given initial - * `state`. - * - * The smaller this predicate is, the faster `hasFlow()` will converge. - */ - // overridden to provide taint-tracking specific qldoc - override predicate isSource(DataFlow::Node source, DataFlow::FlowState state) { none() } - - /** - * Holds if `sink` is a relevant taint sink - * - * The smaller this predicate is, the faster `hasFlow()` will converge. - */ - // overridden to provide taint-tracking specific qldoc - override predicate isSink(DataFlow::Node sink) { none() } - - /** - * Holds if `sink` is a relevant taint sink accepting `state`. - * - * The smaller this predicate is, the faster `hasFlow()` will converge. - */ - // overridden to provide taint-tracking specific qldoc - override predicate isSink(DataFlow::Node sink, DataFlow::FlowState state) { none() } - - /** Holds if the node `node` is a taint sanitizer. */ - predicate isSanitizer(DataFlow::Node node) { none() } - - final override predicate isBarrier(DataFlow::Node node) { - this.isSanitizer(node) or - defaultTaintSanitizer(node) - } - - /** - * Holds if the node `node` is a taint sanitizer when the flow state is - * `state`. - */ - predicate isSanitizer(DataFlow::Node node, DataFlow::FlowState state) { none() } - - final override predicate isBarrier(DataFlow::Node node, DataFlow::FlowState state) { - this.isSanitizer(node, state) - } - - /** Holds if taint propagation into `node` is prohibited. */ - predicate isSanitizerIn(DataFlow::Node node) { none() } - - final override predicate isBarrierIn(DataFlow::Node node) { this.isSanitizerIn(node) } - - /** Holds if taint propagation out of `node` is prohibited. */ - predicate isSanitizerOut(DataFlow::Node node) { none() } - - final override predicate isBarrierOut(DataFlow::Node node) { this.isSanitizerOut(node) } - - /** - * Holds if taint may propagate from `node1` to `node2` in addition to the normal data-flow and taint steps. - */ - predicate isAdditionalTaintStep(DataFlow::Node node1, DataFlow::Node node2) { none() } - - final override predicate isAdditionalFlowStep(DataFlow::Node node1, DataFlow::Node node2) { - this.isAdditionalTaintStep(node1, node2) or - defaultAdditionalTaintStep(node1, node2, _) - } - - /** - * Holds if taint may propagate from `node1` to `node2` in addition to the normal data-flow and taint steps. - * This step is only applicable in `state1` and updates the flow state to `state2`. - */ - predicate isAdditionalTaintStep( - DataFlow::Node node1, DataFlow::FlowState state1, DataFlow::Node node2, - DataFlow::FlowState state2 - ) { - none() - } - - final override predicate isAdditionalFlowStep( - DataFlow::Node node1, DataFlow::FlowState state1, DataFlow::Node node2, - DataFlow::FlowState state2 - ) { - this.isAdditionalTaintStep(node1, state1, node2, state2) - } - - override predicate allowImplicitRead(DataFlow::Node node, DataFlow::ContentSet c) { - ( - this.isSink(node) or - this.isSink(node, _) or - this.isAdditionalTaintStep(node, _) or - this.isAdditionalTaintStep(node, _, _, _) - ) and - defaultImplicitTaintRead(node, c) - } - - /** - * Holds if taint may flow from `source` to `sink` for this configuration. - */ - // overridden to provide taint-tracking specific qldoc - override predicate hasFlow(DataFlow::Node source, DataFlow::Node sink) { - super.hasFlow(source, sink) - } -} diff --git a/java/ql/lib/semmle/code/java/dataflow/internal/tainttracking2/TaintTrackingParameter.qll b/java/ql/lib/semmle/code/java/dataflow/internal/tainttracking2/TaintTrackingParameter.qll deleted file mode 100644 index 5a9c924b6bd..00000000000 --- a/java/ql/lib/semmle/code/java/dataflow/internal/tainttracking2/TaintTrackingParameter.qll +++ /dev/null @@ -1,5 +0,0 @@ -import semmle.code.java.dataflow.internal.TaintTrackingUtil as Public - -module Private { - import semmle.code.java.dataflow.DataFlow2::DataFlow2 as DataFlow -} diff --git a/java/ql/lib/semmle/code/java/dataflow/internal/tainttracking3/TaintTrackingImpl.qll b/java/ql/lib/semmle/code/java/dataflow/internal/tainttracking3/TaintTrackingImpl.qll deleted file mode 100644 index 75e7856fd26..00000000000 --- a/java/ql/lib/semmle/code/java/dataflow/internal/tainttracking3/TaintTrackingImpl.qll +++ /dev/null @@ -1,168 +0,0 @@ -/** - * DEPRECATED: Use `Global` and `GlobalWithState` instead. - * - * Provides an implementation of global (interprocedural) taint tracking. - * This file re-exports the local (intraprocedural) taint-tracking analysis - * from `TaintTrackingParameter::Public` and adds a global analysis, mainly - * exposed through the `Configuration` class. For some languages, this file - * exists in several identical copies, allowing queries to use multiple - * `Configuration` classes that depend on each other without introducing - * mutual recursion among those configurations. - */ - -import TaintTrackingParameter::Public -private import TaintTrackingParameter::Private - -/** - * DEPRECATED: Use `Global` and `GlobalWithState` instead. - * - * A configuration of interprocedural taint tracking analysis. This defines - * sources, sinks, and any other configurable aspect of the analysis. Each - * use of the taint tracking library must define its own unique extension of - * this abstract class. - * - * A taint-tracking configuration is a special data flow configuration - * (`DataFlow::Configuration`) that allows for flow through nodes that do not - * necessarily preserve values but are still relevant from a taint tracking - * perspective. (For example, string concatenation, where one of the operands - * is tainted.) - * - * To create a configuration, extend this class with a subclass whose - * characteristic predicate is a unique singleton string. For example, write - * - * ```ql - * class MyAnalysisConfiguration extends TaintTracking::Configuration { - * MyAnalysisConfiguration() { this = "MyAnalysisConfiguration" } - * // Override `isSource` and `isSink`. - * // Optionally override `isSanitizer`. - * // Optionally override `isSanitizerIn`. - * // Optionally override `isSanitizerOut`. - * // Optionally override `isSanitizerGuard`. - * // Optionally override `isAdditionalTaintStep`. - * } - * ``` - * - * Then, to query whether there is flow between some `source` and `sink`, - * write - * - * ```ql - * exists(MyAnalysisConfiguration cfg | cfg.hasFlow(source, sink)) - * ``` - * - * Multiple configurations can coexist, but it is unsupported to depend on - * another `TaintTracking::Configuration` or a `DataFlow::Configuration` in the - * overridden predicates that define sources, sinks, or additional steps. - * Instead, the dependency should go to a `TaintTracking2::Configuration` or a - * `DataFlow2::Configuration`, `DataFlow3::Configuration`, etc. - */ -abstract deprecated class Configuration extends DataFlow::Configuration { - bindingset[this] - Configuration() { any() } - - /** - * Holds if `source` is a relevant taint source. - * - * The smaller this predicate is, the faster `hasFlow()` will converge. - */ - // overridden to provide taint-tracking specific qldoc - override predicate isSource(DataFlow::Node source) { none() } - - /** - * Holds if `source` is a relevant taint source with the given initial - * `state`. - * - * The smaller this predicate is, the faster `hasFlow()` will converge. - */ - // overridden to provide taint-tracking specific qldoc - override predicate isSource(DataFlow::Node source, DataFlow::FlowState state) { none() } - - /** - * Holds if `sink` is a relevant taint sink - * - * The smaller this predicate is, the faster `hasFlow()` will converge. - */ - // overridden to provide taint-tracking specific qldoc - override predicate isSink(DataFlow::Node sink) { none() } - - /** - * Holds if `sink` is a relevant taint sink accepting `state`. - * - * The smaller this predicate is, the faster `hasFlow()` will converge. - */ - // overridden to provide taint-tracking specific qldoc - override predicate isSink(DataFlow::Node sink, DataFlow::FlowState state) { none() } - - /** Holds if the node `node` is a taint sanitizer. */ - predicate isSanitizer(DataFlow::Node node) { none() } - - final override predicate isBarrier(DataFlow::Node node) { - this.isSanitizer(node) or - defaultTaintSanitizer(node) - } - - /** - * Holds if the node `node` is a taint sanitizer when the flow state is - * `state`. - */ - predicate isSanitizer(DataFlow::Node node, DataFlow::FlowState state) { none() } - - final override predicate isBarrier(DataFlow::Node node, DataFlow::FlowState state) { - this.isSanitizer(node, state) - } - - /** Holds if taint propagation into `node` is prohibited. */ - predicate isSanitizerIn(DataFlow::Node node) { none() } - - final override predicate isBarrierIn(DataFlow::Node node) { this.isSanitizerIn(node) } - - /** Holds if taint propagation out of `node` is prohibited. */ - predicate isSanitizerOut(DataFlow::Node node) { none() } - - final override predicate isBarrierOut(DataFlow::Node node) { this.isSanitizerOut(node) } - - /** - * Holds if taint may propagate from `node1` to `node2` in addition to the normal data-flow and taint steps. - */ - predicate isAdditionalTaintStep(DataFlow::Node node1, DataFlow::Node node2) { none() } - - final override predicate isAdditionalFlowStep(DataFlow::Node node1, DataFlow::Node node2) { - this.isAdditionalTaintStep(node1, node2) or - defaultAdditionalTaintStep(node1, node2, _) - } - - /** - * Holds if taint may propagate from `node1` to `node2` in addition to the normal data-flow and taint steps. - * This step is only applicable in `state1` and updates the flow state to `state2`. - */ - predicate isAdditionalTaintStep( - DataFlow::Node node1, DataFlow::FlowState state1, DataFlow::Node node2, - DataFlow::FlowState state2 - ) { - none() - } - - final override predicate isAdditionalFlowStep( - DataFlow::Node node1, DataFlow::FlowState state1, DataFlow::Node node2, - DataFlow::FlowState state2 - ) { - this.isAdditionalTaintStep(node1, state1, node2, state2) - } - - override predicate allowImplicitRead(DataFlow::Node node, DataFlow::ContentSet c) { - ( - this.isSink(node) or - this.isSink(node, _) or - this.isAdditionalTaintStep(node, _) or - this.isAdditionalTaintStep(node, _, _, _) - ) and - defaultImplicitTaintRead(node, c) - } - - /** - * Holds if taint may flow from `source` to `sink` for this configuration. - */ - // overridden to provide taint-tracking specific qldoc - override predicate hasFlow(DataFlow::Node source, DataFlow::Node sink) { - super.hasFlow(source, sink) - } -} diff --git a/java/ql/lib/semmle/code/java/dataflow/internal/tainttracking3/TaintTrackingParameter.qll b/java/ql/lib/semmle/code/java/dataflow/internal/tainttracking3/TaintTrackingParameter.qll deleted file mode 100644 index 10fb6b09fa8..00000000000 --- a/java/ql/lib/semmle/code/java/dataflow/internal/tainttracking3/TaintTrackingParameter.qll +++ /dev/null @@ -1,5 +0,0 @@ -import semmle.code.java.dataflow.internal.TaintTrackingUtil as Public - -module Private { - import semmle.code.java.dataflow.DataFlow3::DataFlow3 as DataFlow -} diff --git a/java/ql/lib/semmle/code/java/frameworks/JsonIo.qll b/java/ql/lib/semmle/code/java/frameworks/JsonIo.qll index d40e7ebf81e..85f3a5ef06b 100644 --- a/java/ql/lib/semmle/code/java/frameworks/JsonIo.qll +++ b/java/ql/lib/semmle/code/java/frameworks/JsonIo.qll @@ -5,8 +5,6 @@ import java import semmle.code.java.Maps import semmle.code.java.dataflow.DataFlow -deprecated import semmle.code.java.dataflow.DataFlow2 -private import semmle.code.java.dataflow.DataFlow2 /** * The class `com.cedarsoftware.util.io.JsonReader`. diff --git a/java/ql/lib/semmle/code/java/security/AndroidIntentRedirectionQuery.qll b/java/ql/lib/semmle/code/java/security/AndroidIntentRedirectionQuery.qll index 109300458d2..7625f9d7da4 100644 --- a/java/ql/lib/semmle/code/java/security/AndroidIntentRedirectionQuery.qll +++ b/java/ql/lib/semmle/code/java/security/AndroidIntentRedirectionQuery.qll @@ -2,9 +2,7 @@ import java import semmle.code.java.dataflow.FlowSources -deprecated import semmle.code.java.dataflow.DataFlow2 import semmle.code.java.dataflow.TaintTracking -deprecated import semmle.code.java.dataflow.TaintTracking3 import semmle.code.java.security.AndroidIntentRedirection /** A taint tracking configuration for tainted Intents being used to start Android components. */ diff --git a/java/ql/lib/semmle/code/java/security/CleartextStorageCookieQuery.qll b/java/ql/lib/semmle/code/java/security/CleartextStorageCookieQuery.qll index a36a4754584..1f262ad57d6 100644 --- a/java/ql/lib/semmle/code/java/security/CleartextStorageCookieQuery.qll +++ b/java/ql/lib/semmle/code/java/security/CleartextStorageCookieQuery.qll @@ -2,7 +2,6 @@ import java import semmle.code.java.dataflow.DataFlow -deprecated import semmle.code.java.dataflow.DataFlow3 import semmle.code.java.security.CleartextStorageQuery private import semmle.code.java.dataflow.FlowSinks private import semmle.code.java.dataflow.FlowSources diff --git a/java/ql/lib/semmle/code/java/security/HardcodedCredentialsSourceCallQuery.qll b/java/ql/lib/semmle/code/java/security/HardcodedCredentialsSourceCallQuery.qll index 2192c5c70de..06d7869ce99 100644 --- a/java/ql/lib/semmle/code/java/security/HardcodedCredentialsSourceCallQuery.qll +++ b/java/ql/lib/semmle/code/java/security/HardcodedCredentialsSourceCallQuery.qll @@ -4,8 +4,6 @@ import java import semmle.code.java.dataflow.DataFlow -deprecated import semmle.code.java.dataflow.DataFlow2 -private import semmle.code.java.dataflow.DataFlow2 import HardcodedCredentials /** diff --git a/java/ql/lib/semmle/code/java/security/ImplicitPendingIntents.qll b/java/ql/lib/semmle/code/java/security/ImplicitPendingIntents.qll index a5d8f256b03..650527e88e4 100644 --- a/java/ql/lib/semmle/code/java/security/ImplicitPendingIntents.qll +++ b/java/ql/lib/semmle/code/java/security/ImplicitPendingIntents.qll @@ -26,24 +26,10 @@ class NoState extends PendingIntentState, TNoState { } /** A source for an implicit `PendingIntent` flow. */ -abstract class ImplicitPendingIntentSource extends ApiSourceNode { - /** - * DEPRECATED: Open-ended flow state is not intended to be part of the extension points. - * - * Holds if this source has the specified `state`. - */ - deprecated predicate hasState(DataFlow::FlowState state) { state = "" } -} +abstract class ImplicitPendingIntentSource extends ApiSourceNode { } /** A sink that sends an implicit and mutable `PendingIntent` to a third party. */ -abstract class ImplicitPendingIntentSink extends DataFlow::Node { - /** - * DEPRECATED: Open-ended flow state is not intended to be part of the extension points. - * - * Holds if this sink has the specified `state`. - */ - deprecated predicate hasState(DataFlow::FlowState state) { state = "" } -} +abstract class ImplicitPendingIntentSink extends DataFlow::Node { } /** * A unit class for adding additional taint steps. @@ -62,21 +48,6 @@ class ImplicitPendingIntentAdditionalTaintStep extends Unit { * Holds if the step from `node1` to `node2` creates a mutable `PendingIntent`. */ predicate mutablePendingIntentCreation(DataFlow::Node node1, DataFlow::Node node2) { none() } - - /** - * DEPRECATED: Open-ended flow state is not intended to be part of the extension points. - * Use `mutablePendingIntentCreation` instead. - * - * Holds if the step from `node1` to `node2` should be considered a taint - * step for flows related to the use of implicit `PendingIntent`s. This step is only applicable - * in `state1` and updates the flow state to `state2`. - */ - deprecated predicate step( - DataFlow::Node node1, DataFlow::FlowState state1, DataFlow::Node node2, - DataFlow::FlowState state2 - ) { - none() - } } private class IntentCreationSource extends ImplicitPendingIntentSource { diff --git a/java/ql/lib/semmle/code/java/security/TemplateInjection.qll b/java/ql/lib/semmle/code/java/security/TemplateInjection.qll index a74f4db8030..0b703780a03 100644 --- a/java/ql/lib/semmle/code/java/security/TemplateInjection.qll +++ b/java/ql/lib/semmle/code/java/security/TemplateInjection.qll @@ -9,30 +9,12 @@ private import semmle.code.java.security.Sanitizers /** * A source for server-side template injection (SST) vulnerabilities. */ -abstract class TemplateInjectionSource extends DataFlow::Node { - /** - * DEPRECATED: Open-ended flow state is not intended to be part of the extension points. - * - * Holds if this source has the specified `state`. - */ - deprecated predicate hasState(DataFlow::FlowState state) { - state instanceof DataFlow::FlowStateEmpty - } -} +abstract class TemplateInjectionSource extends DataFlow::Node { } /** * A sink for server-side template injection (SST) vulnerabilities. */ -abstract class TemplateInjectionSink extends DataFlow::Node { - /** - * DEPRECATED: Open-ended flow state is not intended to be part of the extension points. - * - * Holds if this sink has the specified `state`. - */ - deprecated predicate hasState(DataFlow::FlowState state) { - state instanceof DataFlow::FlowStateEmpty - } -} +abstract class TemplateInjectionSink extends DataFlow::Node { } /** * A unit class for adding additional taint steps. @@ -46,20 +28,6 @@ class TemplateInjectionAdditionalTaintStep extends Unit { * step for flows related to server-side template injection (SST) vulnerabilities. */ predicate isAdditionalTaintStep(DataFlow::Node node1, DataFlow::Node node2) { none() } - - /** - * DEPRECATED: Open-ended flow state is not intended to be part of the extension points. - * - * Holds if the step from `node1` to `node2` should be considered a taint - * step for flows related toserver-side template injection (SST) vulnerabilities. - * This step is only applicable in `state1` and updates the flow state to `state2`. - */ - deprecated predicate isAdditionalTaintStep( - DataFlow::Node node1, DataFlow::FlowState state1, DataFlow::Node node2, - DataFlow::FlowState state2 - ) { - none() - } } /** @@ -67,22 +35,6 @@ class TemplateInjectionAdditionalTaintStep extends Unit { */ abstract class TemplateInjectionSanitizer extends DataFlow::Node { } -/** - * DEPRECATED: Open-ended flow state is not intended to be part of the extension points. - * - * A sanitizer for server-side template injection (SST) vulnerabilities. - * This sanitizer is only applicable when `TemplateInjectionSanitizerWithState::hasState` - * holds for the flow state. - */ -abstract deprecated class TemplateInjectionSanitizerWithState extends DataFlow::Node { - /** - * DEPRECATED: Open-ended flow state is not intended to be part of the extension points. - * - * Holds if this sanitizer has the specified `state`. - */ - abstract deprecated predicate hasState(DataFlow::FlowState state); -} - private class DefaultTemplateInjectionSource extends TemplateInjectionSource instanceof ActiveThreatModelSource { } diff --git a/java/ql/lib/semmle/code/java/security/UnsafeDeserializationQuery.qll b/java/ql/lib/semmle/code/java/security/UnsafeDeserializationQuery.qll index 9a627d54c5a..cb76ee37c7b 100644 --- a/java/ql/lib/semmle/code/java/security/UnsafeDeserializationQuery.qll +++ b/java/ql/lib/semmle/code/java/security/UnsafeDeserializationQuery.qll @@ -4,7 +4,6 @@ import semmle.code.java.dataflow.FlowSources private import semmle.code.java.dataflow.FlowSinks -private import semmle.code.java.dataflow.TaintTracking2 private import semmle.code.java.dispatch.VirtualDispatch private import semmle.code.java.frameworks.Kryo private import semmle.code.java.frameworks.XStream diff --git a/java/ql/lib/semmle/code/java/security/XmlParsers.qll b/java/ql/lib/semmle/code/java/security/XmlParsers.qll index 4a5b7121e60..fc0b52b6f78 100644 --- a/java/ql/lib/semmle/code/java/security/XmlParsers.qll +++ b/java/ql/lib/semmle/code/java/security/XmlParsers.qll @@ -2,8 +2,6 @@ import java import semmle.code.java.dataflow.DataFlow -deprecated import semmle.code.java.dataflow.DataFlow3 -private import semmle.code.java.dataflow.DataFlow3 private import semmle.code.java.dataflow.RangeUtils private module Frameworks { diff --git a/java/ql/src/CHANGELOG.md b/java/ql/src/CHANGELOG.md index 3a29e9e55e0..0bb38874b82 100644 --- a/java/ql/src/CHANGELOG.md +++ b/java/ql/src/CHANGELOG.md @@ -1,3 +1,15 @@ +## 1.1.10 + +### Minor Analysis Improvements + +* Added SHA-384 to the list of secure hashing algorithms. As a result the `java/potentially-weak-cryptographic-algorithm` query should no longer flag up uses of SHA-384. +* Added SHA3 to the list of secure hashing algorithms. As a result the `java/potentially-weak-cryptographic-algorithm` query should no longer flag up uses of SHA3. +* The `java/weak-cryptographic-algorithm` query has been updated to no longer report uses of hash functions such as `MD5` and `SHA1` even if they are known to be weak. These hash algorithms are used very often in non-sensitive contexts, making the query too imprecise in practice. The `java/potentially-weak-cryptographic-algorithm` query has been updated to report these uses instead. + +## 1.1.9 + +No user-facing changes. + ## 1.1.8 No user-facing changes. diff --git a/java/ql/src/change-notes/2024-11-22-sha3.md b/java/ql/src/change-notes/2024-11-22-sha3.md deleted file mode 100644 index 61dbc35162e..00000000000 --- a/java/ql/src/change-notes/2024-11-22-sha3.md +++ /dev/null @@ -1,4 +0,0 @@ ---- -category: minorAnalysis ---- -* Added SHA3 to the list of secure hashing algorithms. As a result the `java/potentially-weak-cryptographic-algorithm` query should no longer flag up uses of SHA3. diff --git a/java/ql/src/change-notes/2024-11-24-sha2.md b/java/ql/src/change-notes/2024-11-24-sha2.md deleted file mode 100644 index 395ea04b782..00000000000 --- a/java/ql/src/change-notes/2024-11-24-sha2.md +++ /dev/null @@ -1,4 +0,0 @@ ---- -category: minorAnalysis ---- -* Added SHA-384 to the list of secure hashing algorithms. As a result the `java/potentially-weak-cryptographic-algorithm` query should no longer flag up uses of SHA-384. diff --git a/java/ql/src/change-notes/2024-10-29-weak-crypto-hash.md b/java/ql/src/change-notes/released/1.1.10.md similarity index 50% rename from java/ql/src/change-notes/2024-10-29-weak-crypto-hash.md rename to java/ql/src/change-notes/released/1.1.10.md index b4ac88bcdc6..fef22bdedf5 100644 --- a/java/ql/src/change-notes/2024-10-29-weak-crypto-hash.md +++ b/java/ql/src/change-notes/released/1.1.10.md @@ -1,4 +1,7 @@ ---- -category: minorAnalysis ---- +## 1.1.10 + +### Minor Analysis Improvements + +* Added SHA-384 to the list of secure hashing algorithms. As a result the `java/potentially-weak-cryptographic-algorithm` query should no longer flag up uses of SHA-384. +* Added SHA3 to the list of secure hashing algorithms. As a result the `java/potentially-weak-cryptographic-algorithm` query should no longer flag up uses of SHA3. * The `java/weak-cryptographic-algorithm` query has been updated to no longer report uses of hash functions such as `MD5` and `SHA1` even if they are known to be weak. These hash algorithms are used very often in non-sensitive contexts, making the query too imprecise in practice. The `java/potentially-weak-cryptographic-algorithm` query has been updated to report these uses instead. diff --git a/java/ql/src/change-notes/released/1.1.9.md b/java/ql/src/change-notes/released/1.1.9.md new file mode 100644 index 00000000000..f9d367d4248 --- /dev/null +++ b/java/ql/src/change-notes/released/1.1.9.md @@ -0,0 +1,3 @@ +## 1.1.9 + +No user-facing changes. diff --git a/java/ql/src/codeql-pack.release.yml b/java/ql/src/codeql-pack.release.yml index 64972659c42..4c01918d414 100644 --- a/java/ql/src/codeql-pack.release.yml +++ b/java/ql/src/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.1.8 +lastReleaseVersion: 1.1.10 diff --git a/java/ql/src/experimental/Security/CWE/CWE-208/NonConstantTimeCheckOnSignatureQuery.qll b/java/ql/src/experimental/Security/CWE/CWE-208/NonConstantTimeCheckOnSignatureQuery.qll index 8e545a5e8f0..5972db67495 100644 --- a/java/ql/src/experimental/Security/CWE/CWE-208/NonConstantTimeCheckOnSignatureQuery.qll +++ b/java/ql/src/experimental/Security/CWE/CWE-208/NonConstantTimeCheckOnSignatureQuery.qll @@ -95,7 +95,7 @@ private class ProduceCiphertextCall extends ProduceCryptoCall { } /** Holds if `fromNode` to `toNode` is a dataflow step that updates a cryptographic operation. */ -private predicate updateCryptoOperationStep(DataFlow2::Node fromNode, DataFlow2::Node toNode) { +private predicate updateCryptoOperationStep(DataFlow::Node fromNode, DataFlow::Node toNode) { exists(MethodCall call, Method m | m = call.getMethod() and call.getQualifier() = toNode.asExpr() and @@ -111,7 +111,7 @@ private predicate updateCryptoOperationStep(DataFlow2::Node fromNode, DataFlow2: } /** Holds if `fromNode` to `toNode` is a dataflow step that creates a hash. */ -private predicate createMessageDigestStep(DataFlow2::Node fromNode, DataFlow2::Node toNode) { +private predicate createMessageDigestStep(DataFlow::Node fromNode, DataFlow::Node toNode) { exists(MethodCall ma, Method m | m = ma.getMethod() | m.getDeclaringType().hasQualifiedName("java.security", "MessageDigest") and m.hasStringSignature("digest()") and @@ -135,7 +135,7 @@ private predicate createMessageDigestStep(DataFlow2::Node fromNode, DataFlow2::N } /** Holds if `fromNode` to `toNode` is a dataflow step that updates a hash. */ -private predicate updateMessageDigestStep(DataFlow2::Node fromNode, DataFlow2::Node toNode) { +private predicate updateMessageDigestStep(DataFlow::Node fromNode, DataFlow::Node toNode) { exists(MethodCall ma, Method m | m = ma.getMethod() | m.hasQualifiedName("java.security", "MessageDigest", "update") and ma.getArgument(0) = fromNode.asExpr() and @@ -154,7 +154,7 @@ private module UserInputInCryptoOperationConfig implements DataFlow::ConfigSig { exists(ProduceCryptoCall call | call.getQualifier() = sink.asExpr()) } - predicate isAdditionalFlowStep(DataFlow2::Node fromNode, DataFlow2::Node toNode) { + predicate isAdditionalFlowStep(DataFlow::Node fromNode, DataFlow::Node toNode) { updateCryptoOperationStep(fromNode, toNode) or createMessageDigestStep(fromNode, toNode) diff --git a/java/ql/src/experimental/Security/CWE/CWE-625/PermissiveDotRegexQuery.qll b/java/ql/src/experimental/Security/CWE/CWE-625/PermissiveDotRegexQuery.qll index 925fd5632a3..5f015732cb3 100644 --- a/java/ql/src/experimental/Security/CWE/CWE-625/PermissiveDotRegexQuery.qll +++ b/java/ql/src/experimental/Security/CWE/CWE-625/PermissiveDotRegexQuery.qll @@ -94,11 +94,11 @@ private class CompileRegexSink extends DataFlow::ExprNode { * A data flow configuration for regular expressions that include permissive dots. */ private module PermissiveDotRegexConfig implements DataFlow::ConfigSig { - predicate isSource(DataFlow2::Node src) { src.asExpr() instanceof PermissiveDotStr } + predicate isSource(DataFlow::Node src) { src.asExpr() instanceof PermissiveDotStr } - predicate isSink(DataFlow2::Node sink) { sink instanceof CompileRegexSink } + predicate isSink(DataFlow::Node sink) { sink instanceof CompileRegexSink } - predicate isBarrier(DataFlow2::Node node) { + predicate isBarrier(DataFlow::Node node) { exists( MethodCall ma, Field f // Pattern.compile(PATTERN, Pattern.DOTALL) | diff --git a/java/ql/src/experimental/semmle/code/java/security/SpringUrlRedirect.qll b/java/ql/src/experimental/semmle/code/java/security/SpringUrlRedirect.qll index d437c8fa3cc..c068dfbb7e3 100644 --- a/java/ql/src/experimental/semmle/code/java/security/SpringUrlRedirect.qll +++ b/java/ql/src/experimental/semmle/code/java/security/SpringUrlRedirect.qll @@ -53,7 +53,7 @@ private class SpringViewUrlRedirectSink extends SpringUrlRedirectSink { ) or exists(MethodCall ma, RedirectAppendCall rac | - DataFlow2::localExprFlow(rac.getQualifier(), ma.getQualifier()) and + DataFlow::localExprFlow(rac.getQualifier(), ma.getQualifier()) and ma.getMethod().hasName("append") and ma.getArgument(0) = this.asExpr() and any(SpringRequestMappingMethod sqmm).polyCalls*(this.getEnclosingCallable()) diff --git a/java/ql/src/qlpack.yml b/java/ql/src/qlpack.yml index 40ca32d8070..8ee211fb536 100644 --- a/java/ql/src/qlpack.yml +++ b/java/ql/src/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/java-queries -version: 1.1.9-dev +version: 1.1.11-dev groups: - java - queries diff --git a/java/ql/test/library-tests/dataflow/callback-dispatch/test.expected b/java/ql/test/library-tests/dataflow/callback-dispatch/test.expected index 48de9172b36..e69de29bb2d 100644 --- a/java/ql/test/library-tests/dataflow/callback-dispatch/test.expected +++ b/java/ql/test/library-tests/dataflow/callback-dispatch/test.expected @@ -1,2 +0,0 @@ -failures -testFailures diff --git a/java/ql/test/library-tests/dataflow/capture/inlinetest.expected b/java/ql/test/library-tests/dataflow/capture/inlinetest.expected index efd347890dd..d127b92ddaf 100644 --- a/java/ql/test/library-tests/dataflow/capture/inlinetest.expected +++ b/java/ql/test/library-tests/dataflow/capture/inlinetest.expected @@ -12,12 +12,12 @@ edges | B.java:13:5:13:6 | l1 : ArrayList [] : String | B.java:13:16:13:16 | e : String | provenance | MaD:1 | | B.java:13:5:13:6 | l1 : ArrayList [] : String | B.java:13:16:13:29 | ...->... [post update] : new Consumer(...) { ... } [List l2, ] : String | provenance | MaD:1 | | B.java:13:16:13:16 | e : String | B.java:13:28:13:28 | e : String | provenance | | -| B.java:13:16:13:29 | ...->... [post update] : new Consumer(...) { ... } [List l2, ] : String | B.java:13:16:13:29 | List l2 : ArrayList [] : String | provenance | | -| B.java:13:16:13:29 | List l2 : ArrayList [] : String | B.java:14:10:14:11 | l2 : ArrayList [] : String | provenance | | +| B.java:13:16:13:29 | ...->... [post update] : new Consumer(...) { ... } [List l2, ] : String | B.java:13:16:13:29 | List l2 : List [] : String | provenance | | +| B.java:13:16:13:29 | List l2 : List [] : String | B.java:14:10:14:11 | l2 : List [] : String | provenance | | | B.java:13:21:13:22 | l2 [post update] : ArrayList [] : String | B.java:13:21:13:22 | this : new Consumer(...) { ... } [List l2, ] : String | provenance | | | B.java:13:21:13:22 | this : new Consumer(...) { ... } [List l2, ] : String | B.java:13:16:13:29 | parameter this [Return] : new Consumer(...) { ... } [List l2, ] : String | provenance | | | B.java:13:28:13:28 | e : String | B.java:13:21:13:22 | l2 [post update] : ArrayList [] : String | provenance | MaD:2 | -| B.java:14:10:14:11 | l2 : ArrayList [] : String | B.java:14:10:14:18 | get(...) | provenance | MaD:3 | +| B.java:14:10:14:11 | l2 : List [] : String | B.java:14:10:14:18 | get(...) | provenance | MaD:3 | | B.java:22:26:22:26 | x : String | B.java:22:68:22:68 | x : String | provenance | | | B.java:22:56:22:60 | other [post update] : B [bf1] : String | B.java:22:56:22:60 | this : new Consumer(...) { ... } [B other, bf1] : String | provenance | | | B.java:22:56:22:60 | this : new Consumer(...) { ... } [B other, bf1] : String | B.java:22:26:22:71 | parameter this [Return] : new Consumer(...) { ... } [B other, bf1] : String | provenance | | @@ -33,10 +33,10 @@ edges | B.java:39:5:39:7 | inp : HashMap [] : String | B.java:39:18:39:20 | key : String | provenance | MaD:4 | | B.java:39:5:39:7 | inp : HashMap [] : String | B.java:39:17:39:56 | ...->... [post update] : new BiConsumer(...) { ... } [out, ] : String | provenance | MaD:5 | | B.java:39:5:39:7 | inp : HashMap [] : String | B.java:39:23:39:27 | value : String | provenance | MaD:5 | -| B.java:39:17:39:56 | ...->... [post update] : new BiConsumer(...) { ... } [out, ] : String | B.java:39:17:39:56 | out : HashMap [] : String | provenance | | -| B.java:39:17:39:56 | ...->... [post update] : new BiConsumer(...) { ... } [out, ] : String | B.java:39:17:39:56 | out : HashMap [] : String | provenance | | -| B.java:39:17:39:56 | out : HashMap [] : String | B.java:38:48:38:70 | out [Return] : HashMap [] : String | provenance | | -| B.java:39:17:39:56 | out : HashMap [] : String | B.java:38:48:38:70 | out [Return] : HashMap [] : String | provenance | | +| B.java:39:17:39:56 | ...->... [post update] : new BiConsumer(...) { ... } [out, ] : String | B.java:39:17:39:56 | out : Map [] : String | provenance | | +| B.java:39:17:39:56 | ...->... [post update] : new BiConsumer(...) { ... } [out, ] : String | B.java:39:17:39:56 | out : Map [] : String | provenance | | +| B.java:39:17:39:56 | out : Map [] : String | B.java:38:48:38:70 | out [Return] : Map [] : String | provenance | | +| B.java:39:17:39:56 | out : Map [] : String | B.java:38:48:38:70 | out [Return] : Map [] : String | provenance | | | B.java:39:18:39:20 | key : String | B.java:39:43:39:45 | key : String | provenance | | | B.java:39:23:39:27 | value : String | B.java:39:48:39:52 | value : String | provenance | | | B.java:39:35:39:37 | out [post update] : HashMap [] : String | B.java:39:35:39:37 | this : new BiConsumer(...) { ... } [out, ] : String | provenance | | @@ -94,30 +94,30 @@ edges | B.java:103:5:103:6 | l2 [post update] : ArrayList [, ] : String | B.java:107:5:107:6 | l2 : ArrayList [, ] : String | provenance | | | B.java:103:12:103:13 | l1 : ArrayList [] : String | B.java:103:5:103:6 | l2 [post update] : ArrayList [, ] : String | provenance | MaD:2 | | B.java:104:16:104:32 | source(...) : String | B.java:107:16:111:6 | String s : String | provenance | | -| B.java:107:5:107:6 | l2 : ArrayList [, ] : String | B.java:107:16:107:16 | l : ArrayList [] : String | provenance | MaD:1 | +| B.java:107:5:107:6 | l2 : ArrayList [, ] : String | B.java:107:16:107:16 | l : List [] : String | provenance | MaD:1 | | B.java:107:5:107:6 | l2 : ArrayList [, ] : String | B.java:107:16:111:6 | ...->... [post update] : new Consumer>(...) { ... } [List out1, ] : String | provenance | MaD:1 | -| B.java:107:16:107:16 | l : ArrayList [] : String | B.java:107:21:107:21 | l : ArrayList [] : String | provenance | | +| B.java:107:16:107:16 | l : List [] : String | B.java:107:21:107:21 | l : List [] : String | provenance | | | B.java:107:16:111:6 | ...->... : new Consumer>(...) { ... } [String s] : String | B.java:107:16:111:6 | ...->... [post update] : new Consumer>(...) { ... } [List out2, ] : String | provenance | MaD:1 | | B.java:107:16:111:6 | ...->... : new Consumer>(...) { ... } [String s] : String | B.java:107:16:111:6 | ...->... [post update] : new Consumer>(...) { ... } [List out2, ] : String | provenance | heuristic-callback | | B.java:107:16:111:6 | ...->... : new Consumer>(...) { ... } [String s] : String | B.java:107:16:111:6 | parameter this : new Consumer>(...) { ... } [String s] : String | provenance | MaD:1 | | B.java:107:16:111:6 | ...->... : new Consumer>(...) { ... } [String s] : String | B.java:107:16:111:6 | parameter this : new Consumer>(...) { ... } [String s] : String | provenance | heuristic-callback | -| B.java:107:16:111:6 | ...->... [post update] : new Consumer>(...) { ... } [List out1, ] : String | B.java:107:16:111:6 | List out1 : ArrayList [] : String | provenance | | -| B.java:107:16:111:6 | ...->... [post update] : new Consumer>(...) { ... } [List out2, ] : String | B.java:107:16:111:6 | List out2 : ArrayList [] : String | provenance | | -| B.java:107:16:111:6 | List out1 : ArrayList [] : String | B.java:112:10:112:13 | out1 : ArrayList [] : String | provenance | | -| B.java:107:16:111:6 | List out2 : ArrayList [] : String | B.java:113:10:113:13 | out2 : ArrayList [] : String | provenance | | +| B.java:107:16:111:6 | ...->... [post update] : new Consumer>(...) { ... } [List out1, ] : String | B.java:107:16:111:6 | List out1 : List [] : String | provenance | | +| B.java:107:16:111:6 | ...->... [post update] : new Consumer>(...) { ... } [List out2, ] : String | B.java:107:16:111:6 | List out2 : List [] : String | provenance | | +| B.java:107:16:111:6 | List out1 : List [] : String | B.java:112:10:112:13 | out1 : List [] : String | provenance | | +| B.java:107:16:111:6 | List out2 : List [] : String | B.java:113:10:113:13 | out2 : List [] : String | provenance | | | B.java:107:16:111:6 | String s : String | B.java:107:16:111:6 | ...->... : new Consumer>(...) { ... } [String s] : String | provenance | | | B.java:107:16:111:6 | parameter this : new Consumer>(...) { ... } [String s] : String | B.java:107:31:111:5 | this : new Consumer>(...) { ... } [String s] : String | provenance | | -| B.java:107:21:107:21 | l : ArrayList [] : String | B.java:107:31:107:31 | x : String | provenance | MaD:1 | -| B.java:107:21:107:21 | l : ArrayList [] : String | B.java:107:31:111:5 | ...->... [post update] : new Consumer(...) { ... } [List out1, ] : String | provenance | MaD:1 | +| B.java:107:21:107:21 | l : List [] : String | B.java:107:31:107:31 | x : String | provenance | MaD:1 | +| B.java:107:21:107:21 | l : List [] : String | B.java:107:31:111:5 | ...->... [post update] : new Consumer(...) { ... } [List out1, ] : String | provenance | MaD:1 | | B.java:107:31:107:31 | x : String | B.java:109:16:109:16 | x : String | provenance | | | B.java:107:31:111:5 | ...->... : new Consumer(...) { ... } [String s] : String | B.java:107:31:111:5 | ...->... [post update] : new Consumer(...) { ... } [List out2, ] : String | provenance | MaD:1 | | B.java:107:31:111:5 | ...->... : new Consumer(...) { ... } [String s] : String | B.java:107:31:111:5 | ...->... [post update] : new Consumer(...) { ... } [List out2, ] : String | provenance | heuristic-callback | | B.java:107:31:111:5 | ...->... : new Consumer(...) { ... } [String s] : String | B.java:107:31:111:5 | parameter this : new Consumer(...) { ... } [String s] : String | provenance | MaD:1 | | B.java:107:31:111:5 | ...->... : new Consumer(...) { ... } [String s] : String | B.java:107:31:111:5 | parameter this : new Consumer(...) { ... } [String s] : String | provenance | heuristic-callback | -| B.java:107:31:111:5 | ...->... [post update] : new Consumer(...) { ... } [List out1, ] : String | B.java:107:31:111:5 | List out1 : ArrayList [] : String | provenance | | -| B.java:107:31:111:5 | ...->... [post update] : new Consumer(...) { ... } [List out2, ] : String | B.java:107:31:111:5 | List out2 : ArrayList [] : String | provenance | | -| B.java:107:31:111:5 | List out1 : ArrayList [] : String | B.java:107:31:111:5 | this : new Consumer>(...) { ... } [List out1, ] : String | provenance | | -| B.java:107:31:111:5 | List out2 : ArrayList [] : String | B.java:107:31:111:5 | this : new Consumer>(...) { ... } [List out2, ] : String | provenance | | +| B.java:107:31:111:5 | ...->... [post update] : new Consumer(...) { ... } [List out1, ] : String | B.java:107:31:111:5 | List out1 : List [] : String | provenance | | +| B.java:107:31:111:5 | ...->... [post update] : new Consumer(...) { ... } [List out2, ] : String | B.java:107:31:111:5 | List out2 : List [] : String | provenance | | +| B.java:107:31:111:5 | List out1 : List [] : String | B.java:107:31:111:5 | this : new Consumer>(...) { ... } [List out1, ] : String | provenance | | +| B.java:107:31:111:5 | List out2 : List [] : String | B.java:107:31:111:5 | this : new Consumer>(...) { ... } [List out2, ] : String | provenance | | | B.java:107:31:111:5 | String s : String | B.java:107:31:111:5 | ...->... : new Consumer(...) { ... } [String s] : String | provenance | | | B.java:107:31:111:5 | parameter this : new Consumer(...) { ... } [String s] : String | B.java:108:12:108:12 | this : new Consumer(...) { ... } [String s] : String | provenance | | | B.java:107:31:111:5 | parameter this : new Consumer(...) { ... } [String s] : String | B.java:110:16:110:16 | this : new Consumer(...) { ... } [String s] : String | provenance | | @@ -132,8 +132,8 @@ edges | B.java:110:7:110:10 | this : new Consumer(...) { ... } [List out2, ] : String | B.java:107:31:111:5 | parameter this [Return] : new Consumer(...) { ... } [List out2, ] : String | provenance | | | B.java:110:16:110:16 | s : String | B.java:110:7:110:10 | out2 [post update] : ArrayList [] : String | provenance | MaD:2 | | B.java:110:16:110:16 | this : new Consumer(...) { ... } [String s] : String | B.java:110:16:110:16 | s : String | provenance | | -| B.java:112:10:112:13 | out1 : ArrayList [] : String | B.java:112:10:112:20 | get(...) | provenance | MaD:3 | -| B.java:113:10:113:13 | out2 : ArrayList [] : String | B.java:113:10:113:20 | get(...) | provenance | MaD:3 | +| B.java:112:10:112:13 | out1 : List [] : String | B.java:112:10:112:20 | get(...) | provenance | MaD:3 | +| B.java:113:10:113:13 | out2 : List [] : String | B.java:113:10:113:20 | get(...) | provenance | MaD:3 | | B.java:126:19:126:22 | parameter this [Return] : new TwoRuns(...) { ... } [List l1, ] : String | B.java:136:5:136:5 | r [post update] : new TwoRuns(...) { ... } [List l1, ] : String | provenance | | | B.java:127:9:127:10 | l1 [post update] : ArrayList [] : String | B.java:127:9:127:10 | this : new TwoRuns(...) { ... } [List l1, ] : String | provenance | | | B.java:127:9:127:10 | this : new TwoRuns(...) { ... } [List l1, ] : String | B.java:126:19:126:22 | parameter this [Return] : new TwoRuns(...) { ... } [List l1, ] : String | provenance | | @@ -144,14 +144,14 @@ edges | B.java:131:16:131:17 | l1 : ArrayList [] : String | B.java:131:16:131:24 | get(...) : String | provenance | MaD:3 | | B.java:131:16:131:17 | this : new TwoRuns(...) { ... } [List l1, ] : String | B.java:131:16:131:17 | l1 : ArrayList [] : String | provenance | | | B.java:131:16:131:24 | get(...) : String | B.java:131:9:131:10 | l2 [post update] : ArrayList [] : String | provenance | MaD:2 | -| B.java:136:5:136:5 | List l1 : ArrayList [] : String | B.java:137:5:137:5 | List l1 : ArrayList [] : String | provenance | | -| B.java:136:5:136:5 | r [post update] : new TwoRuns(...) { ... } [List l1, ] : String | B.java:136:5:136:5 | List l1 : ArrayList [] : String | provenance | | -| B.java:137:5:137:5 | List l1 : ArrayList [] : String | B.java:137:5:137:5 | r : new TwoRuns(...) { ... } [List l1, ] : String | provenance | | -| B.java:137:5:137:5 | List l2 : ArrayList [] : String | B.java:138:10:138:11 | l2 : ArrayList [] : String | provenance | | +| B.java:136:5:136:5 | List l1 : List [] : String | B.java:137:5:137:5 | List l1 : List [] : String | provenance | | +| B.java:136:5:136:5 | r [post update] : new TwoRuns(...) { ... } [List l1, ] : String | B.java:136:5:136:5 | List l1 : List [] : String | provenance | | +| B.java:137:5:137:5 | List l1 : List [] : String | B.java:137:5:137:5 | r : new TwoRuns(...) { ... } [List l1, ] : String | provenance | | +| B.java:137:5:137:5 | List l2 : List [] : String | B.java:138:10:138:11 | l2 : List [] : String | provenance | | | B.java:137:5:137:5 | r : new TwoRuns(...) { ... } [List l1, ] : String | B.java:130:19:130:22 | parameter this : new TwoRuns(...) { ... } [List l1, ] : String | provenance | | | B.java:137:5:137:5 | r : new TwoRuns(...) { ... } [List l1, ] : String | B.java:137:5:137:5 | r [post update] : new TwoRuns(...) { ... } [List l2, ] : String | provenance | MaD:3 | -| B.java:137:5:137:5 | r [post update] : new TwoRuns(...) { ... } [List l2, ] : String | B.java:137:5:137:5 | List l2 : ArrayList [] : String | provenance | | -| B.java:138:10:138:11 | l2 : ArrayList [] : String | B.java:138:10:138:18 | get(...) | provenance | MaD:3 | +| B.java:137:5:137:5 | r [post update] : new TwoRuns(...) { ... } [List l2, ] : String | B.java:137:5:137:5 | List l2 : List [] : String | provenance | | +| B.java:138:10:138:11 | l2 : List [] : String | B.java:138:10:138:18 | get(...) | provenance | MaD:3 | | B.java:142:16:142:31 | source(...) : String | B.java:148:17:148:29 | String s : String | provenance | | | B.java:145:7:145:13 | parameter this : MyLocal [String s] : String | B.java:145:28:145:28 | this : MyLocal [String s] : String | provenance | | | B.java:145:19:145:22 | this [post update] : MyLocal [f] : String | B.java:145:7:145:13 | parameter this [Return] : MyLocal [f] : String | provenance | | @@ -204,11 +204,11 @@ edges | B.java:175:5:175:6 | String s2 : String | B.java:175:5:175:6 | m1 : MyLocal [String s2] : String | provenance | | | B.java:175:5:175:6 | m1 : MyLocal [String s2] : String | B.java:162:12:162:15 | parameter this : MyLocal [String s2] : String | provenance | | | B.java:175:5:175:6 | m1 : MyLocal [f] : String | B.java:162:12:162:15 | parameter this : MyLocal [f] : String | provenance | | -| B.java:177:5:177:6 | List l : ArrayList [] : String | B.java:178:10:178:11 | List l : ArrayList [] : String | provenance | | -| B.java:177:5:177:6 | m1 [post update] : MyLocal [List l, ] : String | B.java:177:5:177:6 | List l : ArrayList [] : String | provenance | | +| B.java:177:5:177:6 | List l : List [] : String | B.java:178:10:178:11 | List l : List [] : String | provenance | | +| B.java:177:5:177:6 | m1 [post update] : MyLocal [List l, ] : String | B.java:177:5:177:6 | List l : List [] : String | provenance | | | B.java:177:12:177:27 | source(...) : String | B.java:166:16:166:23 | s : String | provenance | | | B.java:177:12:177:27 | source(...) : String | B.java:177:5:177:6 | m1 [post update] : MyLocal [List l, ] : String | provenance | MaD:2 | -| B.java:178:10:178:11 | List l : ArrayList [] : String | B.java:178:10:178:11 | m2 : MyLocal [List l, ] : String | provenance | | +| B.java:178:10:178:11 | List l : List [] : String | B.java:178:10:178:11 | m2 : MyLocal [List l, ] : String | provenance | | | B.java:178:10:178:11 | m2 : MyLocal [List l, ] : String | B.java:169:14:169:16 | parameter this : MyLocal [List l, ] : String | provenance | | | B.java:178:10:178:11 | m2 : MyLocal [List l, ] : String | B.java:178:10:178:17 | get(...) | provenance | MaD:3 | | B.java:203:16:203:42 | source(...) : String | B.java:212:5:212:6 | String s : String | provenance | | @@ -220,17 +220,17 @@ edges | B.java:207:15:207:42 | source(...) : String | B.java:207:7:207:9 | out [post update] : ArrayList [] : String | provenance | MaD:2 | | B.java:209:19:211:5 | parameter this : new Runnable(...) { ... } [String s] : String | B.java:210:7:210:8 | this : new Runnable(...) { ... } [String s] : String | provenance | | | B.java:209:19:211:5 | parameter this [Return] : new Runnable(...) { ... } [List out, ] : String | B.java:212:5:212:6 | r2 [post update] : new Runnable(...) { ... } [List out, ] : String | provenance | | -| B.java:210:7:210:8 | List out : ArrayList [] : String | B.java:210:7:210:8 | this : new Runnable(...) { ... } [List out, ] : String | provenance | | +| B.java:210:7:210:8 | List out : List [] : String | B.java:210:7:210:8 | this : new Runnable(...) { ... } [List out, ] : String | provenance | | | B.java:210:7:210:8 | String s : String | B.java:210:7:210:8 | r1 : new Runnable(...) { ... } [String s] : String | provenance | | | B.java:210:7:210:8 | r1 : new Runnable(...) { ... } [String s] : String | B.java:205:19:208:5 | parameter this : new Runnable(...) { ... } [String s] : String | provenance | | -| B.java:210:7:210:8 | r1 [post update] : new Runnable(...) { ... } [List out, ] : String | B.java:210:7:210:8 | List out : ArrayList [] : String | provenance | | +| B.java:210:7:210:8 | r1 [post update] : new Runnable(...) { ... } [List out, ] : String | B.java:210:7:210:8 | List out : List [] : String | provenance | | | B.java:210:7:210:8 | this : new Runnable(...) { ... } [List out, ] : String | B.java:209:19:211:5 | parameter this [Return] : new Runnable(...) { ... } [List out, ] : String | provenance | | | B.java:210:7:210:8 | this : new Runnable(...) { ... } [String s] : String | B.java:210:7:210:8 | String s : String | provenance | | -| B.java:212:5:212:6 | List out : ArrayList [] : String | B.java:213:10:213:12 | out : ArrayList [] : String | provenance | | +| B.java:212:5:212:6 | List out : List [] : String | B.java:213:10:213:12 | out : List [] : String | provenance | | | B.java:212:5:212:6 | String s : String | B.java:212:5:212:6 | r2 : new Runnable(...) { ... } [String s] : String | provenance | | | B.java:212:5:212:6 | r2 : new Runnable(...) { ... } [String s] : String | B.java:209:19:211:5 | parameter this : new Runnable(...) { ... } [String s] : String | provenance | | -| B.java:212:5:212:6 | r2 [post update] : new Runnable(...) { ... } [List out, ] : String | B.java:212:5:212:6 | List out : ArrayList [] : String | provenance | | -| B.java:213:10:213:12 | out : ArrayList [] : String | B.java:213:10:213:19 | get(...) | provenance | MaD:3 | +| B.java:212:5:212:6 | r2 [post update] : new Runnable(...) { ... } [List out, ] : String | B.java:212:5:212:6 | List out : List [] : String | provenance | | +| B.java:213:10:213:12 | out : List [] : String | B.java:213:10:213:19 | get(...) | provenance | MaD:3 | | B.java:231:16:231:28 | source(...) : String | B.java:247:5:247:18 | String s : String | provenance | | | B.java:235:7:235:14 | parameter this : MyLocal2 [String s] : String | B.java:238:15:238:15 | this : MyLocal2 [String s] : String | provenance | | | B.java:238:9:238:9 | l [post update] : ArrayList [] : String | B.java:238:9:238:9 | this : MyLocal2 [List l, ] : String | provenance | | @@ -243,17 +243,17 @@ edges | B.java:241:16:241:16 | l : ArrayList [] : String | B.java:241:16:241:23 | get(...) : String | provenance | MaD:3 | | B.java:241:16:241:16 | this : MyLocal2 [List l, ] : String | B.java:241:16:241:16 | l : ArrayList [] : String | provenance | | | B.java:241:16:241:23 | get(...) : String | B.java:241:9:241:10 | l2 [post update] : ArrayList [] : String | provenance | MaD:2 | -| B.java:247:5:247:18 | List l2 : ArrayList [] : String | B.java:249:10:249:11 | l2 : ArrayList [] : String | provenance | | -| B.java:247:5:247:18 | List l : ArrayList [] : String | B.java:248:10:248:10 | l : ArrayList [] : String | provenance | | +| B.java:247:5:247:18 | List l2 : List [] : String | B.java:249:10:249:11 | l2 : List [] : String | provenance | | +| B.java:247:5:247:18 | List l : List [] : String | B.java:248:10:248:10 | l : List [] : String | provenance | | | B.java:247:5:247:18 | String s : String | B.java:247:5:247:18 | new MyLocal2(...) [pre constructor] : MyLocal2 [String s] : String | provenance | | | B.java:247:5:247:18 | new MyLocal2(...) : MyLocal2 [List l, ] : String | B.java:240:12:240:14 | parameter this : MyLocal2 [List l, ] : String | provenance | | -| B.java:247:5:247:18 | new MyLocal2(...) : MyLocal2 [List l, ] : String | B.java:247:5:247:18 | List l : ArrayList [] : String | provenance | | +| B.java:247:5:247:18 | new MyLocal2(...) : MyLocal2 [List l, ] : String | B.java:247:5:247:18 | List l : List [] : String | provenance | | | B.java:247:5:247:18 | new MyLocal2(...) : MyLocal2 [List l, ] : String | B.java:247:5:247:18 | new MyLocal2(...) [post update] : MyLocal2 [List l2, ] : String | provenance | MaD:3 | -| B.java:247:5:247:18 | new MyLocal2(...) [post update] : MyLocal2 [List l2, ] : String | B.java:247:5:247:18 | List l2 : ArrayList [] : String | provenance | | +| B.java:247:5:247:18 | new MyLocal2(...) [post update] : MyLocal2 [List l2, ] : String | B.java:247:5:247:18 | List l2 : List [] : String | provenance | | | B.java:247:5:247:18 | new MyLocal2(...) [pre constructor] : MyLocal2 [String s] : String | B.java:235:7:235:14 | parameter this : MyLocal2 [String s] : String | provenance | | | B.java:247:5:247:18 | new MyLocal2(...) [pre constructor] : MyLocal2 [String s] : String | B.java:247:5:247:18 | new MyLocal2(...) : MyLocal2 [List l, ] : String | provenance | MaD:2 | -| B.java:248:10:248:10 | l : ArrayList [] : String | B.java:248:10:248:17 | get(...) | provenance | MaD:3 | -| B.java:249:10:249:11 | l2 : ArrayList [] : String | B.java:249:10:249:18 | get(...) | provenance | MaD:3 | +| B.java:248:10:248:10 | l : List [] : String | B.java:248:10:248:17 | get(...) | provenance | MaD:3 | +| B.java:249:10:249:11 | l2 : List [] : String | B.java:249:10:249:18 | get(...) | provenance | MaD:3 | | B.java:254:16:254:29 | source(...) : String | B.java:261:5:261:18 | String s : String | provenance | | | B.java:255:11:255:18 | parameter this : MyLocal3 [String s] : String | B.java:255:11:255:18 | this <.method> : MyLocal3 [String s] : String | provenance | | | B.java:255:11:255:18 | parameter this : MyLocal3 [String s] : String | B.java:256:18:256:18 | this : MyLocal3 [String s] : String | provenance | | @@ -300,12 +300,12 @@ nodes | B.java:13:5:13:6 | l1 : ArrayList [] : String | semmle.label | l1 : ArrayList [] : String | | B.java:13:16:13:16 | e : String | semmle.label | e : String | | B.java:13:16:13:29 | ...->... [post update] : new Consumer(...) { ... } [List l2, ] : String | semmle.label | ...->... [post update] : new Consumer(...) { ... } [List l2, ] : String | -| B.java:13:16:13:29 | List l2 : ArrayList [] : String | semmle.label | List l2 : ArrayList [] : String | +| B.java:13:16:13:29 | List l2 : List [] : String | semmle.label | List l2 : List [] : String | | B.java:13:16:13:29 | parameter this [Return] : new Consumer(...) { ... } [List l2, ] : String | semmle.label | parameter this [Return] : new Consumer(...) { ... } [List l2, ] : String | | B.java:13:21:13:22 | l2 [post update] : ArrayList [] : String | semmle.label | l2 [post update] : ArrayList [] : String | | B.java:13:21:13:22 | this : new Consumer(...) { ... } [List l2, ] : String | semmle.label | this : new Consumer(...) { ... } [List l2, ] : String | | B.java:13:28:13:28 | e : String | semmle.label | e : String | -| B.java:14:10:14:11 | l2 : ArrayList [] : String | semmle.label | l2 : ArrayList [] : String | +| B.java:14:10:14:11 | l2 : List [] : String | semmle.label | l2 : List [] : String | | B.java:14:10:14:18 | get(...) | semmle.label | get(...) | | B.java:22:26:22:26 | x : String | semmle.label | x : String | | B.java:22:26:22:71 | parameter this [Return] : new Consumer(...) { ... } [B other, bf1] : String | semmle.label | parameter this [Return] : new Consumer(...) { ... } [B other, bf1] : String | @@ -319,14 +319,14 @@ nodes | B.java:34:10:34:18 | other.bf1 | semmle.label | other.bf1 | | B.java:38:23:38:45 | inp : HashMap [] : String | semmle.label | inp : HashMap [] : String | | B.java:38:23:38:45 | inp : HashMap [] : String | semmle.label | inp : HashMap [] : String | -| B.java:38:48:38:70 | out [Return] : HashMap [] : String | semmle.label | out [Return] : HashMap [] : String | -| B.java:38:48:38:70 | out [Return] : HashMap [] : String | semmle.label | out [Return] : HashMap [] : String | +| B.java:38:48:38:70 | out [Return] : Map [] : String | semmle.label | out [Return] : Map [] : String | +| B.java:38:48:38:70 | out [Return] : Map [] : String | semmle.label | out [Return] : Map [] : String | | B.java:39:5:39:7 | inp : HashMap [] : String | semmle.label | inp : HashMap [] : String | | B.java:39:5:39:7 | inp : HashMap [] : String | semmle.label | inp : HashMap [] : String | | B.java:39:17:39:56 | ...->... [post update] : new BiConsumer(...) { ... } [out, ] : String | semmle.label | ...->... [post update] : new BiConsumer(...) { ... } [out, ] : String | | B.java:39:17:39:56 | ...->... [post update] : new BiConsumer(...) { ... } [out, ] : String | semmle.label | ...->... [post update] : new BiConsumer(...) { ... } [out, ] : String | -| B.java:39:17:39:56 | out : HashMap [] : String | semmle.label | out : HashMap [] : String | -| B.java:39:17:39:56 | out : HashMap [] : String | semmle.label | out : HashMap [] : String | +| B.java:39:17:39:56 | out : Map [] : String | semmle.label | out : Map [] : String | +| B.java:39:17:39:56 | out : Map [] : String | semmle.label | out : Map [] : String | | B.java:39:17:39:56 | parameter this [Return] : new BiConsumer(...) { ... } [out, ] : String | semmle.label | parameter this [Return] : new BiConsumer(...) { ... } [out, ] : String | | B.java:39:17:39:56 | parameter this [Return] : new BiConsumer(...) { ... } [out, ] : String | semmle.label | parameter this [Return] : new BiConsumer(...) { ... } [out, ] : String | | B.java:39:18:39:20 | key : String | semmle.label | key : String | @@ -390,23 +390,23 @@ nodes | B.java:103:12:103:13 | l1 : ArrayList [] : String | semmle.label | l1 : ArrayList [] : String | | B.java:104:16:104:32 | source(...) : String | semmle.label | source(...) : String | | B.java:107:5:107:6 | l2 : ArrayList [, ] : String | semmle.label | l2 : ArrayList [, ] : String | -| B.java:107:16:107:16 | l : ArrayList [] : String | semmle.label | l : ArrayList [] : String | +| B.java:107:16:107:16 | l : List [] : String | semmle.label | l : List [] : String | | B.java:107:16:111:6 | ...->... : new Consumer>(...) { ... } [String s] : String | semmle.label | ...->... : new Consumer>(...) { ... } [String s] : String | | B.java:107:16:111:6 | ...->... [post update] : new Consumer>(...) { ... } [List out1, ] : String | semmle.label | ...->... [post update] : new Consumer>(...) { ... } [List out1, ] : String | | B.java:107:16:111:6 | ...->... [post update] : new Consumer>(...) { ... } [List out2, ] : String | semmle.label | ...->... [post update] : new Consumer>(...) { ... } [List out2, ] : String | -| B.java:107:16:111:6 | List out1 : ArrayList [] : String | semmle.label | List out1 : ArrayList [] : String | -| B.java:107:16:111:6 | List out2 : ArrayList [] : String | semmle.label | List out2 : ArrayList [] : String | +| B.java:107:16:111:6 | List out1 : List [] : String | semmle.label | List out1 : List [] : String | +| B.java:107:16:111:6 | List out2 : List [] : String | semmle.label | List out2 : List [] : String | | B.java:107:16:111:6 | String s : String | semmle.label | String s : String | | B.java:107:16:111:6 | parameter this : new Consumer>(...) { ... } [String s] : String | semmle.label | parameter this : new Consumer>(...) { ... } [String s] : String | | B.java:107:16:111:6 | parameter this [Return] : new Consumer>(...) { ... } [List out1, ] : String | semmle.label | parameter this [Return] : new Consumer>(...) { ... } [List out1, ] : String | | B.java:107:16:111:6 | parameter this [Return] : new Consumer>(...) { ... } [List out2, ] : String | semmle.label | parameter this [Return] : new Consumer>(...) { ... } [List out2, ] : String | -| B.java:107:21:107:21 | l : ArrayList [] : String | semmle.label | l : ArrayList [] : String | +| B.java:107:21:107:21 | l : List [] : String | semmle.label | l : List [] : String | | B.java:107:31:107:31 | x : String | semmle.label | x : String | | B.java:107:31:111:5 | ...->... : new Consumer(...) { ... } [String s] : String | semmle.label | ...->... : new Consumer(...) { ... } [String s] : String | | B.java:107:31:111:5 | ...->... [post update] : new Consumer(...) { ... } [List out1, ] : String | semmle.label | ...->... [post update] : new Consumer(...) { ... } [List out1, ] : String | | B.java:107:31:111:5 | ...->... [post update] : new Consumer(...) { ... } [List out2, ] : String | semmle.label | ...->... [post update] : new Consumer(...) { ... } [List out2, ] : String | -| B.java:107:31:111:5 | List out1 : ArrayList [] : String | semmle.label | List out1 : ArrayList [] : String | -| B.java:107:31:111:5 | List out2 : ArrayList [] : String | semmle.label | List out2 : ArrayList [] : String | +| B.java:107:31:111:5 | List out1 : List [] : String | semmle.label | List out1 : List [] : String | +| B.java:107:31:111:5 | List out2 : List [] : String | semmle.label | List out2 : List [] : String | | B.java:107:31:111:5 | String s : String | semmle.label | String s : String | | B.java:107:31:111:5 | parameter this : new Consumer(...) { ... } [String s] : String | semmle.label | parameter this : new Consumer(...) { ... } [String s] : String | | B.java:107:31:111:5 | parameter this [Return] : new Consumer(...) { ... } [List out1, ] : String | semmle.label | parameter this [Return] : new Consumer(...) { ... } [List out1, ] : String | @@ -423,9 +423,9 @@ nodes | B.java:110:7:110:10 | this : new Consumer(...) { ... } [List out2, ] : String | semmle.label | this : new Consumer(...) { ... } [List out2, ] : String | | B.java:110:16:110:16 | s : String | semmle.label | s : String | | B.java:110:16:110:16 | this : new Consumer(...) { ... } [String s] : String | semmle.label | this : new Consumer(...) { ... } [String s] : String | -| B.java:112:10:112:13 | out1 : ArrayList [] : String | semmle.label | out1 : ArrayList [] : String | +| B.java:112:10:112:13 | out1 : List [] : String | semmle.label | out1 : List [] : String | | B.java:112:10:112:20 | get(...) | semmle.label | get(...) | -| B.java:113:10:113:13 | out2 : ArrayList [] : String | semmle.label | out2 : ArrayList [] : String | +| B.java:113:10:113:13 | out2 : List [] : String | semmle.label | out2 : List [] : String | | B.java:113:10:113:20 | get(...) | semmle.label | get(...) | | B.java:126:19:126:22 | parameter this [Return] : new TwoRuns(...) { ... } [List l1, ] : String | semmle.label | parameter this [Return] : new TwoRuns(...) { ... } [List l1, ] : String | | B.java:127:9:127:10 | l1 [post update] : ArrayList [] : String | semmle.label | l1 [post update] : ArrayList [] : String | @@ -438,13 +438,13 @@ nodes | B.java:131:16:131:17 | l1 : ArrayList [] : String | semmle.label | l1 : ArrayList [] : String | | B.java:131:16:131:17 | this : new TwoRuns(...) { ... } [List l1, ] : String | semmle.label | this : new TwoRuns(...) { ... } [List l1, ] : String | | B.java:131:16:131:24 | get(...) : String | semmle.label | get(...) : String | -| B.java:136:5:136:5 | List l1 : ArrayList [] : String | semmle.label | List l1 : ArrayList [] : String | +| B.java:136:5:136:5 | List l1 : List [] : String | semmle.label | List l1 : List [] : String | | B.java:136:5:136:5 | r [post update] : new TwoRuns(...) { ... } [List l1, ] : String | semmle.label | r [post update] : new TwoRuns(...) { ... } [List l1, ] : String | -| B.java:137:5:137:5 | List l1 : ArrayList [] : String | semmle.label | List l1 : ArrayList [] : String | -| B.java:137:5:137:5 | List l2 : ArrayList [] : String | semmle.label | List l2 : ArrayList [] : String | +| B.java:137:5:137:5 | List l1 : List [] : String | semmle.label | List l1 : List [] : String | +| B.java:137:5:137:5 | List l2 : List [] : String | semmle.label | List l2 : List [] : String | | B.java:137:5:137:5 | r : new TwoRuns(...) { ... } [List l1, ] : String | semmle.label | r : new TwoRuns(...) { ... } [List l1, ] : String | | B.java:137:5:137:5 | r [post update] : new TwoRuns(...) { ... } [List l2, ] : String | semmle.label | r [post update] : new TwoRuns(...) { ... } [List l2, ] : String | -| B.java:138:10:138:11 | l2 : ArrayList [] : String | semmle.label | l2 : ArrayList [] : String | +| B.java:138:10:138:11 | l2 : List [] : String | semmle.label | l2 : List [] : String | | B.java:138:10:138:18 | get(...) | semmle.label | get(...) | | B.java:142:16:142:31 | source(...) : String | semmle.label | source(...) : String | | B.java:145:7:145:13 | parameter this : MyLocal [String s] : String | semmle.label | parameter this : MyLocal [String s] : String | @@ -499,10 +499,10 @@ nodes | B.java:175:5:175:6 | String s2 : String | semmle.label | String s2 : String | | B.java:175:5:175:6 | m1 : MyLocal [String s2] : String | semmle.label | m1 : MyLocal [String s2] : String | | B.java:175:5:175:6 | m1 : MyLocal [f] : String | semmle.label | m1 : MyLocal [f] : String | -| B.java:177:5:177:6 | List l : ArrayList [] : String | semmle.label | List l : ArrayList [] : String | +| B.java:177:5:177:6 | List l : List [] : String | semmle.label | List l : List [] : String | | B.java:177:5:177:6 | m1 [post update] : MyLocal [List l, ] : String | semmle.label | m1 [post update] : MyLocal [List l, ] : String | | B.java:177:12:177:27 | source(...) : String | semmle.label | source(...) : String | -| B.java:178:10:178:11 | List l : ArrayList [] : String | semmle.label | List l : ArrayList [] : String | +| B.java:178:10:178:11 | List l : List [] : String | semmle.label | List l : List [] : String | | B.java:178:10:178:11 | m2 : MyLocal [List l, ] : String | semmle.label | m2 : MyLocal [List l, ] : String | | B.java:178:10:178:17 | get(...) | semmle.label | get(...) | | B.java:203:16:203:42 | source(...) : String | semmle.label | source(...) : String | @@ -515,17 +515,17 @@ nodes | B.java:207:15:207:42 | source(...) : String | semmle.label | source(...) : String | | B.java:209:19:211:5 | parameter this : new Runnable(...) { ... } [String s] : String | semmle.label | parameter this : new Runnable(...) { ... } [String s] : String | | B.java:209:19:211:5 | parameter this [Return] : new Runnable(...) { ... } [List out, ] : String | semmle.label | parameter this [Return] : new Runnable(...) { ... } [List out, ] : String | -| B.java:210:7:210:8 | List out : ArrayList [] : String | semmle.label | List out : ArrayList [] : String | +| B.java:210:7:210:8 | List out : List [] : String | semmle.label | List out : List [] : String | | B.java:210:7:210:8 | String s : String | semmle.label | String s : String | | B.java:210:7:210:8 | r1 : new Runnable(...) { ... } [String s] : String | semmle.label | r1 : new Runnable(...) { ... } [String s] : String | | B.java:210:7:210:8 | r1 [post update] : new Runnable(...) { ... } [List out, ] : String | semmle.label | r1 [post update] : new Runnable(...) { ... } [List out, ] : String | | B.java:210:7:210:8 | this : new Runnable(...) { ... } [List out, ] : String | semmle.label | this : new Runnable(...) { ... } [List out, ] : String | | B.java:210:7:210:8 | this : new Runnable(...) { ... } [String s] : String | semmle.label | this : new Runnable(...) { ... } [String s] : String | -| B.java:212:5:212:6 | List out : ArrayList [] : String | semmle.label | List out : ArrayList [] : String | +| B.java:212:5:212:6 | List out : List [] : String | semmle.label | List out : List [] : String | | B.java:212:5:212:6 | String s : String | semmle.label | String s : String | | B.java:212:5:212:6 | r2 : new Runnable(...) { ... } [String s] : String | semmle.label | r2 : new Runnable(...) { ... } [String s] : String | | B.java:212:5:212:6 | r2 [post update] : new Runnable(...) { ... } [List out, ] : String | semmle.label | r2 [post update] : new Runnable(...) { ... } [List out, ] : String | -| B.java:213:10:213:12 | out : ArrayList [] : String | semmle.label | out : ArrayList [] : String | +| B.java:213:10:213:12 | out : List [] : String | semmle.label | out : List [] : String | | B.java:213:10:213:19 | get(...) | semmle.label | get(...) | | B.java:231:16:231:28 | source(...) : String | semmle.label | source(...) : String | | B.java:235:7:235:14 | parameter this : MyLocal2 [String s] : String | semmle.label | parameter this : MyLocal2 [String s] : String | @@ -541,15 +541,15 @@ nodes | B.java:241:16:241:16 | l : ArrayList [] : String | semmle.label | l : ArrayList [] : String | | B.java:241:16:241:16 | this : MyLocal2 [List l, ] : String | semmle.label | this : MyLocal2 [List l, ] : String | | B.java:241:16:241:23 | get(...) : String | semmle.label | get(...) : String | -| B.java:247:5:247:18 | List l2 : ArrayList [] : String | semmle.label | List l2 : ArrayList [] : String | -| B.java:247:5:247:18 | List l : ArrayList [] : String | semmle.label | List l : ArrayList [] : String | +| B.java:247:5:247:18 | List l2 : List [] : String | semmle.label | List l2 : List [] : String | +| B.java:247:5:247:18 | List l : List [] : String | semmle.label | List l : List [] : String | | B.java:247:5:247:18 | String s : String | semmle.label | String s : String | | B.java:247:5:247:18 | new MyLocal2(...) : MyLocal2 [List l, ] : String | semmle.label | new MyLocal2(...) : MyLocal2 [List l, ] : String | | B.java:247:5:247:18 | new MyLocal2(...) [post update] : MyLocal2 [List l2, ] : String | semmle.label | new MyLocal2(...) [post update] : MyLocal2 [List l2, ] : String | | B.java:247:5:247:18 | new MyLocal2(...) [pre constructor] : MyLocal2 [String s] : String | semmle.label | new MyLocal2(...) [pre constructor] : MyLocal2 [String s] : String | -| B.java:248:10:248:10 | l : ArrayList [] : String | semmle.label | l : ArrayList [] : String | +| B.java:248:10:248:10 | l : List [] : String | semmle.label | l : List [] : String | | B.java:248:10:248:17 | get(...) | semmle.label | get(...) | -| B.java:249:10:249:11 | l2 : ArrayList [] : String | semmle.label | l2 : ArrayList [] : String | +| B.java:249:10:249:11 | l2 : List [] : String | semmle.label | l2 : List [] : String | | B.java:249:10:249:18 | get(...) | semmle.label | get(...) | | B.java:254:16:254:29 | source(...) : String | semmle.label | source(...) : String | | B.java:255:11:255:18 | parameter this : MyLocal3 [String s] : String | semmle.label | parameter this : MyLocal3 [String s] : String | @@ -595,11 +595,11 @@ subpaths | B.java:30:14:30:24 | source(...) : String | B.java:22:26:22:26 | x : String | B.java:22:26:22:71 | parameter this [Return] : new Consumer(...) { ... } [B other, bf1] : String | B.java:30:5:30:5 | f [post update] : new Consumer(...) { ... } [B other, bf1] : String | | B.java:39:5:39:7 | inp : HashMap [] : String | B.java:39:18:39:20 | key : String | B.java:39:17:39:56 | parameter this [Return] : new BiConsumer(...) { ... } [out, ] : String | B.java:39:17:39:56 | ...->... [post update] : new BiConsumer(...) { ... } [out, ] : String | | B.java:39:5:39:7 | inp : HashMap [] : String | B.java:39:23:39:27 | value : String | B.java:39:17:39:56 | parameter this [Return] : new BiConsumer(...) { ... } [out, ] : String | B.java:39:17:39:56 | ...->... [post update] : new BiConsumer(...) { ... } [out, ] : String | -| B.java:46:13:46:14 | m1 : HashMap [] : String | B.java:38:23:38:45 | inp : HashMap [] : String | B.java:38:48:38:70 | out [Return] : HashMap [] : String | B.java:46:17:46:18 | m2 [post update] : HashMap [] : String | -| B.java:46:13:46:14 | m1 : HashMap [] : String | B.java:38:23:38:45 | inp : HashMap [] : String | B.java:38:48:38:70 | out [Return] : HashMap [] : String | B.java:46:17:46:18 | m2 [post update] : HashMap [] : String | -| B.java:107:5:107:6 | l2 : ArrayList [, ] : String | B.java:107:16:107:16 | l : ArrayList [] : String | B.java:107:16:111:6 | parameter this [Return] : new Consumer>(...) { ... } [List out1, ] : String | B.java:107:16:111:6 | ...->... [post update] : new Consumer>(...) { ... } [List out1, ] : String | +| B.java:46:13:46:14 | m1 : HashMap [] : String | B.java:38:23:38:45 | inp : HashMap [] : String | B.java:38:48:38:70 | out [Return] : Map [] : String | B.java:46:17:46:18 | m2 [post update] : HashMap [] : String | +| B.java:46:13:46:14 | m1 : HashMap [] : String | B.java:38:23:38:45 | inp : HashMap [] : String | B.java:38:48:38:70 | out [Return] : Map [] : String | B.java:46:17:46:18 | m2 [post update] : HashMap [] : String | +| B.java:107:5:107:6 | l2 : ArrayList [, ] : String | B.java:107:16:107:16 | l : List [] : String | B.java:107:16:111:6 | parameter this [Return] : new Consumer>(...) { ... } [List out1, ] : String | B.java:107:16:111:6 | ...->... [post update] : new Consumer>(...) { ... } [List out1, ] : String | | B.java:107:16:111:6 | ...->... : new Consumer>(...) { ... } [String s] : String | B.java:107:16:111:6 | parameter this : new Consumer>(...) { ... } [String s] : String | B.java:107:16:111:6 | parameter this [Return] : new Consumer>(...) { ... } [List out2, ] : String | B.java:107:16:111:6 | ...->... [post update] : new Consumer>(...) { ... } [List out2, ] : String | -| B.java:107:21:107:21 | l : ArrayList [] : String | B.java:107:31:107:31 | x : String | B.java:107:31:111:5 | parameter this [Return] : new Consumer(...) { ... } [List out1, ] : String | B.java:107:31:111:5 | ...->... [post update] : new Consumer(...) { ... } [List out1, ] : String | +| B.java:107:21:107:21 | l : List [] : String | B.java:107:31:107:31 | x : String | B.java:107:31:111:5 | parameter this [Return] : new Consumer(...) { ... } [List out1, ] : String | B.java:107:31:111:5 | ...->... [post update] : new Consumer(...) { ... } [List out1, ] : String | | B.java:107:31:111:5 | ...->... : new Consumer(...) { ... } [String s] : String | B.java:107:31:111:5 | parameter this : new Consumer(...) { ... } [String s] : String | B.java:107:31:111:5 | parameter this [Return] : new Consumer(...) { ... } [List out2, ] : String | B.java:107:31:111:5 | ...->... [post update] : new Consumer(...) { ... } [List out2, ] : String | | B.java:137:5:137:5 | r : new TwoRuns(...) { ... } [List l1, ] : String | B.java:130:19:130:22 | parameter this : new TwoRuns(...) { ... } [List l1, ] : String | B.java:130:19:130:22 | parameter this [Return] : new TwoRuns(...) { ... } [List l2, ] : String | B.java:137:5:137:5 | r [post update] : new TwoRuns(...) { ... } [List l2, ] : String | | B.java:148:17:148:29 | new MyLocal(...) [pre constructor] : MyLocal [String s] : String | B.java:145:7:145:13 | parameter this : MyLocal [String s] : String | B.java:145:7:145:13 | parameter this [Return] : MyLocal [f] : String | B.java:148:17:148:29 | new MyLocal(...) : MyLocal [f] : String | diff --git a/java/ql/test/library-tests/dataflow/entrypoint-types/EntryPointTypesTest.expected b/java/ql/test/library-tests/dataflow/entrypoint-types/EntryPointTypesTest.expected index 48de9172b36..e69de29bb2d 100644 --- a/java/ql/test/library-tests/dataflow/entrypoint-types/EntryPointTypesTest.expected +++ b/java/ql/test/library-tests/dataflow/entrypoint-types/EntryPointTypesTest.expected @@ -1,2 +0,0 @@ -failures -testFailures diff --git a/java/ql/test/library-tests/dataflow/flowfeature/flow.expected b/java/ql/test/library-tests/dataflow/flowfeature/flow.expected index 8ec8033d086..e69de29bb2d 100644 --- a/java/ql/test/library-tests/dataflow/flowfeature/flow.expected +++ b/java/ql/test/library-tests/dataflow/flowfeature/flow.expected @@ -1,2 +0,0 @@ -testFailures -failures diff --git a/java/ql/test/library-tests/dataflow/state/test.expected b/java/ql/test/library-tests/dataflow/state/test.expected index 48de9172b36..e69de29bb2d 100644 --- a/java/ql/test/library-tests/dataflow/state/test.expected +++ b/java/ql/test/library-tests/dataflow/state/test.expected @@ -1,2 +0,0 @@ -failures -testFailures diff --git a/java/ql/test/library-tests/dataflow/taintsources/local.expected b/java/ql/test/library-tests/dataflow/taintsources/local.expected index 48de9172b36..e69de29bb2d 100644 --- a/java/ql/test/library-tests/dataflow/taintsources/local.expected +++ b/java/ql/test/library-tests/dataflow/taintsources/local.expected @@ -1,2 +0,0 @@ -failures -testFailures diff --git a/java/ql/test/library-tests/dataflow/taintsources/remote.expected b/java/ql/test/library-tests/dataflow/taintsources/remote.expected index 48de9172b36..e69de29bb2d 100644 --- a/java/ql/test/library-tests/dataflow/taintsources/remote.expected +++ b/java/ql/test/library-tests/dataflow/taintsources/remote.expected @@ -1,2 +0,0 @@ -failures -testFailures diff --git a/java/ql/test/library-tests/dataflow/taintsources/reversedns.expected b/java/ql/test/library-tests/dataflow/taintsources/reversedns.expected index 48de9172b36..e69de29bb2d 100644 --- a/java/ql/test/library-tests/dataflow/taintsources/reversedns.expected +++ b/java/ql/test/library-tests/dataflow/taintsources/reversedns.expected @@ -1,2 +0,0 @@ -failures -testFailures diff --git a/java/ql/test/library-tests/frameworks/JaxWs/JaxRs.expected b/java/ql/test/library-tests/frameworks/JaxWs/JaxRs.expected index 48de9172b36..e69de29bb2d 100644 --- a/java/ql/test/library-tests/frameworks/JaxWs/JaxRs.expected +++ b/java/ql/test/library-tests/frameworks/JaxWs/JaxRs.expected @@ -1,2 +0,0 @@ -failures -testFailures diff --git a/java/ql/test/library-tests/frameworks/JaxWs/JaxWsEndpoint.expected b/java/ql/test/library-tests/frameworks/JaxWs/JaxWsEndpoint.expected index 48de9172b36..e69de29bb2d 100644 --- a/java/ql/test/library-tests/frameworks/JaxWs/JaxWsEndpoint.expected +++ b/java/ql/test/library-tests/frameworks/JaxWs/JaxWsEndpoint.expected @@ -1,2 +0,0 @@ -failures -testFailures diff --git a/java/ql/test/library-tests/frameworks/android/intent/test.expected b/java/ql/test/library-tests/frameworks/android/intent/test.expected index 6e840c4f235..ed9eb6fb7ce 100644 --- a/java/ql/test/library-tests/frameworks/android/intent/test.expected +++ b/java/ql/test/library-tests/frameworks/android/intent/test.expected @@ -184,96 +184,50 @@ edges | Test.java:22:44:22:45 | it : Set [] : String | Test.java:22:44:22:56 | iterator(...) : Iterator [] : String | provenance | MaD:179 | | Test.java:22:44:22:56 | iterator(...) : Iterator [] : String | Test.java:22:44:22:63 | next(...) : String | provenance | MaD:180 | | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : String | Test.java:23:45:23:45 | i : Intent [android.content.Intent.extras, ] : String | provenance | | -| Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : String | Test.java:23:45:23:45 | i : Intent [android.content.Intent.extras, ] : String | provenance | | -| Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : ArrayList | Test.java:23:45:23:45 | i : Intent [android.content.Intent.extras, ] : ArrayList | provenance | | | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : ArrayList | Test.java:23:45:23:45 | i : Intent [android.content.Intent.extras, ] : ArrayList | provenance | | | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : Boolean | Test.java:23:45:23:45 | i : Intent [android.content.Intent.extras, ] : Boolean | provenance | | -| Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : Boolean | Test.java:23:45:23:45 | i : Intent [android.content.Intent.extras, ] : Boolean | provenance | | -| Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : Bundle | Test.java:23:45:23:45 | i : Intent [android.content.Intent.extras, ] : Bundle | provenance | | | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : Bundle | Test.java:23:45:23:45 | i : Intent [android.content.Intent.extras, ] : Bundle | provenance | | | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : CharSequence | Test.java:23:45:23:45 | i : Intent [android.content.Intent.extras, ] : CharSequence | provenance | | -| Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : CharSequence | Test.java:23:45:23:45 | i : Intent [android.content.Intent.extras, ] : CharSequence | provenance | | -| Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : CharSequence[] | Test.java:23:45:23:45 | i : Intent [android.content.Intent.extras, ] : CharSequence[] | provenance | | | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : CharSequence[] | Test.java:23:45:23:45 | i : Intent [android.content.Intent.extras, ] : CharSequence[] | provenance | | | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : Intent | Test.java:23:45:23:45 | i : Intent [android.content.Intent.extras, ] : Intent | provenance | | -| Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : Intent | Test.java:23:45:23:45 | i : Intent [android.content.Intent.extras, ] : Intent | provenance | | -| Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : IntentSender | Test.java:23:45:23:45 | i : Intent [android.content.Intent.extras, ] : IntentSender | provenance | | | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : IntentSender | Test.java:23:45:23:45 | i : Intent [android.content.Intent.extras, ] : IntentSender | provenance | | | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : Number | Test.java:23:45:23:45 | i : Intent [android.content.Intent.extras, ] : Number | provenance | | -| Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : Number | Test.java:23:45:23:45 | i : Intent [android.content.Intent.extras, ] : Number | provenance | | -| Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : Object | Test.java:23:45:23:45 | i : Intent [android.content.Intent.extras, ] : Object | provenance | | | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : Object | Test.java:23:45:23:45 | i : Intent [android.content.Intent.extras, ] : Object | provenance | | | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : Parcelable | Test.java:23:45:23:45 | i : Intent [android.content.Intent.extras, ] : Parcelable | provenance | | -| Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : Parcelable | Test.java:23:45:23:45 | i : Intent [android.content.Intent.extras, ] : Parcelable | provenance | | -| Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : Parcelable[] | Test.java:23:45:23:45 | i : Intent [android.content.Intent.extras, ] : Parcelable[] | provenance | | | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : Parcelable[] | Test.java:23:45:23:45 | i : Intent [android.content.Intent.extras, ] : Parcelable[] | provenance | | | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : Serializable | Test.java:23:45:23:45 | i : Intent [android.content.Intent.extras, ] : Serializable | provenance | | -| Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : Serializable | Test.java:23:45:23:45 | i : Intent [android.content.Intent.extras, ] : Serializable | provenance | | -| Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : String | Test.java:23:45:23:45 | i : Intent [android.content.Intent.extras, ] : String | provenance | | | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : String | Test.java:23:45:23:45 | i : Intent [android.content.Intent.extras, ] : String | provenance | | | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : String[] | Test.java:23:45:23:45 | i : Intent [android.content.Intent.extras, ] : String[] | provenance | | -| Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : String[] | Test.java:23:45:23:45 | i : Intent [android.content.Intent.extras, ] : String[] | provenance | | -| Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : boolean[] | Test.java:23:45:23:45 | i : Intent [android.content.Intent.extras, ] : boolean[] | provenance | | | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : boolean[] | Test.java:23:45:23:45 | i : Intent [android.content.Intent.extras, ] : boolean[] | provenance | | | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : byte[] | Test.java:23:45:23:45 | i : Intent [android.content.Intent.extras, ] : byte[] | provenance | | -| Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : byte[] | Test.java:23:45:23:45 | i : Intent [android.content.Intent.extras, ] : byte[] | provenance | | -| Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : char[] | Test.java:23:45:23:45 | i : Intent [android.content.Intent.extras, ] : char[] | provenance | | | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : char[] | Test.java:23:45:23:45 | i : Intent [android.content.Intent.extras, ] : char[] | provenance | | | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : double[] | Test.java:23:45:23:45 | i : Intent [android.content.Intent.extras, ] : double[] | provenance | | -| Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : double[] | Test.java:23:45:23:45 | i : Intent [android.content.Intent.extras, ] : double[] | provenance | | -| Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : float[] | Test.java:23:45:23:45 | i : Intent [android.content.Intent.extras, ] : float[] | provenance | | | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : float[] | Test.java:23:45:23:45 | i : Intent [android.content.Intent.extras, ] : float[] | provenance | | | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : int[] | Test.java:23:45:23:45 | i : Intent [android.content.Intent.extras, ] : int[] | provenance | | -| Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : int[] | Test.java:23:45:23:45 | i : Intent [android.content.Intent.extras, ] : int[] | provenance | | -| Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : long[] | Test.java:23:45:23:45 | i : Intent [android.content.Intent.extras, ] : long[] | provenance | | | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : long[] | Test.java:23:45:23:45 | i : Intent [android.content.Intent.extras, ] : long[] | provenance | | | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : short[] | Test.java:23:45:23:45 | i : Intent [android.content.Intent.extras, ] : short[] | provenance | | -| Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : short[] | Test.java:23:45:23:45 | i : Intent [android.content.Intent.extras, ] : short[] | provenance | | -| Test.java:23:45:23:45 | i : Intent [android.content.Intent.extras, ] : String | Test.java:23:45:23:57 | getExtras(...) : Bundle [] : String | provenance | MaD:34 | | Test.java:23:45:23:45 | i : Intent [android.content.Intent.extras, ] : String | Test.java:23:45:23:57 | getExtras(...) : Bundle [] : String | provenance | MaD:34 | | Test.java:23:45:23:45 | i : Intent [android.content.Intent.extras, ] : ArrayList | Test.java:23:45:23:57 | getExtras(...) : Bundle [] : ArrayList | provenance | MaD:34 | -| Test.java:23:45:23:45 | i : Intent [android.content.Intent.extras, ] : ArrayList | Test.java:23:45:23:57 | getExtras(...) : Bundle [] : ArrayList | provenance | MaD:34 | -| Test.java:23:45:23:45 | i : Intent [android.content.Intent.extras, ] : Boolean | Test.java:23:45:23:57 | getExtras(...) : Bundle [] : Boolean | provenance | MaD:34 | | Test.java:23:45:23:45 | i : Intent [android.content.Intent.extras, ] : Boolean | Test.java:23:45:23:57 | getExtras(...) : Bundle [] : Boolean | provenance | MaD:34 | | Test.java:23:45:23:45 | i : Intent [android.content.Intent.extras, ] : Bundle | Test.java:23:45:23:57 | getExtras(...) : Bundle [] : Bundle | provenance | MaD:34 | -| Test.java:23:45:23:45 | i : Intent [android.content.Intent.extras, ] : Bundle | Test.java:23:45:23:57 | getExtras(...) : Bundle [] : Bundle | provenance | MaD:34 | -| Test.java:23:45:23:45 | i : Intent [android.content.Intent.extras, ] : CharSequence | Test.java:23:45:23:57 | getExtras(...) : Bundle [] : CharSequence | provenance | MaD:34 | | Test.java:23:45:23:45 | i : Intent [android.content.Intent.extras, ] : CharSequence | Test.java:23:45:23:57 | getExtras(...) : Bundle [] : CharSequence | provenance | MaD:34 | | Test.java:23:45:23:45 | i : Intent [android.content.Intent.extras, ] : CharSequence[] | Test.java:23:45:23:57 | getExtras(...) : Bundle [] : CharSequence[] | provenance | MaD:34 | -| Test.java:23:45:23:45 | i : Intent [android.content.Intent.extras, ] : CharSequence[] | Test.java:23:45:23:57 | getExtras(...) : Bundle [] : CharSequence[] | provenance | MaD:34 | -| Test.java:23:45:23:45 | i : Intent [android.content.Intent.extras, ] : Intent | Test.java:23:45:23:57 | getExtras(...) : Bundle [] : Intent | provenance | MaD:34 | | Test.java:23:45:23:45 | i : Intent [android.content.Intent.extras, ] : Intent | Test.java:23:45:23:57 | getExtras(...) : Bundle [] : Intent | provenance | MaD:34 | | Test.java:23:45:23:45 | i : Intent [android.content.Intent.extras, ] : IntentSender | Test.java:23:45:23:57 | getExtras(...) : Bundle [] : IntentSender | provenance | MaD:34 | -| Test.java:23:45:23:45 | i : Intent [android.content.Intent.extras, ] : IntentSender | Test.java:23:45:23:57 | getExtras(...) : Bundle [] : IntentSender | provenance | MaD:34 | -| Test.java:23:45:23:45 | i : Intent [android.content.Intent.extras, ] : Number | Test.java:23:45:23:57 | getExtras(...) : Bundle [] : Number | provenance | MaD:34 | | Test.java:23:45:23:45 | i : Intent [android.content.Intent.extras, ] : Number | Test.java:23:45:23:57 | getExtras(...) : Bundle [] : Number | provenance | MaD:34 | | Test.java:23:45:23:45 | i : Intent [android.content.Intent.extras, ] : Object | Test.java:23:45:23:57 | getExtras(...) : Bundle [] : Object | provenance | MaD:34 | -| Test.java:23:45:23:45 | i : Intent [android.content.Intent.extras, ] : Object | Test.java:23:45:23:57 | getExtras(...) : Bundle [] : Object | provenance | MaD:34 | -| Test.java:23:45:23:45 | i : Intent [android.content.Intent.extras, ] : Parcelable | Test.java:23:45:23:57 | getExtras(...) : Bundle [] : Parcelable | provenance | MaD:34 | | Test.java:23:45:23:45 | i : Intent [android.content.Intent.extras, ] : Parcelable | Test.java:23:45:23:57 | getExtras(...) : Bundle [] : Parcelable | provenance | MaD:34 | | Test.java:23:45:23:45 | i : Intent [android.content.Intent.extras, ] : Parcelable[] | Test.java:23:45:23:57 | getExtras(...) : Bundle [] : Parcelable[] | provenance | MaD:34 | -| Test.java:23:45:23:45 | i : Intent [android.content.Intent.extras, ] : Parcelable[] | Test.java:23:45:23:57 | getExtras(...) : Bundle [] : Parcelable[] | provenance | MaD:34 | -| Test.java:23:45:23:45 | i : Intent [android.content.Intent.extras, ] : Serializable | Test.java:23:45:23:57 | getExtras(...) : Bundle [] : Serializable | provenance | MaD:34 | | Test.java:23:45:23:45 | i : Intent [android.content.Intent.extras, ] : Serializable | Test.java:23:45:23:57 | getExtras(...) : Bundle [] : Serializable | provenance | MaD:34 | | Test.java:23:45:23:45 | i : Intent [android.content.Intent.extras, ] : String | Test.java:23:45:23:57 | getExtras(...) : Bundle [] : String | provenance | MaD:34 | -| Test.java:23:45:23:45 | i : Intent [android.content.Intent.extras, ] : String | Test.java:23:45:23:57 | getExtras(...) : Bundle [] : String | provenance | MaD:34 | -| Test.java:23:45:23:45 | i : Intent [android.content.Intent.extras, ] : String[] | Test.java:23:45:23:57 | getExtras(...) : Bundle [] : String[] | provenance | MaD:34 | | Test.java:23:45:23:45 | i : Intent [android.content.Intent.extras, ] : String[] | Test.java:23:45:23:57 | getExtras(...) : Bundle [] : String[] | provenance | MaD:34 | | Test.java:23:45:23:45 | i : Intent [android.content.Intent.extras, ] : boolean[] | Test.java:23:45:23:57 | getExtras(...) : Bundle [] : boolean[] | provenance | MaD:34 | -| Test.java:23:45:23:45 | i : Intent [android.content.Intent.extras, ] : boolean[] | Test.java:23:45:23:57 | getExtras(...) : Bundle [] : boolean[] | provenance | MaD:34 | -| Test.java:23:45:23:45 | i : Intent [android.content.Intent.extras, ] : byte[] | Test.java:23:45:23:57 | getExtras(...) : Bundle [] : byte[] | provenance | MaD:34 | | Test.java:23:45:23:45 | i : Intent [android.content.Intent.extras, ] : byte[] | Test.java:23:45:23:57 | getExtras(...) : Bundle [] : byte[] | provenance | MaD:34 | | Test.java:23:45:23:45 | i : Intent [android.content.Intent.extras, ] : char[] | Test.java:23:45:23:57 | getExtras(...) : Bundle [] : char[] | provenance | MaD:34 | -| Test.java:23:45:23:45 | i : Intent [android.content.Intent.extras, ] : char[] | Test.java:23:45:23:57 | getExtras(...) : Bundle [] : char[] | provenance | MaD:34 | -| Test.java:23:45:23:45 | i : Intent [android.content.Intent.extras, ] : double[] | Test.java:23:45:23:57 | getExtras(...) : Bundle [] : double[] | provenance | MaD:34 | | Test.java:23:45:23:45 | i : Intent [android.content.Intent.extras, ] : double[] | Test.java:23:45:23:57 | getExtras(...) : Bundle [] : double[] | provenance | MaD:34 | | Test.java:23:45:23:45 | i : Intent [android.content.Intent.extras, ] : float[] | Test.java:23:45:23:57 | getExtras(...) : Bundle [] : float[] | provenance | MaD:34 | -| Test.java:23:45:23:45 | i : Intent [android.content.Intent.extras, ] : float[] | Test.java:23:45:23:57 | getExtras(...) : Bundle [] : float[] | provenance | MaD:34 | -| Test.java:23:45:23:45 | i : Intent [android.content.Intent.extras, ] : int[] | Test.java:23:45:23:57 | getExtras(...) : Bundle [] : int[] | provenance | MaD:34 | | Test.java:23:45:23:45 | i : Intent [android.content.Intent.extras, ] : int[] | Test.java:23:45:23:57 | getExtras(...) : Bundle [] : int[] | provenance | MaD:34 | | Test.java:23:45:23:45 | i : Intent [android.content.Intent.extras, ] : long[] | Test.java:23:45:23:57 | getExtras(...) : Bundle [] : long[] | provenance | MaD:34 | -| Test.java:23:45:23:45 | i : Intent [android.content.Intent.extras, ] : long[] | Test.java:23:45:23:57 | getExtras(...) : Bundle [] : long[] | provenance | MaD:34 | -| Test.java:23:45:23:45 | i : Intent [android.content.Intent.extras, ] : short[] | Test.java:23:45:23:57 | getExtras(...) : Bundle [] : short[] | provenance | MaD:34 | | Test.java:23:45:23:45 | i : Intent [android.content.Intent.extras, ] : short[] | Test.java:23:45:23:57 | getExtras(...) : Bundle [] : short[] | provenance | MaD:34 | | Test.java:24:19:24:30 | b : BaseBundle [] : String | Test.java:24:42:24:42 | b : BaseBundle [] : String | provenance | | | Test.java:24:19:24:30 | b : Bundle [] : Object | Test.java:24:42:24:42 | b : Bundle [] : Object | provenance | | @@ -303,27 +257,19 @@ edges | Test.java:41:65:41:72 | source(...) : String | Test.java:28:29:28:36 | k : String | provenance | | | Test.java:41:65:41:72 | source(...) : String | Test.java:41:45:41:73 | newBundleWithMapKey(...) : Bundle [] : String | provenance | MaD:105 | | Test.java:42:10:42:23 | new Intent(...) : Intent [android.content.Intent.extras, ] : String | Test.java:43:36:43:38 | out : Intent [android.content.Intent.extras, ] : String | provenance | | -| Test.java:42:10:42:23 | new Intent(...) : Intent [android.content.Intent.extras, ] : String | Test.java:43:36:43:38 | out : Intent [android.content.Intent.extras, ] : String | provenance | | -| Test.java:42:21:42:22 | in : Intent [android.content.Intent.extras, ] : String | Test.java:42:10:42:23 | new Intent(...) : Intent [android.content.Intent.extras, ] : String | provenance | MaD:13 | | Test.java:42:21:42:22 | in : Intent [android.content.Intent.extras, ] : String | Test.java:42:10:42:23 | new Intent(...) : Intent [android.content.Intent.extras, ] : String | provenance | MaD:13 | | Test.java:43:19:43:39 | getIntent_extras(...) : Bundle [] : String | Test.java:24:19:24:30 | b : Bundle [] : String | provenance | | | Test.java:43:19:43:39 | getIntent_extras(...) : Bundle [] : String | Test.java:43:9:43:40 | getMapKey(...) | provenance | MaD:98 | | Test.java:43:36:43:38 | out : Intent [android.content.Intent.extras, ] : String | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : String | provenance | | -| Test.java:43:36:43:38 | out : Intent [android.content.Intent.extras, ] : String | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : String | provenance | | -| Test.java:43:36:43:38 | out : Intent [android.content.Intent.extras, ] : String | Test.java:43:19:43:39 | getIntent_extras(...) : Bundle [] : String | provenance | MaD:34 | | Test.java:43:36:43:38 | out : Intent [android.content.Intent.extras, ] : String | Test.java:43:19:43:39 | getIntent_extras(...) : Bundle [] : String | provenance | MaD:34 | | Test.java:48:16:48:76 | (...)... : Intent [android.content.Intent.extras, ] : Object | Test.java:49:21:49:22 | in : Intent [android.content.Intent.extras, ] : Object | provenance | | | Test.java:48:24:48:76 | newWithIntent_extras(...) : Intent [android.content.Intent.extras, ] : Object | Test.java:48:16:48:76 | (...)... : Intent [android.content.Intent.extras, ] : Object | provenance | | | Test.java:48:45:48:75 | newBundleWithMapValue(...) : Bundle [] : Object | Test.java:48:24:48:76 | newWithIntent_extras(...) : Intent [android.content.Intent.extras, ] : Object | provenance | MaD:178 | | Test.java:48:67:48:74 | source(...) : Object | Test.java:48:45:48:75 | newBundleWithMapValue(...) : Bundle [] : Object | provenance | MaD:176 | | Test.java:49:10:49:23 | new Intent(...) : Intent [android.content.Intent.extras, ] : Object | Test.java:50:38:50:40 | out : Intent [android.content.Intent.extras, ] : Object | provenance | | -| Test.java:49:10:49:23 | new Intent(...) : Intent [android.content.Intent.extras, ] : Object | Test.java:50:38:50:40 | out : Intent [android.content.Intent.extras, ] : Object | provenance | | -| Test.java:49:21:49:22 | in : Intent [android.content.Intent.extras, ] : Object | Test.java:49:10:49:23 | new Intent(...) : Intent [android.content.Intent.extras, ] : Object | provenance | MaD:14 | | Test.java:49:21:49:22 | in : Intent [android.content.Intent.extras, ] : Object | Test.java:49:10:49:23 | new Intent(...) : Intent [android.content.Intent.extras, ] : Object | provenance | MaD:14 | | Test.java:50:21:50:41 | getIntent_extras(...) : Bundle [] : Object | Test.java:50:9:50:42 | getMapValue(...) | provenance | MaD:175 | | Test.java:50:38:50:40 | out : Intent [android.content.Intent.extras, ] : Object | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : Object | provenance | | -| Test.java:50:38:50:40 | out : Intent [android.content.Intent.extras, ] : Object | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : Object | provenance | | -| Test.java:50:38:50:40 | out : Intent [android.content.Intent.extras, ] : Object | Test.java:50:21:50:41 | getIntent_extras(...) : Bundle [] : Object | provenance | MaD:34 | | Test.java:50:38:50:40 | out : Intent [android.content.Intent.extras, ] : Object | Test.java:50:21:50:41 | getIntent_extras(...) : Bundle [] : Object | provenance | MaD:34 | | Test.java:55:13:55:25 | (...)... : Uri | Test.java:56:27:56:28 | in : Uri | provenance | | | Test.java:55:18:55:25 | source(...) : Object | Test.java:55:13:55:25 | (...)... : Uri | provenance | | @@ -348,35 +294,23 @@ edges | Test.java:83:22:83:43 | (...)... : CharSequence | Test.java:84:37:84:38 | in : CharSequence | provenance | | | Test.java:83:36:83:43 | source(...) : Object | Test.java:83:22:83:43 | (...)... : CharSequence | provenance | | | Test.java:84:10:84:45 | createChooser(...) : Intent [android.content.Intent.extras, ] : CharSequence | Test.java:85:38:85:40 | out : Intent [android.content.Intent.extras, ] : CharSequence | provenance | | -| Test.java:84:10:84:45 | createChooser(...) : Intent [android.content.Intent.extras, ] : CharSequence | Test.java:85:38:85:40 | out : Intent [android.content.Intent.extras, ] : CharSequence | provenance | | -| Test.java:84:37:84:38 | in : CharSequence | Test.java:84:10:84:45 | createChooser(...) : Intent [android.content.Intent.extras, ] : CharSequence | provenance | MaD:17 | | Test.java:84:37:84:38 | in : CharSequence | Test.java:84:10:84:45 | createChooser(...) : Intent [android.content.Intent.extras, ] : CharSequence | provenance | MaD:17 | | Test.java:85:21:85:41 | getIntent_extras(...) : Bundle [] : CharSequence | Test.java:85:9:85:42 | getMapValue(...) | provenance | MaD:175 | | Test.java:85:38:85:40 | out : Intent [android.content.Intent.extras, ] : CharSequence | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : CharSequence | provenance | | -| Test.java:85:38:85:40 | out : Intent [android.content.Intent.extras, ] : CharSequence | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : CharSequence | provenance | | -| Test.java:85:38:85:40 | out : Intent [android.content.Intent.extras, ] : CharSequence | Test.java:85:21:85:41 | getIntent_extras(...) : Bundle [] : CharSequence | provenance | MaD:34 | | Test.java:85:38:85:40 | out : Intent [android.content.Intent.extras, ] : CharSequence | Test.java:85:21:85:41 | getIntent_extras(...) : Bundle [] : CharSequence | provenance | MaD:34 | | Test.java:90:22:90:43 | (...)... : IntentSender | Test.java:91:43:91:44 | in : IntentSender | provenance | | | Test.java:90:36:90:43 | source(...) : Object | Test.java:90:22:90:43 | (...)... : IntentSender | provenance | | | Test.java:91:10:91:45 | createChooser(...) : Intent [android.content.Intent.extras, ] : IntentSender | Test.java:92:38:92:40 | out : Intent [android.content.Intent.extras, ] : IntentSender | provenance | | -| Test.java:91:10:91:45 | createChooser(...) : Intent [android.content.Intent.extras, ] : IntentSender | Test.java:92:38:92:40 | out : Intent [android.content.Intent.extras, ] : IntentSender | provenance | | -| Test.java:91:43:91:44 | in : IntentSender | Test.java:91:10:91:45 | createChooser(...) : Intent [android.content.Intent.extras, ] : IntentSender | provenance | MaD:17 | | Test.java:91:43:91:44 | in : IntentSender | Test.java:91:10:91:45 | createChooser(...) : Intent [android.content.Intent.extras, ] : IntentSender | provenance | MaD:17 | | Test.java:92:21:92:41 | getIntent_extras(...) : Bundle [] : IntentSender | Test.java:92:9:92:42 | getMapValue(...) | provenance | MaD:175 | | Test.java:92:38:92:40 | out : Intent [android.content.Intent.extras, ] : IntentSender | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : IntentSender | provenance | | -| Test.java:92:38:92:40 | out : Intent [android.content.Intent.extras, ] : IntentSender | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : IntentSender | provenance | | -| Test.java:92:38:92:40 | out : Intent [android.content.Intent.extras, ] : IntentSender | Test.java:92:21:92:41 | getIntent_extras(...) : Bundle [] : IntentSender | provenance | MaD:34 | | Test.java:92:38:92:40 | out : Intent [android.content.Intent.extras, ] : IntentSender | Test.java:92:21:92:41 | getIntent_extras(...) : Bundle [] : IntentSender | provenance | MaD:34 | | Test.java:97:16:97:31 | (...)... : Intent | Test.java:98:31:98:32 | in : Intent | provenance | | | Test.java:97:24:97:31 | source(...) : Object | Test.java:97:16:97:31 | (...)... : Intent | provenance | | | Test.java:98:10:98:45 | createChooser(...) : Intent [android.content.Intent.extras, ] : Intent | Test.java:99:38:99:40 | out : Intent [android.content.Intent.extras, ] : Intent | provenance | | -| Test.java:98:10:98:45 | createChooser(...) : Intent [android.content.Intent.extras, ] : Intent | Test.java:99:38:99:40 | out : Intent [android.content.Intent.extras, ] : Intent | provenance | | -| Test.java:98:31:98:32 | in : Intent | Test.java:98:10:98:45 | createChooser(...) : Intent [android.content.Intent.extras, ] : Intent | provenance | MaD:17 | | Test.java:98:31:98:32 | in : Intent | Test.java:98:10:98:45 | createChooser(...) : Intent [android.content.Intent.extras, ] : Intent | provenance | MaD:17 | | Test.java:99:21:99:41 | getIntent_extras(...) : Bundle [] : Intent | Test.java:99:9:99:42 | getMapValue(...) | provenance | MaD:175 | | Test.java:99:38:99:40 | out : Intent [android.content.Intent.extras, ] : Intent | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : Intent | provenance | | -| Test.java:99:38:99:40 | out : Intent [android.content.Intent.extras, ] : Intent | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : Intent | provenance | | -| Test.java:99:38:99:40 | out : Intent [android.content.Intent.extras, ] : Intent | Test.java:99:21:99:41 | getIntent_extras(...) : Bundle [] : Intent | provenance | MaD:34 | | Test.java:99:38:99:40 | out : Intent [android.content.Intent.extras, ] : Intent | Test.java:99:21:99:41 | getIntent_extras(...) : Bundle [] : Intent | provenance | MaD:34 | | Test.java:104:16:104:76 | (...)... : Intent [android.content.Intent.extras, ] : Object | Test.java:105:10:105:11 | in : Intent [android.content.Intent.extras, ] : Object | provenance | | | Test.java:104:24:104:76 | newWithIntent_extras(...) : Intent [android.content.Intent.extras, ] : Object | Test.java:104:16:104:76 | (...)... : Intent [android.content.Intent.extras, ] : Object | provenance | | @@ -504,25 +438,17 @@ edges | Test.java:244:16:244:31 | (...)... : String | Test.java:245:38:245:39 | in : String | provenance | | | Test.java:244:24:244:31 | source(...) : Object | Test.java:244:16:244:31 | (...)... : String | provenance | | | Test.java:245:4:245:6 | out [post update] : Intent [android.content.Intent.extras, ] : String | Test.java:246:36:246:38 | out : Intent [android.content.Intent.extras, ] : String | provenance | | -| Test.java:245:4:245:6 | out [post update] : Intent [android.content.Intent.extras, ] : String | Test.java:246:36:246:38 | out : Intent [android.content.Intent.extras, ] : String | provenance | | -| Test.java:245:38:245:39 | in : String | Test.java:245:4:245:6 | out [post update] : Intent [android.content.Intent.extras, ] : String | provenance | MaD:45 | | Test.java:245:38:245:39 | in : String | Test.java:245:4:245:6 | out [post update] : Intent [android.content.Intent.extras, ] : String | provenance | MaD:45 | | Test.java:246:19:246:39 | getIntent_extras(...) : Bundle [] : String | Test.java:24:19:24:30 | b : Bundle [] : String | provenance | | | Test.java:246:19:246:39 | getIntent_extras(...) : Bundle [] : String | Test.java:246:9:246:40 | getMapKey(...) | provenance | MaD:98 | | Test.java:246:36:246:38 | out : Intent [android.content.Intent.extras, ] : String | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : String | provenance | | -| Test.java:246:36:246:38 | out : Intent [android.content.Intent.extras, ] : String | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : String | provenance | | -| Test.java:246:36:246:38 | out : Intent [android.content.Intent.extras, ] : String | Test.java:246:19:246:39 | getIntent_extras(...) : Bundle [] : String | provenance | MaD:34 | | Test.java:246:36:246:38 | out : Intent [android.content.Intent.extras, ] : String | Test.java:246:19:246:39 | getIntent_extras(...) : Bundle [] : String | provenance | MaD:34 | | Test.java:251:19:251:37 | (...)... : ArrayList | Test.java:252:44:252:45 | in : ArrayList | provenance | | | Test.java:251:30:251:37 | source(...) : Object | Test.java:251:19:251:37 | (...)... : ArrayList | provenance | | | Test.java:252:4:252:6 | out [post update] : Intent [android.content.Intent.extras, ] : ArrayList | Test.java:253:38:253:40 | out : Intent [android.content.Intent.extras, ] : ArrayList | provenance | | -| Test.java:252:4:252:6 | out [post update] : Intent [android.content.Intent.extras, ] : ArrayList | Test.java:253:38:253:40 | out : Intent [android.content.Intent.extras, ] : ArrayList | provenance | | -| Test.java:252:44:252:45 | in : ArrayList | Test.java:252:4:252:6 | out [post update] : Intent [android.content.Intent.extras, ] : ArrayList | provenance | MaD:46 | | Test.java:252:44:252:45 | in : ArrayList | Test.java:252:4:252:6 | out [post update] : Intent [android.content.Intent.extras, ] : ArrayList | provenance | MaD:46 | | Test.java:253:21:253:41 | getIntent_extras(...) : Bundle [] : ArrayList | Test.java:253:9:253:42 | getMapValue(...) | provenance | MaD:175 | | Test.java:253:38:253:40 | out : Intent [android.content.Intent.extras, ] : ArrayList | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : ArrayList | provenance | | -| Test.java:253:38:253:40 | out : Intent [android.content.Intent.extras, ] : ArrayList | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : ArrayList | provenance | | -| Test.java:253:38:253:40 | out : Intent [android.content.Intent.extras, ] : ArrayList | Test.java:253:21:253:41 | getIntent_extras(...) : Bundle [] : ArrayList | provenance | MaD:34 | | Test.java:253:38:253:40 | out : Intent [android.content.Intent.extras, ] : ArrayList | Test.java:253:21:253:41 | getIntent_extras(...) : Bundle [] : ArrayList | provenance | MaD:34 | | Test.java:258:16:258:31 | (...)... : Intent | Test.java:259:10:259:11 | in : Intent | provenance | | | Test.java:258:24:258:31 | source(...) : Object | Test.java:258:16:258:31 | (...)... : Intent | provenance | | @@ -623,554 +549,362 @@ edges | Test.java:426:16:426:31 | (...)... : String | Test.java:427:17:427:18 | in : String | provenance | | | Test.java:426:24:426:31 | source(...) : Object | Test.java:426:16:426:31 | (...)... : String | provenance | | | Test.java:427:4:427:6 | out [post update] : Intent [android.content.Intent.extras, ] : String | Test.java:428:36:428:38 | out : Intent [android.content.Intent.extras, ] : String | provenance | | -| Test.java:427:4:427:6 | out [post update] : Intent [android.content.Intent.extras, ] : String | Test.java:428:36:428:38 | out : Intent [android.content.Intent.extras, ] : String | provenance | | -| Test.java:427:17:427:18 | in : String | Test.java:427:4:427:6 | out [post update] : Intent [android.content.Intent.extras, ] : String | provenance | MaD:48 | | Test.java:427:17:427:18 | in : String | Test.java:427:4:427:6 | out [post update] : Intent [android.content.Intent.extras, ] : String | provenance | MaD:48 | | Test.java:428:19:428:39 | getIntent_extras(...) : Bundle [] : String | Test.java:24:19:24:30 | b : Bundle [] : String | provenance | | | Test.java:428:19:428:39 | getIntent_extras(...) : Bundle [] : String | Test.java:428:9:428:40 | getMapKey(...) | provenance | MaD:98 | | Test.java:428:36:428:38 | out : Intent [android.content.Intent.extras, ] : String | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : String | provenance | | -| Test.java:428:36:428:38 | out : Intent [android.content.Intent.extras, ] : String | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : String | provenance | | -| Test.java:428:36:428:38 | out : Intent [android.content.Intent.extras, ] : String | Test.java:428:19:428:39 | getIntent_extras(...) : Bundle [] : String | provenance | MaD:34 | | Test.java:428:36:428:38 | out : Intent [android.content.Intent.extras, ] : String | Test.java:428:19:428:39 | getIntent_extras(...) : Bundle [] : String | provenance | MaD:34 | | Test.java:433:16:433:31 | (...)... : String | Test.java:434:17:434:18 | in : String | provenance | | | Test.java:433:24:433:31 | source(...) : Object | Test.java:433:16:433:31 | (...)... : String | provenance | | | Test.java:434:4:434:6 | out [post update] : Intent [android.content.Intent.extras, ] : String | Test.java:435:36:435:38 | out : Intent [android.content.Intent.extras, ] : String | provenance | | -| Test.java:434:4:434:6 | out [post update] : Intent [android.content.Intent.extras, ] : String | Test.java:435:36:435:38 | out : Intent [android.content.Intent.extras, ] : String | provenance | | -| Test.java:434:17:434:18 | in : String | Test.java:434:4:434:6 | out [post update] : Intent [android.content.Intent.extras, ] : String | provenance | MaD:48 | | Test.java:434:17:434:18 | in : String | Test.java:434:4:434:6 | out [post update] : Intent [android.content.Intent.extras, ] : String | provenance | MaD:48 | | Test.java:435:19:435:39 | getIntent_extras(...) : Bundle [] : String | Test.java:24:19:24:30 | b : Bundle [] : String | provenance | | | Test.java:435:19:435:39 | getIntent_extras(...) : Bundle [] : String | Test.java:435:9:435:40 | getMapKey(...) | provenance | MaD:98 | | Test.java:435:36:435:38 | out : Intent [android.content.Intent.extras, ] : String | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : String | provenance | | -| Test.java:435:36:435:38 | out : Intent [android.content.Intent.extras, ] : String | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : String | provenance | | -| Test.java:435:36:435:38 | out : Intent [android.content.Intent.extras, ] : String | Test.java:435:19:435:39 | getIntent_extras(...) : Bundle [] : String | provenance | MaD:34 | | Test.java:435:36:435:38 | out : Intent [android.content.Intent.extras, ] : String | Test.java:435:19:435:39 | getIntent_extras(...) : Bundle [] : String | provenance | MaD:34 | | Test.java:440:16:440:31 | (...)... : String | Test.java:441:17:441:18 | in : String | provenance | | | Test.java:440:24:440:31 | source(...) : Object | Test.java:440:16:440:31 | (...)... : String | provenance | | | Test.java:441:4:441:6 | out [post update] : Intent [android.content.Intent.extras, ] : String | Test.java:442:36:442:38 | out : Intent [android.content.Intent.extras, ] : String | provenance | | -| Test.java:441:4:441:6 | out [post update] : Intent [android.content.Intent.extras, ] : String | Test.java:442:36:442:38 | out : Intent [android.content.Intent.extras, ] : String | provenance | | -| Test.java:441:17:441:18 | in : String | Test.java:441:4:441:6 | out [post update] : Intent [android.content.Intent.extras, ] : String | provenance | MaD:48 | | Test.java:441:17:441:18 | in : String | Test.java:441:4:441:6 | out [post update] : Intent [android.content.Intent.extras, ] : String | provenance | MaD:48 | | Test.java:442:19:442:39 | getIntent_extras(...) : Bundle [] : String | Test.java:24:19:24:30 | b : Bundle [] : String | provenance | | | Test.java:442:19:442:39 | getIntent_extras(...) : Bundle [] : String | Test.java:442:9:442:40 | getMapKey(...) | provenance | MaD:98 | | Test.java:442:36:442:38 | out : Intent [android.content.Intent.extras, ] : String | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : String | provenance | | -| Test.java:442:36:442:38 | out : Intent [android.content.Intent.extras, ] : String | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : String | provenance | | -| Test.java:442:36:442:38 | out : Intent [android.content.Intent.extras, ] : String | Test.java:442:19:442:39 | getIntent_extras(...) : Bundle [] : String | provenance | MaD:34 | | Test.java:442:36:442:38 | out : Intent [android.content.Intent.extras, ] : String | Test.java:442:19:442:39 | getIntent_extras(...) : Bundle [] : String | provenance | MaD:34 | | Test.java:447:16:447:31 | (...)... : String | Test.java:448:17:448:18 | in : String | provenance | | | Test.java:447:24:447:31 | source(...) : Object | Test.java:447:16:447:31 | (...)... : String | provenance | | | Test.java:448:4:448:6 | out [post update] : Intent [android.content.Intent.extras, ] : String | Test.java:449:36:449:38 | out : Intent [android.content.Intent.extras, ] : String | provenance | | -| Test.java:448:4:448:6 | out [post update] : Intent [android.content.Intent.extras, ] : String | Test.java:449:36:449:38 | out : Intent [android.content.Intent.extras, ] : String | provenance | | -| Test.java:448:17:448:18 | in : String | Test.java:448:4:448:6 | out [post update] : Intent [android.content.Intent.extras, ] : String | provenance | MaD:48 | | Test.java:448:17:448:18 | in : String | Test.java:448:4:448:6 | out [post update] : Intent [android.content.Intent.extras, ] : String | provenance | MaD:48 | | Test.java:449:19:449:39 | getIntent_extras(...) : Bundle [] : String | Test.java:24:19:24:30 | b : Bundle [] : String | provenance | | | Test.java:449:19:449:39 | getIntent_extras(...) : Bundle [] : String | Test.java:449:9:449:40 | getMapKey(...) | provenance | MaD:98 | | Test.java:449:36:449:38 | out : Intent [android.content.Intent.extras, ] : String | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : String | provenance | | -| Test.java:449:36:449:38 | out : Intent [android.content.Intent.extras, ] : String | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : String | provenance | | -| Test.java:449:36:449:38 | out : Intent [android.content.Intent.extras, ] : String | Test.java:449:19:449:39 | getIntent_extras(...) : Bundle [] : String | provenance | MaD:34 | | Test.java:449:36:449:38 | out : Intent [android.content.Intent.extras, ] : String | Test.java:449:19:449:39 | getIntent_extras(...) : Bundle [] : String | provenance | MaD:34 | | Test.java:454:16:454:31 | (...)... : String | Test.java:455:17:455:18 | in : String | provenance | | | Test.java:454:24:454:31 | source(...) : Object | Test.java:454:16:454:31 | (...)... : String | provenance | | | Test.java:455:4:455:6 | out [post update] : Intent [android.content.Intent.extras, ] : String | Test.java:456:36:456:38 | out : Intent [android.content.Intent.extras, ] : String | provenance | | -| Test.java:455:4:455:6 | out [post update] : Intent [android.content.Intent.extras, ] : String | Test.java:456:36:456:38 | out : Intent [android.content.Intent.extras, ] : String | provenance | | -| Test.java:455:17:455:18 | in : String | Test.java:455:4:455:6 | out [post update] : Intent [android.content.Intent.extras, ] : String | provenance | MaD:48 | | Test.java:455:17:455:18 | in : String | Test.java:455:4:455:6 | out [post update] : Intent [android.content.Intent.extras, ] : String | provenance | MaD:48 | | Test.java:456:19:456:39 | getIntent_extras(...) : Bundle [] : String | Test.java:24:19:24:30 | b : Bundle [] : String | provenance | | | Test.java:456:19:456:39 | getIntent_extras(...) : Bundle [] : String | Test.java:456:9:456:40 | getMapKey(...) | provenance | MaD:98 | | Test.java:456:36:456:38 | out : Intent [android.content.Intent.extras, ] : String | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : String | provenance | | -| Test.java:456:36:456:38 | out : Intent [android.content.Intent.extras, ] : String | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : String | provenance | | -| Test.java:456:36:456:38 | out : Intent [android.content.Intent.extras, ] : String | Test.java:456:19:456:39 | getIntent_extras(...) : Bundle [] : String | provenance | MaD:34 | | Test.java:456:36:456:38 | out : Intent [android.content.Intent.extras, ] : String | Test.java:456:19:456:39 | getIntent_extras(...) : Bundle [] : String | provenance | MaD:34 | | Test.java:461:16:461:31 | (...)... : String | Test.java:462:17:462:18 | in : String | provenance | | | Test.java:461:24:461:31 | source(...) : Object | Test.java:461:16:461:31 | (...)... : String | provenance | | | Test.java:462:4:462:6 | out [post update] : Intent [android.content.Intent.extras, ] : String | Test.java:463:36:463:38 | out : Intent [android.content.Intent.extras, ] : String | provenance | | -| Test.java:462:4:462:6 | out [post update] : Intent [android.content.Intent.extras, ] : String | Test.java:463:36:463:38 | out : Intent [android.content.Intent.extras, ] : String | provenance | | -| Test.java:462:17:462:18 | in : String | Test.java:462:4:462:6 | out [post update] : Intent [android.content.Intent.extras, ] : String | provenance | MaD:48 | | Test.java:462:17:462:18 | in : String | Test.java:462:4:462:6 | out [post update] : Intent [android.content.Intent.extras, ] : String | provenance | MaD:48 | | Test.java:463:19:463:39 | getIntent_extras(...) : Bundle [] : String | Test.java:24:19:24:30 | b : Bundle [] : String | provenance | | | Test.java:463:19:463:39 | getIntent_extras(...) : Bundle [] : String | Test.java:463:9:463:40 | getMapKey(...) | provenance | MaD:98 | | Test.java:463:36:463:38 | out : Intent [android.content.Intent.extras, ] : String | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : String | provenance | | -| Test.java:463:36:463:38 | out : Intent [android.content.Intent.extras, ] : String | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : String | provenance | | -| Test.java:463:36:463:38 | out : Intent [android.content.Intent.extras, ] : String | Test.java:463:19:463:39 | getIntent_extras(...) : Bundle [] : String | provenance | MaD:34 | | Test.java:463:36:463:38 | out : Intent [android.content.Intent.extras, ] : String | Test.java:463:19:463:39 | getIntent_extras(...) : Bundle [] : String | provenance | MaD:34 | | Test.java:468:16:468:31 | (...)... : String | Test.java:469:17:469:18 | in : String | provenance | | | Test.java:468:24:468:31 | source(...) : Object | Test.java:468:16:468:31 | (...)... : String | provenance | | | Test.java:469:4:469:6 | out [post update] : Intent [android.content.Intent.extras, ] : String | Test.java:470:36:470:38 | out : Intent [android.content.Intent.extras, ] : String | provenance | | -| Test.java:469:4:469:6 | out [post update] : Intent [android.content.Intent.extras, ] : String | Test.java:470:36:470:38 | out : Intent [android.content.Intent.extras, ] : String | provenance | | -| Test.java:469:17:469:18 | in : String | Test.java:469:4:469:6 | out [post update] : Intent [android.content.Intent.extras, ] : String | provenance | MaD:48 | | Test.java:469:17:469:18 | in : String | Test.java:469:4:469:6 | out [post update] : Intent [android.content.Intent.extras, ] : String | provenance | MaD:48 | | Test.java:470:19:470:39 | getIntent_extras(...) : Bundle [] : String | Test.java:24:19:24:30 | b : Bundle [] : String | provenance | | | Test.java:470:19:470:39 | getIntent_extras(...) : Bundle [] : String | Test.java:470:9:470:40 | getMapKey(...) | provenance | MaD:98 | | Test.java:470:36:470:38 | out : Intent [android.content.Intent.extras, ] : String | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : String | provenance | | -| Test.java:470:36:470:38 | out : Intent [android.content.Intent.extras, ] : String | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : String | provenance | | -| Test.java:470:36:470:38 | out : Intent [android.content.Intent.extras, ] : String | Test.java:470:19:470:39 | getIntent_extras(...) : Bundle [] : String | provenance | MaD:34 | | Test.java:470:36:470:38 | out : Intent [android.content.Intent.extras, ] : String | Test.java:470:19:470:39 | getIntent_extras(...) : Bundle [] : String | provenance | MaD:34 | | Test.java:475:16:475:31 | (...)... : String | Test.java:476:17:476:18 | in : String | provenance | | | Test.java:475:24:475:31 | source(...) : Object | Test.java:475:16:475:31 | (...)... : String | provenance | | | Test.java:476:4:476:6 | out [post update] : Intent [android.content.Intent.extras, ] : String | Test.java:477:36:477:38 | out : Intent [android.content.Intent.extras, ] : String | provenance | | -| Test.java:476:4:476:6 | out [post update] : Intent [android.content.Intent.extras, ] : String | Test.java:477:36:477:38 | out : Intent [android.content.Intent.extras, ] : String | provenance | | -| Test.java:476:17:476:18 | in : String | Test.java:476:4:476:6 | out [post update] : Intent [android.content.Intent.extras, ] : String | provenance | MaD:48 | | Test.java:476:17:476:18 | in : String | Test.java:476:4:476:6 | out [post update] : Intent [android.content.Intent.extras, ] : String | provenance | MaD:48 | | Test.java:477:19:477:39 | getIntent_extras(...) : Bundle [] : String | Test.java:24:19:24:30 | b : Bundle [] : String | provenance | | | Test.java:477:19:477:39 | getIntent_extras(...) : Bundle [] : String | Test.java:477:9:477:40 | getMapKey(...) | provenance | MaD:98 | | Test.java:477:36:477:38 | out : Intent [android.content.Intent.extras, ] : String | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : String | provenance | | -| Test.java:477:36:477:38 | out : Intent [android.content.Intent.extras, ] : String | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : String | provenance | | -| Test.java:477:36:477:38 | out : Intent [android.content.Intent.extras, ] : String | Test.java:477:19:477:39 | getIntent_extras(...) : Bundle [] : String | provenance | MaD:34 | | Test.java:477:36:477:38 | out : Intent [android.content.Intent.extras, ] : String | Test.java:477:19:477:39 | getIntent_extras(...) : Bundle [] : String | provenance | MaD:34 | | Test.java:482:16:482:31 | (...)... : String | Test.java:483:17:483:18 | in : String | provenance | | | Test.java:482:24:482:31 | source(...) : Object | Test.java:482:16:482:31 | (...)... : String | provenance | | | Test.java:483:4:483:6 | out [post update] : Intent [android.content.Intent.extras, ] : String | Test.java:484:36:484:38 | out : Intent [android.content.Intent.extras, ] : String | provenance | | -| Test.java:483:4:483:6 | out [post update] : Intent [android.content.Intent.extras, ] : String | Test.java:484:36:484:38 | out : Intent [android.content.Intent.extras, ] : String | provenance | | -| Test.java:483:17:483:18 | in : String | Test.java:483:4:483:6 | out [post update] : Intent [android.content.Intent.extras, ] : String | provenance | MaD:48 | | Test.java:483:17:483:18 | in : String | Test.java:483:4:483:6 | out [post update] : Intent [android.content.Intent.extras, ] : String | provenance | MaD:48 | | Test.java:484:19:484:39 | getIntent_extras(...) : Bundle [] : String | Test.java:24:19:24:30 | b : Bundle [] : String | provenance | | | Test.java:484:19:484:39 | getIntent_extras(...) : Bundle [] : String | Test.java:484:9:484:40 | getMapKey(...) | provenance | MaD:98 | | Test.java:484:36:484:38 | out : Intent [android.content.Intent.extras, ] : String | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : String | provenance | | -| Test.java:484:36:484:38 | out : Intent [android.content.Intent.extras, ] : String | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : String | provenance | | -| Test.java:484:36:484:38 | out : Intent [android.content.Intent.extras, ] : String | Test.java:484:19:484:39 | getIntent_extras(...) : Bundle [] : String | provenance | MaD:34 | | Test.java:484:36:484:38 | out : Intent [android.content.Intent.extras, ] : String | Test.java:484:19:484:39 | getIntent_extras(...) : Bundle [] : String | provenance | MaD:34 | | Test.java:489:16:489:31 | (...)... : String | Test.java:490:17:490:18 | in : String | provenance | | | Test.java:489:24:489:31 | source(...) : Object | Test.java:489:16:489:31 | (...)... : String | provenance | | | Test.java:490:4:490:6 | out [post update] : Intent [android.content.Intent.extras, ] : String | Test.java:491:36:491:38 | out : Intent [android.content.Intent.extras, ] : String | provenance | | -| Test.java:490:4:490:6 | out [post update] : Intent [android.content.Intent.extras, ] : String | Test.java:491:36:491:38 | out : Intent [android.content.Intent.extras, ] : String | provenance | | -| Test.java:490:17:490:18 | in : String | Test.java:490:4:490:6 | out [post update] : Intent [android.content.Intent.extras, ] : String | provenance | MaD:48 | | Test.java:490:17:490:18 | in : String | Test.java:490:4:490:6 | out [post update] : Intent [android.content.Intent.extras, ] : String | provenance | MaD:48 | | Test.java:491:19:491:39 | getIntent_extras(...) : Bundle [] : String | Test.java:24:19:24:30 | b : Bundle [] : String | provenance | | | Test.java:491:19:491:39 | getIntent_extras(...) : Bundle [] : String | Test.java:491:9:491:40 | getMapKey(...) | provenance | MaD:98 | | Test.java:491:36:491:38 | out : Intent [android.content.Intent.extras, ] : String | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : String | provenance | | -| Test.java:491:36:491:38 | out : Intent [android.content.Intent.extras, ] : String | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : String | provenance | | -| Test.java:491:36:491:38 | out : Intent [android.content.Intent.extras, ] : String | Test.java:491:19:491:39 | getIntent_extras(...) : Bundle [] : String | provenance | MaD:34 | | Test.java:491:36:491:38 | out : Intent [android.content.Intent.extras, ] : String | Test.java:491:19:491:39 | getIntent_extras(...) : Bundle [] : String | provenance | MaD:34 | | Test.java:496:16:496:31 | (...)... : String | Test.java:497:17:497:18 | in : String | provenance | | | Test.java:496:24:496:31 | source(...) : Object | Test.java:496:16:496:31 | (...)... : String | provenance | | | Test.java:497:4:497:6 | out [post update] : Intent [android.content.Intent.extras, ] : String | Test.java:498:36:498:38 | out : Intent [android.content.Intent.extras, ] : String | provenance | | -| Test.java:497:4:497:6 | out [post update] : Intent [android.content.Intent.extras, ] : String | Test.java:498:36:498:38 | out : Intent [android.content.Intent.extras, ] : String | provenance | | -| Test.java:497:17:497:18 | in : String | Test.java:497:4:497:6 | out [post update] : Intent [android.content.Intent.extras, ] : String | provenance | MaD:48 | | Test.java:497:17:497:18 | in : String | Test.java:497:4:497:6 | out [post update] : Intent [android.content.Intent.extras, ] : String | provenance | MaD:48 | | Test.java:498:19:498:39 | getIntent_extras(...) : Bundle [] : String | Test.java:24:19:24:30 | b : Bundle [] : String | provenance | | | Test.java:498:19:498:39 | getIntent_extras(...) : Bundle [] : String | Test.java:498:9:498:40 | getMapKey(...) | provenance | MaD:98 | | Test.java:498:36:498:38 | out : Intent [android.content.Intent.extras, ] : String | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : String | provenance | | -| Test.java:498:36:498:38 | out : Intent [android.content.Intent.extras, ] : String | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : String | provenance | | -| Test.java:498:36:498:38 | out : Intent [android.content.Intent.extras, ] : String | Test.java:498:19:498:39 | getIntent_extras(...) : Bundle [] : String | provenance | MaD:34 | | Test.java:498:36:498:38 | out : Intent [android.content.Intent.extras, ] : String | Test.java:498:19:498:39 | getIntent_extras(...) : Bundle [] : String | provenance | MaD:34 | | Test.java:503:16:503:31 | (...)... : String | Test.java:504:17:504:18 | in : String | provenance | | | Test.java:503:24:503:31 | source(...) : Object | Test.java:503:16:503:31 | (...)... : String | provenance | | | Test.java:504:4:504:6 | out [post update] : Intent [android.content.Intent.extras, ] : String | Test.java:505:36:505:38 | out : Intent [android.content.Intent.extras, ] : String | provenance | | -| Test.java:504:4:504:6 | out [post update] : Intent [android.content.Intent.extras, ] : String | Test.java:505:36:505:38 | out : Intent [android.content.Intent.extras, ] : String | provenance | | -| Test.java:504:17:504:18 | in : String | Test.java:504:4:504:6 | out [post update] : Intent [android.content.Intent.extras, ] : String | provenance | MaD:48 | | Test.java:504:17:504:18 | in : String | Test.java:504:4:504:6 | out [post update] : Intent [android.content.Intent.extras, ] : String | provenance | MaD:48 | | Test.java:505:19:505:39 | getIntent_extras(...) : Bundle [] : String | Test.java:24:19:24:30 | b : Bundle [] : String | provenance | | | Test.java:505:19:505:39 | getIntent_extras(...) : Bundle [] : String | Test.java:505:9:505:40 | getMapKey(...) | provenance | MaD:98 | | Test.java:505:36:505:38 | out : Intent [android.content.Intent.extras, ] : String | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : String | provenance | | -| Test.java:505:36:505:38 | out : Intent [android.content.Intent.extras, ] : String | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : String | provenance | | -| Test.java:505:36:505:38 | out : Intent [android.content.Intent.extras, ] : String | Test.java:505:19:505:39 | getIntent_extras(...) : Bundle [] : String | provenance | MaD:34 | | Test.java:505:36:505:38 | out : Intent [android.content.Intent.extras, ] : String | Test.java:505:19:505:39 | getIntent_extras(...) : Bundle [] : String | provenance | MaD:34 | | Test.java:510:16:510:31 | (...)... : String | Test.java:511:17:511:18 | in : String | provenance | | | Test.java:510:24:510:31 | source(...) : Object | Test.java:510:16:510:31 | (...)... : String | provenance | | | Test.java:511:4:511:6 | out [post update] : Intent [android.content.Intent.extras, ] : String | Test.java:512:36:512:38 | out : Intent [android.content.Intent.extras, ] : String | provenance | | -| Test.java:511:4:511:6 | out [post update] : Intent [android.content.Intent.extras, ] : String | Test.java:512:36:512:38 | out : Intent [android.content.Intent.extras, ] : String | provenance | | -| Test.java:511:17:511:18 | in : String | Test.java:511:4:511:6 | out [post update] : Intent [android.content.Intent.extras, ] : String | provenance | MaD:48 | | Test.java:511:17:511:18 | in : String | Test.java:511:4:511:6 | out [post update] : Intent [android.content.Intent.extras, ] : String | provenance | MaD:48 | | Test.java:512:19:512:39 | getIntent_extras(...) : Bundle [] : String | Test.java:24:19:24:30 | b : Bundle [] : String | provenance | | | Test.java:512:19:512:39 | getIntent_extras(...) : Bundle [] : String | Test.java:512:9:512:40 | getMapKey(...) | provenance | MaD:98 | | Test.java:512:36:512:38 | out : Intent [android.content.Intent.extras, ] : String | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : String | provenance | | -| Test.java:512:36:512:38 | out : Intent [android.content.Intent.extras, ] : String | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : String | provenance | | -| Test.java:512:36:512:38 | out : Intent [android.content.Intent.extras, ] : String | Test.java:512:19:512:39 | getIntent_extras(...) : Bundle [] : String | provenance | MaD:34 | | Test.java:512:36:512:38 | out : Intent [android.content.Intent.extras, ] : String | Test.java:512:19:512:39 | getIntent_extras(...) : Bundle [] : String | provenance | MaD:34 | | Test.java:517:16:517:31 | (...)... : String | Test.java:518:17:518:18 | in : String | provenance | | | Test.java:517:24:517:31 | source(...) : Object | Test.java:517:16:517:31 | (...)... : String | provenance | | | Test.java:518:4:518:6 | out [post update] : Intent [android.content.Intent.extras, ] : String | Test.java:519:36:519:38 | out : Intent [android.content.Intent.extras, ] : String | provenance | | -| Test.java:518:4:518:6 | out [post update] : Intent [android.content.Intent.extras, ] : String | Test.java:519:36:519:38 | out : Intent [android.content.Intent.extras, ] : String | provenance | | -| Test.java:518:17:518:18 | in : String | Test.java:518:4:518:6 | out [post update] : Intent [android.content.Intent.extras, ] : String | provenance | MaD:48 | | Test.java:518:17:518:18 | in : String | Test.java:518:4:518:6 | out [post update] : Intent [android.content.Intent.extras, ] : String | provenance | MaD:48 | | Test.java:519:19:519:39 | getIntent_extras(...) : Bundle [] : String | Test.java:24:19:24:30 | b : Bundle [] : String | provenance | | | Test.java:519:19:519:39 | getIntent_extras(...) : Bundle [] : String | Test.java:519:9:519:40 | getMapKey(...) | provenance | MaD:98 | | Test.java:519:36:519:38 | out : Intent [android.content.Intent.extras, ] : String | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : String | provenance | | -| Test.java:519:36:519:38 | out : Intent [android.content.Intent.extras, ] : String | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : String | provenance | | -| Test.java:519:36:519:38 | out : Intent [android.content.Intent.extras, ] : String | Test.java:519:19:519:39 | getIntent_extras(...) : Bundle [] : String | provenance | MaD:34 | | Test.java:519:36:519:38 | out : Intent [android.content.Intent.extras, ] : String | Test.java:519:19:519:39 | getIntent_extras(...) : Bundle [] : String | provenance | MaD:34 | | Test.java:524:16:524:31 | (...)... : String | Test.java:525:17:525:18 | in : String | provenance | | | Test.java:524:24:524:31 | source(...) : Object | Test.java:524:16:524:31 | (...)... : String | provenance | | | Test.java:525:4:525:6 | out [post update] : Intent [android.content.Intent.extras, ] : String | Test.java:526:36:526:38 | out : Intent [android.content.Intent.extras, ] : String | provenance | | -| Test.java:525:4:525:6 | out [post update] : Intent [android.content.Intent.extras, ] : String | Test.java:526:36:526:38 | out : Intent [android.content.Intent.extras, ] : String | provenance | | -| Test.java:525:17:525:18 | in : String | Test.java:525:4:525:6 | out [post update] : Intent [android.content.Intent.extras, ] : String | provenance | MaD:48 | | Test.java:525:17:525:18 | in : String | Test.java:525:4:525:6 | out [post update] : Intent [android.content.Intent.extras, ] : String | provenance | MaD:48 | | Test.java:526:19:526:39 | getIntent_extras(...) : Bundle [] : String | Test.java:24:19:24:30 | b : Bundle [] : String | provenance | | | Test.java:526:19:526:39 | getIntent_extras(...) : Bundle [] : String | Test.java:526:9:526:40 | getMapKey(...) | provenance | MaD:98 | | Test.java:526:36:526:38 | out : Intent [android.content.Intent.extras, ] : String | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : String | provenance | | -| Test.java:526:36:526:38 | out : Intent [android.content.Intent.extras, ] : String | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : String | provenance | | -| Test.java:526:36:526:38 | out : Intent [android.content.Intent.extras, ] : String | Test.java:526:19:526:39 | getIntent_extras(...) : Bundle [] : String | provenance | MaD:34 | | Test.java:526:36:526:38 | out : Intent [android.content.Intent.extras, ] : String | Test.java:526:19:526:39 | getIntent_extras(...) : Bundle [] : String | provenance | MaD:34 | | Test.java:531:16:531:31 | (...)... : String | Test.java:532:17:532:18 | in : String | provenance | | | Test.java:531:24:531:31 | source(...) : Object | Test.java:531:16:531:31 | (...)... : String | provenance | | | Test.java:532:4:532:6 | out [post update] : Intent [android.content.Intent.extras, ] : String | Test.java:533:36:533:38 | out : Intent [android.content.Intent.extras, ] : String | provenance | | -| Test.java:532:4:532:6 | out [post update] : Intent [android.content.Intent.extras, ] : String | Test.java:533:36:533:38 | out : Intent [android.content.Intent.extras, ] : String | provenance | | -| Test.java:532:17:532:18 | in : String | Test.java:532:4:532:6 | out [post update] : Intent [android.content.Intent.extras, ] : String | provenance | MaD:48 | | Test.java:532:17:532:18 | in : String | Test.java:532:4:532:6 | out [post update] : Intent [android.content.Intent.extras, ] : String | provenance | MaD:48 | | Test.java:533:19:533:39 | getIntent_extras(...) : Bundle [] : String | Test.java:24:19:24:30 | b : Bundle [] : String | provenance | | | Test.java:533:19:533:39 | getIntent_extras(...) : Bundle [] : String | Test.java:533:9:533:40 | getMapKey(...) | provenance | MaD:98 | | Test.java:533:36:533:38 | out : Intent [android.content.Intent.extras, ] : String | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : String | provenance | | -| Test.java:533:36:533:38 | out : Intent [android.content.Intent.extras, ] : String | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : String | provenance | | -| Test.java:533:36:533:38 | out : Intent [android.content.Intent.extras, ] : String | Test.java:533:19:533:39 | getIntent_extras(...) : Bundle [] : String | provenance | MaD:34 | | Test.java:533:36:533:38 | out : Intent [android.content.Intent.extras, ] : String | Test.java:533:19:533:39 | getIntent_extras(...) : Bundle [] : String | provenance | MaD:34 | | Test.java:538:16:538:31 | (...)... : String | Test.java:539:17:539:18 | in : String | provenance | | | Test.java:538:24:538:31 | source(...) : Object | Test.java:538:16:538:31 | (...)... : String | provenance | | | Test.java:539:4:539:6 | out [post update] : Intent [android.content.Intent.extras, ] : String | Test.java:540:36:540:38 | out : Intent [android.content.Intent.extras, ] : String | provenance | | -| Test.java:539:4:539:6 | out [post update] : Intent [android.content.Intent.extras, ] : String | Test.java:540:36:540:38 | out : Intent [android.content.Intent.extras, ] : String | provenance | | -| Test.java:539:17:539:18 | in : String | Test.java:539:4:539:6 | out [post update] : Intent [android.content.Intent.extras, ] : String | provenance | MaD:48 | | Test.java:539:17:539:18 | in : String | Test.java:539:4:539:6 | out [post update] : Intent [android.content.Intent.extras, ] : String | provenance | MaD:48 | | Test.java:540:19:540:39 | getIntent_extras(...) : Bundle [] : String | Test.java:24:19:24:30 | b : Bundle [] : String | provenance | | | Test.java:540:19:540:39 | getIntent_extras(...) : Bundle [] : String | Test.java:540:9:540:40 | getMapKey(...) | provenance | MaD:98 | | Test.java:540:36:540:38 | out : Intent [android.content.Intent.extras, ] : String | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : String | provenance | | -| Test.java:540:36:540:38 | out : Intent [android.content.Intent.extras, ] : String | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : String | provenance | | -| Test.java:540:36:540:38 | out : Intent [android.content.Intent.extras, ] : String | Test.java:540:19:540:39 | getIntent_extras(...) : Bundle [] : String | provenance | MaD:34 | | Test.java:540:36:540:38 | out : Intent [android.content.Intent.extras, ] : String | Test.java:540:19:540:39 | getIntent_extras(...) : Bundle [] : String | provenance | MaD:34 | | Test.java:545:16:545:31 | (...)... : String | Test.java:546:17:546:18 | in : String | provenance | | | Test.java:545:24:545:31 | source(...) : Object | Test.java:545:16:545:31 | (...)... : String | provenance | | | Test.java:546:4:546:6 | out [post update] : Intent [android.content.Intent.extras, ] : String | Test.java:547:36:547:38 | out : Intent [android.content.Intent.extras, ] : String | provenance | | -| Test.java:546:4:546:6 | out [post update] : Intent [android.content.Intent.extras, ] : String | Test.java:547:36:547:38 | out : Intent [android.content.Intent.extras, ] : String | provenance | | -| Test.java:546:17:546:18 | in : String | Test.java:546:4:546:6 | out [post update] : Intent [android.content.Intent.extras, ] : String | provenance | MaD:48 | | Test.java:546:17:546:18 | in : String | Test.java:546:4:546:6 | out [post update] : Intent [android.content.Intent.extras, ] : String | provenance | MaD:48 | | Test.java:547:19:547:39 | getIntent_extras(...) : Bundle [] : String | Test.java:24:19:24:30 | b : Bundle [] : String | provenance | | | Test.java:547:19:547:39 | getIntent_extras(...) : Bundle [] : String | Test.java:547:9:547:40 | getMapKey(...) | provenance | MaD:98 | | Test.java:547:36:547:38 | out : Intent [android.content.Intent.extras, ] : String | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : String | provenance | | -| Test.java:547:36:547:38 | out : Intent [android.content.Intent.extras, ] : String | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : String | provenance | | -| Test.java:547:36:547:38 | out : Intent [android.content.Intent.extras, ] : String | Test.java:547:19:547:39 | getIntent_extras(...) : Bundle [] : String | provenance | MaD:34 | | Test.java:547:36:547:38 | out : Intent [android.content.Intent.extras, ] : String | Test.java:547:19:547:39 | getIntent_extras(...) : Bundle [] : String | provenance | MaD:34 | | Test.java:552:16:552:31 | (...)... : String | Test.java:553:17:553:18 | in : String | provenance | | | Test.java:552:24:552:31 | source(...) : Object | Test.java:552:16:552:31 | (...)... : String | provenance | | | Test.java:553:4:553:6 | out [post update] : Intent [android.content.Intent.extras, ] : String | Test.java:554:36:554:38 | out : Intent [android.content.Intent.extras, ] : String | provenance | | -| Test.java:553:4:553:6 | out [post update] : Intent [android.content.Intent.extras, ] : String | Test.java:554:36:554:38 | out : Intent [android.content.Intent.extras, ] : String | provenance | | -| Test.java:553:17:553:18 | in : String | Test.java:553:4:553:6 | out [post update] : Intent [android.content.Intent.extras, ] : String | provenance | MaD:48 | | Test.java:553:17:553:18 | in : String | Test.java:553:4:553:6 | out [post update] : Intent [android.content.Intent.extras, ] : String | provenance | MaD:48 | | Test.java:554:19:554:39 | getIntent_extras(...) : Bundle [] : String | Test.java:24:19:24:30 | b : Bundle [] : String | provenance | | | Test.java:554:19:554:39 | getIntent_extras(...) : Bundle [] : String | Test.java:554:9:554:40 | getMapKey(...) | provenance | MaD:98 | | Test.java:554:36:554:38 | out : Intent [android.content.Intent.extras, ] : String | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : String | provenance | | -| Test.java:554:36:554:38 | out : Intent [android.content.Intent.extras, ] : String | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : String | provenance | | -| Test.java:554:36:554:38 | out : Intent [android.content.Intent.extras, ] : String | Test.java:554:19:554:39 | getIntent_extras(...) : Bundle [] : String | provenance | MaD:34 | | Test.java:554:36:554:38 | out : Intent [android.content.Intent.extras, ] : String | Test.java:554:19:554:39 | getIntent_extras(...) : Bundle [] : String | provenance | MaD:34 | | Test.java:559:16:559:31 | (...)... : String | Test.java:560:17:560:18 | in : String | provenance | | | Test.java:559:24:559:31 | source(...) : Object | Test.java:559:16:559:31 | (...)... : String | provenance | | | Test.java:560:4:560:6 | out [post update] : Intent [android.content.Intent.extras, ] : String | Test.java:561:36:561:38 | out : Intent [android.content.Intent.extras, ] : String | provenance | | -| Test.java:560:4:560:6 | out [post update] : Intent [android.content.Intent.extras, ] : String | Test.java:561:36:561:38 | out : Intent [android.content.Intent.extras, ] : String | provenance | | -| Test.java:560:17:560:18 | in : String | Test.java:560:4:560:6 | out [post update] : Intent [android.content.Intent.extras, ] : String | provenance | MaD:48 | | Test.java:560:17:560:18 | in : String | Test.java:560:4:560:6 | out [post update] : Intent [android.content.Intent.extras, ] : String | provenance | MaD:48 | | Test.java:561:19:561:39 | getIntent_extras(...) : Bundle [] : String | Test.java:24:19:24:30 | b : Bundle [] : String | provenance | | | Test.java:561:19:561:39 | getIntent_extras(...) : Bundle [] : String | Test.java:561:9:561:40 | getMapKey(...) | provenance | MaD:98 | | Test.java:561:36:561:38 | out : Intent [android.content.Intent.extras, ] : String | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : String | provenance | | -| Test.java:561:36:561:38 | out : Intent [android.content.Intent.extras, ] : String | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : String | provenance | | -| Test.java:561:36:561:38 | out : Intent [android.content.Intent.extras, ] : String | Test.java:561:19:561:39 | getIntent_extras(...) : Bundle [] : String | provenance | MaD:34 | | Test.java:561:36:561:38 | out : Intent [android.content.Intent.extras, ] : String | Test.java:561:19:561:39 | getIntent_extras(...) : Bundle [] : String | provenance | MaD:34 | | Test.java:566:16:566:31 | (...)... : String | Test.java:567:17:567:18 | in : String | provenance | | | Test.java:566:24:566:31 | source(...) : Object | Test.java:566:16:566:31 | (...)... : String | provenance | | | Test.java:567:4:567:6 | out [post update] : Intent [android.content.Intent.extras, ] : String | Test.java:568:36:568:38 | out : Intent [android.content.Intent.extras, ] : String | provenance | | -| Test.java:567:4:567:6 | out [post update] : Intent [android.content.Intent.extras, ] : String | Test.java:568:36:568:38 | out : Intent [android.content.Intent.extras, ] : String | provenance | | -| Test.java:567:17:567:18 | in : String | Test.java:567:4:567:6 | out [post update] : Intent [android.content.Intent.extras, ] : String | provenance | MaD:48 | | Test.java:567:17:567:18 | in : String | Test.java:567:4:567:6 | out [post update] : Intent [android.content.Intent.extras, ] : String | provenance | MaD:48 | | Test.java:568:19:568:39 | getIntent_extras(...) : Bundle [] : String | Test.java:24:19:24:30 | b : Bundle [] : String | provenance | | | Test.java:568:19:568:39 | getIntent_extras(...) : Bundle [] : String | Test.java:568:9:568:40 | getMapKey(...) | provenance | MaD:98 | | Test.java:568:36:568:38 | out : Intent [android.content.Intent.extras, ] : String | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : String | provenance | | -| Test.java:568:36:568:38 | out : Intent [android.content.Intent.extras, ] : String | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : String | provenance | | -| Test.java:568:36:568:38 | out : Intent [android.content.Intent.extras, ] : String | Test.java:568:19:568:39 | getIntent_extras(...) : Bundle [] : String | provenance | MaD:34 | | Test.java:568:36:568:38 | out : Intent [android.content.Intent.extras, ] : String | Test.java:568:19:568:39 | getIntent_extras(...) : Bundle [] : String | provenance | MaD:34 | | Test.java:573:16:573:31 | (...)... : String | Test.java:574:17:574:18 | in : String | provenance | | | Test.java:573:24:573:31 | source(...) : Object | Test.java:573:16:573:31 | (...)... : String | provenance | | | Test.java:574:4:574:6 | out [post update] : Intent [android.content.Intent.extras, ] : String | Test.java:575:36:575:38 | out : Intent [android.content.Intent.extras, ] : String | provenance | | -| Test.java:574:4:574:6 | out [post update] : Intent [android.content.Intent.extras, ] : String | Test.java:575:36:575:38 | out : Intent [android.content.Intent.extras, ] : String | provenance | | -| Test.java:574:17:574:18 | in : String | Test.java:574:4:574:6 | out [post update] : Intent [android.content.Intent.extras, ] : String | provenance | MaD:48 | | Test.java:574:17:574:18 | in : String | Test.java:574:4:574:6 | out [post update] : Intent [android.content.Intent.extras, ] : String | provenance | MaD:48 | | Test.java:575:19:575:39 | getIntent_extras(...) : Bundle [] : String | Test.java:24:19:24:30 | b : Bundle [] : String | provenance | | | Test.java:575:19:575:39 | getIntent_extras(...) : Bundle [] : String | Test.java:575:9:575:40 | getMapKey(...) | provenance | MaD:98 | | Test.java:575:36:575:38 | out : Intent [android.content.Intent.extras, ] : String | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : String | provenance | | -| Test.java:575:36:575:38 | out : Intent [android.content.Intent.extras, ] : String | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : String | provenance | | -| Test.java:575:36:575:38 | out : Intent [android.content.Intent.extras, ] : String | Test.java:575:19:575:39 | getIntent_extras(...) : Bundle [] : String | provenance | MaD:34 | | Test.java:575:36:575:38 | out : Intent [android.content.Intent.extras, ] : String | Test.java:575:19:575:39 | getIntent_extras(...) : Bundle [] : String | provenance | MaD:34 | | Test.java:580:16:580:31 | (...)... : String | Test.java:581:17:581:18 | in : String | provenance | | | Test.java:580:24:580:31 | source(...) : Object | Test.java:580:16:580:31 | (...)... : String | provenance | | | Test.java:581:4:581:6 | out [post update] : Intent [android.content.Intent.extras, ] : String | Test.java:582:36:582:38 | out : Intent [android.content.Intent.extras, ] : String | provenance | | -| Test.java:581:4:581:6 | out [post update] : Intent [android.content.Intent.extras, ] : String | Test.java:582:36:582:38 | out : Intent [android.content.Intent.extras, ] : String | provenance | | -| Test.java:581:17:581:18 | in : String | Test.java:581:4:581:6 | out [post update] : Intent [android.content.Intent.extras, ] : String | provenance | MaD:48 | | Test.java:581:17:581:18 | in : String | Test.java:581:4:581:6 | out [post update] : Intent [android.content.Intent.extras, ] : String | provenance | MaD:48 | | Test.java:582:19:582:39 | getIntent_extras(...) : Bundle [] : String | Test.java:24:19:24:30 | b : Bundle [] : String | provenance | | | Test.java:582:19:582:39 | getIntent_extras(...) : Bundle [] : String | Test.java:582:9:582:40 | getMapKey(...) | provenance | MaD:98 | | Test.java:582:36:582:38 | out : Intent [android.content.Intent.extras, ] : String | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : String | provenance | | -| Test.java:582:36:582:38 | out : Intent [android.content.Intent.extras, ] : String | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : String | provenance | | -| Test.java:582:36:582:38 | out : Intent [android.content.Intent.extras, ] : String | Test.java:582:19:582:39 | getIntent_extras(...) : Bundle [] : String | provenance | MaD:34 | | Test.java:582:36:582:38 | out : Intent [android.content.Intent.extras, ] : String | Test.java:582:19:582:39 | getIntent_extras(...) : Bundle [] : String | provenance | MaD:34 | | Test.java:587:16:587:31 | (...)... : String | Test.java:588:17:588:18 | in : String | provenance | | | Test.java:587:24:587:31 | source(...) : Object | Test.java:587:16:587:31 | (...)... : String | provenance | | | Test.java:588:4:588:6 | out [post update] : Intent [android.content.Intent.extras, ] : String | Test.java:589:36:589:38 | out : Intent [android.content.Intent.extras, ] : String | provenance | | -| Test.java:588:4:588:6 | out [post update] : Intent [android.content.Intent.extras, ] : String | Test.java:589:36:589:38 | out : Intent [android.content.Intent.extras, ] : String | provenance | | -| Test.java:588:17:588:18 | in : String | Test.java:588:4:588:6 | out [post update] : Intent [android.content.Intent.extras, ] : String | provenance | MaD:48 | | Test.java:588:17:588:18 | in : String | Test.java:588:4:588:6 | out [post update] : Intent [android.content.Intent.extras, ] : String | provenance | MaD:48 | | Test.java:589:19:589:39 | getIntent_extras(...) : Bundle [] : String | Test.java:24:19:24:30 | b : Bundle [] : String | provenance | | | Test.java:589:19:589:39 | getIntent_extras(...) : Bundle [] : String | Test.java:589:9:589:40 | getMapKey(...) | provenance | MaD:98 | | Test.java:589:36:589:38 | out : Intent [android.content.Intent.extras, ] : String | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : String | provenance | | -| Test.java:589:36:589:38 | out : Intent [android.content.Intent.extras, ] : String | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : String | provenance | | -| Test.java:589:36:589:38 | out : Intent [android.content.Intent.extras, ] : String | Test.java:589:19:589:39 | getIntent_extras(...) : Bundle [] : String | provenance | MaD:34 | | Test.java:589:36:589:38 | out : Intent [android.content.Intent.extras, ] : String | Test.java:589:19:589:39 | getIntent_extras(...) : Bundle [] : String | provenance | MaD:34 | | Test.java:594:17:594:33 | (...)... : short[] | Test.java:595:31:595:32 | in : short[] | provenance | | | Test.java:594:26:594:33 | source(...) : Object | Test.java:594:17:594:33 | (...)... : short[] | provenance | | | Test.java:595:4:595:6 | out [post update] : Intent [android.content.Intent.extras, ] : short[] | Test.java:596:38:596:40 | out : Intent [android.content.Intent.extras, ] : short[] | provenance | | -| Test.java:595:4:595:6 | out [post update] : Intent [android.content.Intent.extras, ] : short[] | Test.java:596:38:596:40 | out : Intent [android.content.Intent.extras, ] : short[] | provenance | | -| Test.java:595:31:595:32 | in : short[] | Test.java:595:4:595:6 | out [post update] : Intent [android.content.Intent.extras, ] : short[] | provenance | MaD:49 | | Test.java:595:31:595:32 | in : short[] | Test.java:595:4:595:6 | out [post update] : Intent [android.content.Intent.extras, ] : short[] | provenance | MaD:49 | | Test.java:596:21:596:41 | getIntent_extras(...) : Bundle [] : short[] | Test.java:596:9:596:42 | getMapValue(...) | provenance | MaD:175 | | Test.java:596:38:596:40 | out : Intent [android.content.Intent.extras, ] : short[] | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : short[] | provenance | | -| Test.java:596:38:596:40 | out : Intent [android.content.Intent.extras, ] : short[] | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : short[] | provenance | | -| Test.java:596:38:596:40 | out : Intent [android.content.Intent.extras, ] : short[] | Test.java:596:21:596:41 | getIntent_extras(...) : Bundle [] : short[] | provenance | MaD:34 | | Test.java:596:38:596:40 | out : Intent [android.content.Intent.extras, ] : short[] | Test.java:596:21:596:41 | getIntent_extras(...) : Bundle [] : short[] | provenance | MaD:34 | | Test.java:601:15:601:29 | (...)... : Number | Test.java:602:31:602:32 | in : Number | provenance | | | Test.java:601:22:601:29 | source(...) : Object | Test.java:601:15:601:29 | (...)... : Number | provenance | | | Test.java:602:4:602:6 | out [post update] : Intent [android.content.Intent.extras, ] : Number | Test.java:603:38:603:40 | out : Intent [android.content.Intent.extras, ] : Number | provenance | | -| Test.java:602:4:602:6 | out [post update] : Intent [android.content.Intent.extras, ] : Number | Test.java:603:38:603:40 | out : Intent [android.content.Intent.extras, ] : Number | provenance | | -| Test.java:602:31:602:32 | in : Number | Test.java:602:4:602:6 | out [post update] : Intent [android.content.Intent.extras, ] : Number | provenance | MaD:49 | | Test.java:602:31:602:32 | in : Number | Test.java:602:4:602:6 | out [post update] : Intent [android.content.Intent.extras, ] : Number | provenance | MaD:49 | | Test.java:603:21:603:41 | getIntent_extras(...) : Bundle [] : Number | Test.java:603:9:603:42 | getMapValue(...) | provenance | MaD:175 | | Test.java:603:38:603:40 | out : Intent [android.content.Intent.extras, ] : Number | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : Number | provenance | | -| Test.java:603:38:603:40 | out : Intent [android.content.Intent.extras, ] : Number | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : Number | provenance | | -| Test.java:603:38:603:40 | out : Intent [android.content.Intent.extras, ] : Number | Test.java:603:21:603:41 | getIntent_extras(...) : Bundle [] : Number | provenance | MaD:34 | | Test.java:603:38:603:40 | out : Intent [android.content.Intent.extras, ] : Number | Test.java:603:21:603:41 | getIntent_extras(...) : Bundle [] : Number | provenance | MaD:34 | | Test.java:608:16:608:31 | (...)... : long[] | Test.java:609:31:609:32 | in : long[] | provenance | | | Test.java:608:24:608:31 | source(...) : Object | Test.java:608:16:608:31 | (...)... : long[] | provenance | | | Test.java:609:4:609:6 | out [post update] : Intent [android.content.Intent.extras, ] : long[] | Test.java:610:38:610:40 | out : Intent [android.content.Intent.extras, ] : long[] | provenance | | -| Test.java:609:4:609:6 | out [post update] : Intent [android.content.Intent.extras, ] : long[] | Test.java:610:38:610:40 | out : Intent [android.content.Intent.extras, ] : long[] | provenance | | -| Test.java:609:31:609:32 | in : long[] | Test.java:609:4:609:6 | out [post update] : Intent [android.content.Intent.extras, ] : long[] | provenance | MaD:49 | | Test.java:609:31:609:32 | in : long[] | Test.java:609:4:609:6 | out [post update] : Intent [android.content.Intent.extras, ] : long[] | provenance | MaD:49 | | Test.java:610:21:610:41 | getIntent_extras(...) : Bundle [] : long[] | Test.java:610:9:610:42 | getMapValue(...) | provenance | MaD:175 | | Test.java:610:38:610:40 | out : Intent [android.content.Intent.extras, ] : long[] | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : long[] | provenance | | -| Test.java:610:38:610:40 | out : Intent [android.content.Intent.extras, ] : long[] | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : long[] | provenance | | -| Test.java:610:38:610:40 | out : Intent [android.content.Intent.extras, ] : long[] | Test.java:610:21:610:41 | getIntent_extras(...) : Bundle [] : long[] | provenance | MaD:34 | | Test.java:610:38:610:40 | out : Intent [android.content.Intent.extras, ] : long[] | Test.java:610:21:610:41 | getIntent_extras(...) : Bundle [] : long[] | provenance | MaD:34 | | Test.java:615:14:615:27 | (...)... : Number | Test.java:616:31:616:32 | in : Number | provenance | | | Test.java:615:20:615:27 | source(...) : Object | Test.java:615:14:615:27 | (...)... : Number | provenance | | | Test.java:616:4:616:6 | out [post update] : Intent [android.content.Intent.extras, ] : Number | Test.java:617:38:617:40 | out : Intent [android.content.Intent.extras, ] : Number | provenance | | -| Test.java:616:4:616:6 | out [post update] : Intent [android.content.Intent.extras, ] : Number | Test.java:617:38:617:40 | out : Intent [android.content.Intent.extras, ] : Number | provenance | | -| Test.java:616:31:616:32 | in : Number | Test.java:616:4:616:6 | out [post update] : Intent [android.content.Intent.extras, ] : Number | provenance | MaD:49 | | Test.java:616:31:616:32 | in : Number | Test.java:616:4:616:6 | out [post update] : Intent [android.content.Intent.extras, ] : Number | provenance | MaD:49 | | Test.java:617:21:617:41 | getIntent_extras(...) : Bundle [] : Number | Test.java:617:9:617:42 | getMapValue(...) | provenance | MaD:175 | | Test.java:617:38:617:40 | out : Intent [android.content.Intent.extras, ] : Number | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : Number | provenance | | -| Test.java:617:38:617:40 | out : Intent [android.content.Intent.extras, ] : Number | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : Number | provenance | | -| Test.java:617:38:617:40 | out : Intent [android.content.Intent.extras, ] : Number | Test.java:617:21:617:41 | getIntent_extras(...) : Bundle [] : Number | provenance | MaD:34 | | Test.java:617:38:617:40 | out : Intent [android.content.Intent.extras, ] : Number | Test.java:617:21:617:41 | getIntent_extras(...) : Bundle [] : Number | provenance | MaD:34 | | Test.java:622:15:622:29 | (...)... : int[] | Test.java:623:31:623:32 | in : int[] | provenance | | | Test.java:622:22:622:29 | source(...) : Object | Test.java:622:15:622:29 | (...)... : int[] | provenance | | | Test.java:623:4:623:6 | out [post update] : Intent [android.content.Intent.extras, ] : int[] | Test.java:624:38:624:40 | out : Intent [android.content.Intent.extras, ] : int[] | provenance | | -| Test.java:623:4:623:6 | out [post update] : Intent [android.content.Intent.extras, ] : int[] | Test.java:624:38:624:40 | out : Intent [android.content.Intent.extras, ] : int[] | provenance | | -| Test.java:623:31:623:32 | in : int[] | Test.java:623:4:623:6 | out [post update] : Intent [android.content.Intent.extras, ] : int[] | provenance | MaD:49 | | Test.java:623:31:623:32 | in : int[] | Test.java:623:4:623:6 | out [post update] : Intent [android.content.Intent.extras, ] : int[] | provenance | MaD:49 | | Test.java:624:21:624:41 | getIntent_extras(...) : Bundle [] : int[] | Test.java:624:9:624:42 | getMapValue(...) | provenance | MaD:175 | | Test.java:624:38:624:40 | out : Intent [android.content.Intent.extras, ] : int[] | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : int[] | provenance | | -| Test.java:624:38:624:40 | out : Intent [android.content.Intent.extras, ] : int[] | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : int[] | provenance | | -| Test.java:624:38:624:40 | out : Intent [android.content.Intent.extras, ] : int[] | Test.java:624:21:624:41 | getIntent_extras(...) : Bundle [] : int[] | provenance | MaD:34 | | Test.java:624:38:624:40 | out : Intent [android.content.Intent.extras, ] : int[] | Test.java:624:21:624:41 | getIntent_extras(...) : Bundle [] : int[] | provenance | MaD:34 | | Test.java:629:13:629:25 | (...)... : Number | Test.java:630:31:630:32 | in : Number | provenance | | | Test.java:629:18:629:25 | source(...) : Object | Test.java:629:13:629:25 | (...)... : Number | provenance | | | Test.java:630:4:630:6 | out [post update] : Intent [android.content.Intent.extras, ] : Number | Test.java:631:38:631:40 | out : Intent [android.content.Intent.extras, ] : Number | provenance | | -| Test.java:630:4:630:6 | out [post update] : Intent [android.content.Intent.extras, ] : Number | Test.java:631:38:631:40 | out : Intent [android.content.Intent.extras, ] : Number | provenance | | -| Test.java:630:31:630:32 | in : Number | Test.java:630:4:630:6 | out [post update] : Intent [android.content.Intent.extras, ] : Number | provenance | MaD:49 | | Test.java:630:31:630:32 | in : Number | Test.java:630:4:630:6 | out [post update] : Intent [android.content.Intent.extras, ] : Number | provenance | MaD:49 | | Test.java:631:21:631:41 | getIntent_extras(...) : Bundle [] : Number | Test.java:631:9:631:42 | getMapValue(...) | provenance | MaD:175 | | Test.java:631:38:631:40 | out : Intent [android.content.Intent.extras, ] : Number | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : Number | provenance | | -| Test.java:631:38:631:40 | out : Intent [android.content.Intent.extras, ] : Number | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : Number | provenance | | -| Test.java:631:38:631:40 | out : Intent [android.content.Intent.extras, ] : Number | Test.java:631:21:631:41 | getIntent_extras(...) : Bundle [] : Number | provenance | MaD:34 | | Test.java:631:38:631:40 | out : Intent [android.content.Intent.extras, ] : Number | Test.java:631:21:631:41 | getIntent_extras(...) : Bundle [] : Number | provenance | MaD:34 | | Test.java:636:17:636:33 | (...)... : float[] | Test.java:637:31:637:32 | in : float[] | provenance | | | Test.java:636:26:636:33 | source(...) : Object | Test.java:636:17:636:33 | (...)... : float[] | provenance | | | Test.java:637:4:637:6 | out [post update] : Intent [android.content.Intent.extras, ] : float[] | Test.java:638:38:638:40 | out : Intent [android.content.Intent.extras, ] : float[] | provenance | | -| Test.java:637:4:637:6 | out [post update] : Intent [android.content.Intent.extras, ] : float[] | Test.java:638:38:638:40 | out : Intent [android.content.Intent.extras, ] : float[] | provenance | | -| Test.java:637:31:637:32 | in : float[] | Test.java:637:4:637:6 | out [post update] : Intent [android.content.Intent.extras, ] : float[] | provenance | MaD:49 | | Test.java:637:31:637:32 | in : float[] | Test.java:637:4:637:6 | out [post update] : Intent [android.content.Intent.extras, ] : float[] | provenance | MaD:49 | | Test.java:638:21:638:41 | getIntent_extras(...) : Bundle [] : float[] | Test.java:638:9:638:42 | getMapValue(...) | provenance | MaD:175 | | Test.java:638:38:638:40 | out : Intent [android.content.Intent.extras, ] : float[] | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : float[] | provenance | | -| Test.java:638:38:638:40 | out : Intent [android.content.Intent.extras, ] : float[] | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : float[] | provenance | | -| Test.java:638:38:638:40 | out : Intent [android.content.Intent.extras, ] : float[] | Test.java:638:21:638:41 | getIntent_extras(...) : Bundle [] : float[] | provenance | MaD:34 | | Test.java:638:38:638:40 | out : Intent [android.content.Intent.extras, ] : float[] | Test.java:638:21:638:41 | getIntent_extras(...) : Bundle [] : float[] | provenance | MaD:34 | | Test.java:643:15:643:29 | (...)... : Number | Test.java:644:31:644:32 | in : Number | provenance | | | Test.java:643:22:643:29 | source(...) : Object | Test.java:643:15:643:29 | (...)... : Number | provenance | | | Test.java:644:4:644:6 | out [post update] : Intent [android.content.Intent.extras, ] : Number | Test.java:645:38:645:40 | out : Intent [android.content.Intent.extras, ] : Number | provenance | | -| Test.java:644:4:644:6 | out [post update] : Intent [android.content.Intent.extras, ] : Number | Test.java:645:38:645:40 | out : Intent [android.content.Intent.extras, ] : Number | provenance | | -| Test.java:644:31:644:32 | in : Number | Test.java:644:4:644:6 | out [post update] : Intent [android.content.Intent.extras, ] : Number | provenance | MaD:49 | | Test.java:644:31:644:32 | in : Number | Test.java:644:4:644:6 | out [post update] : Intent [android.content.Intent.extras, ] : Number | provenance | MaD:49 | | Test.java:645:21:645:41 | getIntent_extras(...) : Bundle [] : Number | Test.java:645:9:645:42 | getMapValue(...) | provenance | MaD:175 | | Test.java:645:38:645:40 | out : Intent [android.content.Intent.extras, ] : Number | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : Number | provenance | | -| Test.java:645:38:645:40 | out : Intent [android.content.Intent.extras, ] : Number | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : Number | provenance | | -| Test.java:645:38:645:40 | out : Intent [android.content.Intent.extras, ] : Number | Test.java:645:21:645:41 | getIntent_extras(...) : Bundle [] : Number | provenance | MaD:34 | | Test.java:645:38:645:40 | out : Intent [android.content.Intent.extras, ] : Number | Test.java:645:21:645:41 | getIntent_extras(...) : Bundle [] : Number | provenance | MaD:34 | | Test.java:650:18:650:35 | (...)... : double[] | Test.java:651:31:651:32 | in : double[] | provenance | | | Test.java:650:28:650:35 | source(...) : Object | Test.java:650:18:650:35 | (...)... : double[] | provenance | | | Test.java:651:4:651:6 | out [post update] : Intent [android.content.Intent.extras, ] : double[] | Test.java:652:38:652:40 | out : Intent [android.content.Intent.extras, ] : double[] | provenance | | -| Test.java:651:4:651:6 | out [post update] : Intent [android.content.Intent.extras, ] : double[] | Test.java:652:38:652:40 | out : Intent [android.content.Intent.extras, ] : double[] | provenance | | -| Test.java:651:31:651:32 | in : double[] | Test.java:651:4:651:6 | out [post update] : Intent [android.content.Intent.extras, ] : double[] | provenance | MaD:49 | | Test.java:651:31:651:32 | in : double[] | Test.java:651:4:651:6 | out [post update] : Intent [android.content.Intent.extras, ] : double[] | provenance | MaD:49 | | Test.java:652:21:652:41 | getIntent_extras(...) : Bundle [] : double[] | Test.java:652:9:652:42 | getMapValue(...) | provenance | MaD:175 | | Test.java:652:38:652:40 | out : Intent [android.content.Intent.extras, ] : double[] | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : double[] | provenance | | -| Test.java:652:38:652:40 | out : Intent [android.content.Intent.extras, ] : double[] | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : double[] | provenance | | -| Test.java:652:38:652:40 | out : Intent [android.content.Intent.extras, ] : double[] | Test.java:652:21:652:41 | getIntent_extras(...) : Bundle [] : double[] | provenance | MaD:34 | | Test.java:652:38:652:40 | out : Intent [android.content.Intent.extras, ] : double[] | Test.java:652:21:652:41 | getIntent_extras(...) : Bundle [] : double[] | provenance | MaD:34 | | Test.java:657:16:657:31 | (...)... : Number | Test.java:658:31:658:32 | in : Number | provenance | | | Test.java:657:24:657:31 | source(...) : Object | Test.java:657:16:657:31 | (...)... : Number | provenance | | | Test.java:658:4:658:6 | out [post update] : Intent [android.content.Intent.extras, ] : Number | Test.java:659:38:659:40 | out : Intent [android.content.Intent.extras, ] : Number | provenance | | -| Test.java:658:4:658:6 | out [post update] : Intent [android.content.Intent.extras, ] : Number | Test.java:659:38:659:40 | out : Intent [android.content.Intent.extras, ] : Number | provenance | | -| Test.java:658:31:658:32 | in : Number | Test.java:658:4:658:6 | out [post update] : Intent [android.content.Intent.extras, ] : Number | provenance | MaD:49 | | Test.java:658:31:658:32 | in : Number | Test.java:658:4:658:6 | out [post update] : Intent [android.content.Intent.extras, ] : Number | provenance | MaD:49 | | Test.java:659:21:659:41 | getIntent_extras(...) : Bundle [] : Number | Test.java:659:9:659:42 | getMapValue(...) | provenance | MaD:175 | | Test.java:659:38:659:40 | out : Intent [android.content.Intent.extras, ] : Number | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : Number | provenance | | -| Test.java:659:38:659:40 | out : Intent [android.content.Intent.extras, ] : Number | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : Number | provenance | | -| Test.java:659:38:659:40 | out : Intent [android.content.Intent.extras, ] : Number | Test.java:659:21:659:41 | getIntent_extras(...) : Bundle [] : Number | provenance | MaD:34 | | Test.java:659:38:659:40 | out : Intent [android.content.Intent.extras, ] : Number | Test.java:659:21:659:41 | getIntent_extras(...) : Bundle [] : Number | provenance | MaD:34 | | Test.java:664:16:664:31 | (...)... : char[] | Test.java:665:31:665:32 | in : char[] | provenance | | | Test.java:664:24:664:31 | source(...) : Object | Test.java:664:16:664:31 | (...)... : char[] | provenance | | | Test.java:665:4:665:6 | out [post update] : Intent [android.content.Intent.extras, ] : char[] | Test.java:666:38:666:40 | out : Intent [android.content.Intent.extras, ] : char[] | provenance | | -| Test.java:665:4:665:6 | out [post update] : Intent [android.content.Intent.extras, ] : char[] | Test.java:666:38:666:40 | out : Intent [android.content.Intent.extras, ] : char[] | provenance | | -| Test.java:665:31:665:32 | in : char[] | Test.java:665:4:665:6 | out [post update] : Intent [android.content.Intent.extras, ] : char[] | provenance | MaD:49 | | Test.java:665:31:665:32 | in : char[] | Test.java:665:4:665:6 | out [post update] : Intent [android.content.Intent.extras, ] : char[] | provenance | MaD:49 | | Test.java:666:21:666:41 | getIntent_extras(...) : Bundle [] : char[] | Test.java:666:9:666:42 | getMapValue(...) | provenance | MaD:175 | | Test.java:666:38:666:40 | out : Intent [android.content.Intent.extras, ] : char[] | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : char[] | provenance | | -| Test.java:666:38:666:40 | out : Intent [android.content.Intent.extras, ] : char[] | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : char[] | provenance | | -| Test.java:666:38:666:40 | out : Intent [android.content.Intent.extras, ] : char[] | Test.java:666:21:666:41 | getIntent_extras(...) : Bundle [] : char[] | provenance | MaD:34 | | Test.java:666:38:666:40 | out : Intent [android.content.Intent.extras, ] : char[] | Test.java:666:21:666:41 | getIntent_extras(...) : Bundle [] : char[] | provenance | MaD:34 | | Test.java:671:14:671:27 | (...)... : Number | Test.java:672:31:672:32 | in : Number | provenance | | | Test.java:671:20:671:27 | source(...) : Object | Test.java:671:14:671:27 | (...)... : Number | provenance | | | Test.java:672:4:672:6 | out [post update] : Intent [android.content.Intent.extras, ] : Number | Test.java:673:38:673:40 | out : Intent [android.content.Intent.extras, ] : Number | provenance | | -| Test.java:672:4:672:6 | out [post update] : Intent [android.content.Intent.extras, ] : Number | Test.java:673:38:673:40 | out : Intent [android.content.Intent.extras, ] : Number | provenance | | -| Test.java:672:31:672:32 | in : Number | Test.java:672:4:672:6 | out [post update] : Intent [android.content.Intent.extras, ] : Number | provenance | MaD:49 | | Test.java:672:31:672:32 | in : Number | Test.java:672:4:672:6 | out [post update] : Intent [android.content.Intent.extras, ] : Number | provenance | MaD:49 | | Test.java:673:21:673:41 | getIntent_extras(...) : Bundle [] : Number | Test.java:673:9:673:42 | getMapValue(...) | provenance | MaD:175 | | Test.java:673:38:673:40 | out : Intent [android.content.Intent.extras, ] : Number | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : Number | provenance | | -| Test.java:673:38:673:40 | out : Intent [android.content.Intent.extras, ] : Number | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : Number | provenance | | -| Test.java:673:38:673:40 | out : Intent [android.content.Intent.extras, ] : Number | Test.java:673:21:673:41 | getIntent_extras(...) : Bundle [] : Number | provenance | MaD:34 | | Test.java:673:38:673:40 | out : Intent [android.content.Intent.extras, ] : Number | Test.java:673:21:673:41 | getIntent_extras(...) : Bundle [] : Number | provenance | MaD:34 | | Test.java:678:16:678:31 | (...)... : byte[] | Test.java:679:31:679:32 | in : byte[] | provenance | | | Test.java:678:24:678:31 | source(...) : Object | Test.java:678:16:678:31 | (...)... : byte[] | provenance | | | Test.java:679:4:679:6 | out [post update] : Intent [android.content.Intent.extras, ] : byte[] | Test.java:680:38:680:40 | out : Intent [android.content.Intent.extras, ] : byte[] | provenance | | -| Test.java:679:4:679:6 | out [post update] : Intent [android.content.Intent.extras, ] : byte[] | Test.java:680:38:680:40 | out : Intent [android.content.Intent.extras, ] : byte[] | provenance | | -| Test.java:679:31:679:32 | in : byte[] | Test.java:679:4:679:6 | out [post update] : Intent [android.content.Intent.extras, ] : byte[] | provenance | MaD:49 | | Test.java:679:31:679:32 | in : byte[] | Test.java:679:4:679:6 | out [post update] : Intent [android.content.Intent.extras, ] : byte[] | provenance | MaD:49 | | Test.java:680:21:680:41 | getIntent_extras(...) : Bundle [] : byte[] | Test.java:680:9:680:42 | getMapValue(...) | provenance | MaD:175 | | Test.java:680:38:680:40 | out : Intent [android.content.Intent.extras, ] : byte[] | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : byte[] | provenance | | -| Test.java:680:38:680:40 | out : Intent [android.content.Intent.extras, ] : byte[] | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : byte[] | provenance | | -| Test.java:680:38:680:40 | out : Intent [android.content.Intent.extras, ] : byte[] | Test.java:680:21:680:41 | getIntent_extras(...) : Bundle [] : byte[] | provenance | MaD:34 | | Test.java:680:38:680:40 | out : Intent [android.content.Intent.extras, ] : byte[] | Test.java:680:21:680:41 | getIntent_extras(...) : Bundle [] : byte[] | provenance | MaD:34 | | Test.java:685:14:685:27 | (...)... : Number | Test.java:686:31:686:32 | in : Number | provenance | | | Test.java:685:20:685:27 | source(...) : Object | Test.java:685:14:685:27 | (...)... : Number | provenance | | | Test.java:686:4:686:6 | out [post update] : Intent [android.content.Intent.extras, ] : Number | Test.java:687:38:687:40 | out : Intent [android.content.Intent.extras, ] : Number | provenance | | -| Test.java:686:4:686:6 | out [post update] : Intent [android.content.Intent.extras, ] : Number | Test.java:687:38:687:40 | out : Intent [android.content.Intent.extras, ] : Number | provenance | | -| Test.java:686:31:686:32 | in : Number | Test.java:686:4:686:6 | out [post update] : Intent [android.content.Intent.extras, ] : Number | provenance | MaD:49 | | Test.java:686:31:686:32 | in : Number | Test.java:686:4:686:6 | out [post update] : Intent [android.content.Intent.extras, ] : Number | provenance | MaD:49 | | Test.java:687:21:687:41 | getIntent_extras(...) : Bundle [] : Number | Test.java:687:9:687:42 | getMapValue(...) | provenance | MaD:175 | | Test.java:687:38:687:40 | out : Intent [android.content.Intent.extras, ] : Number | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : Number | provenance | | -| Test.java:687:38:687:40 | out : Intent [android.content.Intent.extras, ] : Number | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : Number | provenance | | -| Test.java:687:38:687:40 | out : Intent [android.content.Intent.extras, ] : Number | Test.java:687:21:687:41 | getIntent_extras(...) : Bundle [] : Number | provenance | MaD:34 | | Test.java:687:38:687:40 | out : Intent [android.content.Intent.extras, ] : Number | Test.java:687:21:687:41 | getIntent_extras(...) : Bundle [] : Number | provenance | MaD:34 | | Test.java:692:19:692:37 | (...)... : boolean[] | Test.java:693:31:693:32 | in : boolean[] | provenance | | | Test.java:692:30:692:37 | source(...) : Object | Test.java:692:19:692:37 | (...)... : boolean[] | provenance | | | Test.java:693:4:693:6 | out [post update] : Intent [android.content.Intent.extras, ] : boolean[] | Test.java:694:38:694:40 | out : Intent [android.content.Intent.extras, ] : boolean[] | provenance | | -| Test.java:693:4:693:6 | out [post update] : Intent [android.content.Intent.extras, ] : boolean[] | Test.java:694:38:694:40 | out : Intent [android.content.Intent.extras, ] : boolean[] | provenance | | -| Test.java:693:31:693:32 | in : boolean[] | Test.java:693:4:693:6 | out [post update] : Intent [android.content.Intent.extras, ] : boolean[] | provenance | MaD:49 | | Test.java:693:31:693:32 | in : boolean[] | Test.java:693:4:693:6 | out [post update] : Intent [android.content.Intent.extras, ] : boolean[] | provenance | MaD:49 | | Test.java:694:21:694:41 | getIntent_extras(...) : Bundle [] : boolean[] | Test.java:694:9:694:42 | getMapValue(...) | provenance | MaD:175 | | Test.java:694:38:694:40 | out : Intent [android.content.Intent.extras, ] : boolean[] | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : boolean[] | provenance | | -| Test.java:694:38:694:40 | out : Intent [android.content.Intent.extras, ] : boolean[] | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : boolean[] | provenance | | -| Test.java:694:38:694:40 | out : Intent [android.content.Intent.extras, ] : boolean[] | Test.java:694:21:694:41 | getIntent_extras(...) : Bundle [] : boolean[] | provenance | MaD:34 | | Test.java:694:38:694:40 | out : Intent [android.content.Intent.extras, ] : boolean[] | Test.java:694:21:694:41 | getIntent_extras(...) : Bundle [] : boolean[] | provenance | MaD:34 | | Test.java:699:17:699:33 | (...)... : Boolean | Test.java:700:31:700:32 | in : Boolean | provenance | | | Test.java:699:26:699:33 | source(...) : Object | Test.java:699:17:699:33 | (...)... : Boolean | provenance | | | Test.java:700:4:700:6 | out [post update] : Intent [android.content.Intent.extras, ] : Boolean | Test.java:701:38:701:40 | out : Intent [android.content.Intent.extras, ] : Boolean | provenance | | -| Test.java:700:4:700:6 | out [post update] : Intent [android.content.Intent.extras, ] : Boolean | Test.java:701:38:701:40 | out : Intent [android.content.Intent.extras, ] : Boolean | provenance | | -| Test.java:700:31:700:32 | in : Boolean | Test.java:700:4:700:6 | out [post update] : Intent [android.content.Intent.extras, ] : Boolean | provenance | MaD:49 | | Test.java:700:31:700:32 | in : Boolean | Test.java:700:4:700:6 | out [post update] : Intent [android.content.Intent.extras, ] : Boolean | provenance | MaD:49 | | Test.java:701:21:701:41 | getIntent_extras(...) : Bundle [] : Boolean | Test.java:701:9:701:42 | getMapValue(...) | provenance | MaD:175 | | Test.java:701:38:701:40 | out : Intent [android.content.Intent.extras, ] : Boolean | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : Boolean | provenance | | -| Test.java:701:38:701:40 | out : Intent [android.content.Intent.extras, ] : Boolean | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : Boolean | provenance | | -| Test.java:701:38:701:40 | out : Intent [android.content.Intent.extras, ] : Boolean | Test.java:701:21:701:41 | getIntent_extras(...) : Bundle [] : Boolean | provenance | MaD:34 | | Test.java:701:38:701:40 | out : Intent [android.content.Intent.extras, ] : Boolean | Test.java:701:21:701:41 | getIntent_extras(...) : Bundle [] : Boolean | provenance | MaD:34 | | Test.java:706:18:706:35 | (...)... : String[] | Test.java:707:31:707:32 | in : String[] | provenance | | | Test.java:706:28:706:35 | source(...) : Object | Test.java:706:18:706:35 | (...)... : String[] | provenance | | | Test.java:707:4:707:6 | out [post update] : Intent [android.content.Intent.extras, ] : String[] | Test.java:708:38:708:40 | out : Intent [android.content.Intent.extras, ] : String[] | provenance | | -| Test.java:707:4:707:6 | out [post update] : Intent [android.content.Intent.extras, ] : String[] | Test.java:708:38:708:40 | out : Intent [android.content.Intent.extras, ] : String[] | provenance | | -| Test.java:707:31:707:32 | in : String[] | Test.java:707:4:707:6 | out [post update] : Intent [android.content.Intent.extras, ] : String[] | provenance | MaD:49 | | Test.java:707:31:707:32 | in : String[] | Test.java:707:4:707:6 | out [post update] : Intent [android.content.Intent.extras, ] : String[] | provenance | MaD:49 | | Test.java:708:21:708:41 | getIntent_extras(...) : Bundle [] : String[] | Test.java:708:9:708:42 | getMapValue(...) | provenance | MaD:175 | | Test.java:708:38:708:40 | out : Intent [android.content.Intent.extras, ] : String[] | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : String[] | provenance | | -| Test.java:708:38:708:40 | out : Intent [android.content.Intent.extras, ] : String[] | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : String[] | provenance | | -| Test.java:708:38:708:40 | out : Intent [android.content.Intent.extras, ] : String[] | Test.java:708:21:708:41 | getIntent_extras(...) : Bundle [] : String[] | provenance | MaD:34 | | Test.java:708:38:708:40 | out : Intent [android.content.Intent.extras, ] : String[] | Test.java:708:21:708:41 | getIntent_extras(...) : Bundle [] : String[] | provenance | MaD:34 | | Test.java:713:16:713:31 | (...)... : String | Test.java:714:31:714:32 | in : String | provenance | | | Test.java:713:24:713:31 | source(...) : Object | Test.java:713:16:713:31 | (...)... : String | provenance | | | Test.java:714:4:714:6 | out [post update] : Intent [android.content.Intent.extras, ] : String | Test.java:715:38:715:40 | out : Intent [android.content.Intent.extras, ] : String | provenance | | -| Test.java:714:4:714:6 | out [post update] : Intent [android.content.Intent.extras, ] : String | Test.java:715:38:715:40 | out : Intent [android.content.Intent.extras, ] : String | provenance | | -| Test.java:714:31:714:32 | in : String | Test.java:714:4:714:6 | out [post update] : Intent [android.content.Intent.extras, ] : String | provenance | MaD:49 | | Test.java:714:31:714:32 | in : String | Test.java:714:4:714:6 | out [post update] : Intent [android.content.Intent.extras, ] : String | provenance | MaD:49 | | Test.java:715:21:715:41 | getIntent_extras(...) : Bundle [] : String | Test.java:715:9:715:42 | getMapValue(...) | provenance | MaD:175 | | Test.java:715:38:715:40 | out : Intent [android.content.Intent.extras, ] : String | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : String | provenance | | -| Test.java:715:38:715:40 | out : Intent [android.content.Intent.extras, ] : String | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : String | provenance | | -| Test.java:715:38:715:40 | out : Intent [android.content.Intent.extras, ] : String | Test.java:715:21:715:41 | getIntent_extras(...) : Bundle [] : String | provenance | MaD:34 | | Test.java:715:38:715:40 | out : Intent [android.content.Intent.extras, ] : String | Test.java:715:21:715:41 | getIntent_extras(...) : Bundle [] : String | provenance | MaD:34 | | Test.java:720:22:720:43 | (...)... : Serializable | Test.java:721:31:721:32 | in : Serializable | provenance | | | Test.java:720:36:720:43 | source(...) : Object | Test.java:720:22:720:43 | (...)... : Serializable | provenance | | | Test.java:721:4:721:6 | out [post update] : Intent [android.content.Intent.extras, ] : Serializable | Test.java:722:38:722:40 | out : Intent [android.content.Intent.extras, ] : Serializable | provenance | | -| Test.java:721:4:721:6 | out [post update] : Intent [android.content.Intent.extras, ] : Serializable | Test.java:722:38:722:40 | out : Intent [android.content.Intent.extras, ] : Serializable | provenance | | -| Test.java:721:31:721:32 | in : Serializable | Test.java:721:4:721:6 | out [post update] : Intent [android.content.Intent.extras, ] : Serializable | provenance | MaD:49 | | Test.java:721:31:721:32 | in : Serializable | Test.java:721:4:721:6 | out [post update] : Intent [android.content.Intent.extras, ] : Serializable | provenance | MaD:49 | | Test.java:722:21:722:41 | getIntent_extras(...) : Bundle [] : Serializable | Test.java:722:9:722:42 | getMapValue(...) | provenance | MaD:175 | | Test.java:722:38:722:40 | out : Intent [android.content.Intent.extras, ] : Serializable | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : Serializable | provenance | | -| Test.java:722:38:722:40 | out : Intent [android.content.Intent.extras, ] : Serializable | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : Serializable | provenance | | -| Test.java:722:38:722:40 | out : Intent [android.content.Intent.extras, ] : Serializable | Test.java:722:21:722:41 | getIntent_extras(...) : Bundle [] : Serializable | provenance | MaD:34 | | Test.java:722:38:722:40 | out : Intent [android.content.Intent.extras, ] : Serializable | Test.java:722:21:722:41 | getIntent_extras(...) : Bundle [] : Serializable | provenance | MaD:34 | | Test.java:727:22:727:43 | (...)... : Parcelable[] | Test.java:728:31:728:32 | in : Parcelable[] | provenance | | | Test.java:727:36:727:43 | source(...) : Object | Test.java:727:22:727:43 | (...)... : Parcelable[] | provenance | | | Test.java:728:4:728:6 | out [post update] : Intent [android.content.Intent.extras, ] : Parcelable[] | Test.java:729:38:729:40 | out : Intent [android.content.Intent.extras, ] : Parcelable[] | provenance | | -| Test.java:728:4:728:6 | out [post update] : Intent [android.content.Intent.extras, ] : Parcelable[] | Test.java:729:38:729:40 | out : Intent [android.content.Intent.extras, ] : Parcelable[] | provenance | | -| Test.java:728:31:728:32 | in : Parcelable[] | Test.java:728:4:728:6 | out [post update] : Intent [android.content.Intent.extras, ] : Parcelable[] | provenance | MaD:49 | | Test.java:728:31:728:32 | in : Parcelable[] | Test.java:728:4:728:6 | out [post update] : Intent [android.content.Intent.extras, ] : Parcelable[] | provenance | MaD:49 | | Test.java:729:21:729:41 | getIntent_extras(...) : Bundle [] : Parcelable[] | Test.java:729:9:729:42 | getMapValue(...) | provenance | MaD:175 | | Test.java:729:38:729:40 | out : Intent [android.content.Intent.extras, ] : Parcelable[] | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : Parcelable[] | provenance | | -| Test.java:729:38:729:40 | out : Intent [android.content.Intent.extras, ] : Parcelable[] | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : Parcelable[] | provenance | | -| Test.java:729:38:729:40 | out : Intent [android.content.Intent.extras, ] : Parcelable[] | Test.java:729:21:729:41 | getIntent_extras(...) : Bundle [] : Parcelable[] | provenance | MaD:34 | | Test.java:729:38:729:40 | out : Intent [android.content.Intent.extras, ] : Parcelable[] | Test.java:729:21:729:41 | getIntent_extras(...) : Bundle [] : Parcelable[] | provenance | MaD:34 | | Test.java:734:20:734:39 | (...)... : Parcelable | Test.java:735:31:735:32 | in : Parcelable | provenance | | | Test.java:734:32:734:39 | source(...) : Object | Test.java:734:20:734:39 | (...)... : Parcelable | provenance | | | Test.java:735:4:735:6 | out [post update] : Intent [android.content.Intent.extras, ] : Parcelable | Test.java:736:38:736:40 | out : Intent [android.content.Intent.extras, ] : Parcelable | provenance | | -| Test.java:735:4:735:6 | out [post update] : Intent [android.content.Intent.extras, ] : Parcelable | Test.java:736:38:736:40 | out : Intent [android.content.Intent.extras, ] : Parcelable | provenance | | -| Test.java:735:31:735:32 | in : Parcelable | Test.java:735:4:735:6 | out [post update] : Intent [android.content.Intent.extras, ] : Parcelable | provenance | MaD:49 | | Test.java:735:31:735:32 | in : Parcelable | Test.java:735:4:735:6 | out [post update] : Intent [android.content.Intent.extras, ] : Parcelable | provenance | MaD:49 | | Test.java:736:21:736:41 | getIntent_extras(...) : Bundle [] : Parcelable | Test.java:736:9:736:42 | getMapValue(...) | provenance | MaD:175 | | Test.java:736:38:736:40 | out : Intent [android.content.Intent.extras, ] : Parcelable | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : Parcelable | provenance | | -| Test.java:736:38:736:40 | out : Intent [android.content.Intent.extras, ] : Parcelable | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : Parcelable | provenance | | -| Test.java:736:38:736:40 | out : Intent [android.content.Intent.extras, ] : Parcelable | Test.java:736:21:736:41 | getIntent_extras(...) : Bundle [] : Parcelable | provenance | MaD:34 | | Test.java:736:38:736:40 | out : Intent [android.content.Intent.extras, ] : Parcelable | Test.java:736:21:736:41 | getIntent_extras(...) : Bundle [] : Parcelable | provenance | MaD:34 | | Test.java:741:24:741:47 | (...)... : CharSequence[] | Test.java:742:31:742:32 | in : CharSequence[] | provenance | | | Test.java:741:40:741:47 | source(...) : Object | Test.java:741:24:741:47 | (...)... : CharSequence[] | provenance | | | Test.java:742:4:742:6 | out [post update] : Intent [android.content.Intent.extras, ] : CharSequence[] | Test.java:743:38:743:40 | out : Intent [android.content.Intent.extras, ] : CharSequence[] | provenance | | -| Test.java:742:4:742:6 | out [post update] : Intent [android.content.Intent.extras, ] : CharSequence[] | Test.java:743:38:743:40 | out : Intent [android.content.Intent.extras, ] : CharSequence[] | provenance | | -| Test.java:742:31:742:32 | in : CharSequence[] | Test.java:742:4:742:6 | out [post update] : Intent [android.content.Intent.extras, ] : CharSequence[] | provenance | MaD:49 | | Test.java:742:31:742:32 | in : CharSequence[] | Test.java:742:4:742:6 | out [post update] : Intent [android.content.Intent.extras, ] : CharSequence[] | provenance | MaD:49 | | Test.java:743:21:743:41 | getIntent_extras(...) : Bundle [] : CharSequence[] | Test.java:743:9:743:42 | getMapValue(...) | provenance | MaD:175 | | Test.java:743:38:743:40 | out : Intent [android.content.Intent.extras, ] : CharSequence[] | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : CharSequence[] | provenance | | -| Test.java:743:38:743:40 | out : Intent [android.content.Intent.extras, ] : CharSequence[] | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : CharSequence[] | provenance | | -| Test.java:743:38:743:40 | out : Intent [android.content.Intent.extras, ] : CharSequence[] | Test.java:743:21:743:41 | getIntent_extras(...) : Bundle [] : CharSequence[] | provenance | MaD:34 | | Test.java:743:38:743:40 | out : Intent [android.content.Intent.extras, ] : CharSequence[] | Test.java:743:21:743:41 | getIntent_extras(...) : Bundle [] : CharSequence[] | provenance | MaD:34 | | Test.java:748:22:748:43 | (...)... : CharSequence | Test.java:749:31:749:32 | in : CharSequence | provenance | | | Test.java:748:36:748:43 | source(...) : Object | Test.java:748:22:748:43 | (...)... : CharSequence | provenance | | | Test.java:749:4:749:6 | out [post update] : Intent [android.content.Intent.extras, ] : CharSequence | Test.java:750:38:750:40 | out : Intent [android.content.Intent.extras, ] : CharSequence | provenance | | -| Test.java:749:4:749:6 | out [post update] : Intent [android.content.Intent.extras, ] : CharSequence | Test.java:750:38:750:40 | out : Intent [android.content.Intent.extras, ] : CharSequence | provenance | | -| Test.java:749:31:749:32 | in : CharSequence | Test.java:749:4:749:6 | out [post update] : Intent [android.content.Intent.extras, ] : CharSequence | provenance | MaD:49 | | Test.java:749:31:749:32 | in : CharSequence | Test.java:749:4:749:6 | out [post update] : Intent [android.content.Intent.extras, ] : CharSequence | provenance | MaD:49 | | Test.java:750:21:750:41 | getIntent_extras(...) : Bundle [] : CharSequence | Test.java:750:9:750:42 | getMapValue(...) | provenance | MaD:175 | | Test.java:750:38:750:40 | out : Intent [android.content.Intent.extras, ] : CharSequence | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : CharSequence | provenance | | -| Test.java:750:38:750:40 | out : Intent [android.content.Intent.extras, ] : CharSequence | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : CharSequence | provenance | | -| Test.java:750:38:750:40 | out : Intent [android.content.Intent.extras, ] : CharSequence | Test.java:750:21:750:41 | getIntent_extras(...) : Bundle [] : CharSequence | provenance | MaD:34 | | Test.java:750:38:750:40 | out : Intent [android.content.Intent.extras, ] : CharSequence | Test.java:750:21:750:41 | getIntent_extras(...) : Bundle [] : CharSequence | provenance | MaD:34 | | Test.java:755:16:755:31 | (...)... : Bundle | Test.java:756:31:756:32 | in : Bundle | provenance | | | Test.java:755:24:755:31 | source(...) : Object | Test.java:755:16:755:31 | (...)... : Bundle | provenance | | | Test.java:756:4:756:6 | out [post update] : Intent [android.content.Intent.extras, ] : Bundle | Test.java:757:38:757:40 | out : Intent [android.content.Intent.extras, ] : Bundle | provenance | | -| Test.java:756:4:756:6 | out [post update] : Intent [android.content.Intent.extras, ] : Bundle | Test.java:757:38:757:40 | out : Intent [android.content.Intent.extras, ] : Bundle | provenance | | -| Test.java:756:31:756:32 | in : Bundle | Test.java:756:4:756:6 | out [post update] : Intent [android.content.Intent.extras, ] : Bundle | provenance | MaD:49 | | Test.java:756:31:756:32 | in : Bundle | Test.java:756:4:756:6 | out [post update] : Intent [android.content.Intent.extras, ] : Bundle | provenance | MaD:49 | | Test.java:757:21:757:41 | getIntent_extras(...) : Bundle [] : Bundle | Test.java:757:9:757:42 | getMapValue(...) | provenance | MaD:175 | | Test.java:757:38:757:40 | out : Intent [android.content.Intent.extras, ] : Bundle | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : Bundle | provenance | | -| Test.java:757:38:757:40 | out : Intent [android.content.Intent.extras, ] : Bundle | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : Bundle | provenance | | -| Test.java:757:38:757:40 | out : Intent [android.content.Intent.extras, ] : Bundle | Test.java:757:21:757:41 | getIntent_extras(...) : Bundle [] : Bundle | provenance | MaD:34 | | Test.java:757:38:757:40 | out : Intent [android.content.Intent.extras, ] : Bundle | Test.java:757:21:757:41 | getIntent_extras(...) : Bundle [] : Bundle | provenance | MaD:34 | | Test.java:762:16:762:31 | (...)... : Intent | Test.java:763:10:763:11 | in : Intent | provenance | | | Test.java:762:24:762:31 | source(...) : Object | Test.java:762:16:762:31 | (...)... : Intent | provenance | | @@ -1181,26 +915,18 @@ edges | Test.java:769:44:769:51 | source(...) : String | Test.java:28:29:28:36 | k : String | provenance | | | Test.java:769:44:769:51 | source(...) : String | Test.java:769:24:769:52 | newBundleWithMapKey(...) : Bundle [] : String | provenance | MaD:105 | | Test.java:770:4:770:6 | out [post update] : Intent [android.content.Intent.extras, ] : String | Test.java:771:36:771:38 | out : Intent [android.content.Intent.extras, ] : String | provenance | | -| Test.java:770:4:770:6 | out [post update] : Intent [android.content.Intent.extras, ] : String | Test.java:771:36:771:38 | out : Intent [android.content.Intent.extras, ] : String | provenance | | -| Test.java:770:18:770:19 | in : Bundle [] : String | Test.java:770:4:770:6 | out [post update] : Intent [android.content.Intent.extras, ] : String | provenance | MaD:51 | | Test.java:770:18:770:19 | in : Bundle [] : String | Test.java:770:4:770:6 | out [post update] : Intent [android.content.Intent.extras, ] : String | provenance | MaD:51 | | Test.java:771:19:771:39 | getIntent_extras(...) : Bundle [] : String | Test.java:24:19:24:30 | b : Bundle [] : String | provenance | | | Test.java:771:19:771:39 | getIntent_extras(...) : Bundle [] : String | Test.java:771:9:771:40 | getMapKey(...) | provenance | MaD:98 | | Test.java:771:36:771:38 | out : Intent [android.content.Intent.extras, ] : String | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : String | provenance | | -| Test.java:771:36:771:38 | out : Intent [android.content.Intent.extras, ] : String | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : String | provenance | | -| Test.java:771:36:771:38 | out : Intent [android.content.Intent.extras, ] : String | Test.java:771:19:771:39 | getIntent_extras(...) : Bundle [] : String | provenance | MaD:34 | | Test.java:771:36:771:38 | out : Intent [android.content.Intent.extras, ] : String | Test.java:771:19:771:39 | getIntent_extras(...) : Bundle [] : String | provenance | MaD:34 | | Test.java:776:16:776:54 | (...)... : Bundle [] : Object | Test.java:777:18:777:19 | in : Bundle [] : Object | provenance | | | Test.java:776:24:776:54 | newBundleWithMapValue(...) : Bundle [] : Object | Test.java:776:16:776:54 | (...)... : Bundle [] : Object | provenance | | | Test.java:776:46:776:53 | source(...) : Object | Test.java:776:24:776:54 | newBundleWithMapValue(...) : Bundle [] : Object | provenance | MaD:176 | | Test.java:777:4:777:6 | out [post update] : Intent [android.content.Intent.extras, ] : Object | Test.java:778:38:778:40 | out : Intent [android.content.Intent.extras, ] : Object | provenance | | -| Test.java:777:4:777:6 | out [post update] : Intent [android.content.Intent.extras, ] : Object | Test.java:778:38:778:40 | out : Intent [android.content.Intent.extras, ] : Object | provenance | | -| Test.java:777:18:777:19 | in : Bundle [] : Object | Test.java:777:4:777:6 | out [post update] : Intent [android.content.Intent.extras, ] : Object | provenance | MaD:52 | | Test.java:777:18:777:19 | in : Bundle [] : Object | Test.java:777:4:777:6 | out [post update] : Intent [android.content.Intent.extras, ] : Object | provenance | MaD:52 | | Test.java:778:21:778:41 | getIntent_extras(...) : Bundle [] : Object | Test.java:778:9:778:42 | getMapValue(...) | provenance | MaD:175 | | Test.java:778:38:778:40 | out : Intent [android.content.Intent.extras, ] : Object | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : Object | provenance | | -| Test.java:778:38:778:40 | out : Intent [android.content.Intent.extras, ] : Object | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : Object | provenance | | -| Test.java:778:38:778:40 | out : Intent [android.content.Intent.extras, ] : Object | Test.java:778:21:778:41 | getIntent_extras(...) : Bundle [] : Object | provenance | MaD:34 | | Test.java:778:38:778:40 | out : Intent [android.content.Intent.extras, ] : Object | Test.java:778:21:778:41 | getIntent_extras(...) : Bundle [] : Object | provenance | MaD:34 | | Test.java:783:16:783:31 | (...)... : Intent | Test.java:784:10:784:11 | in : Intent | provenance | | | Test.java:783:24:783:31 | source(...) : Object | Test.java:783:16:783:31 | (...)... : Intent | provenance | | @@ -1212,27 +938,19 @@ edges | Test.java:790:65:790:72 | source(...) : String | Test.java:28:29:28:36 | k : String | provenance | | | Test.java:790:65:790:72 | source(...) : String | Test.java:790:45:790:73 | newBundleWithMapKey(...) : Bundle [] : String | provenance | MaD:105 | | Test.java:791:4:791:6 | out [post update] : Intent [android.content.Intent.extras, ] : String | Test.java:792:36:792:38 | out : Intent [android.content.Intent.extras, ] : String | provenance | | -| Test.java:791:4:791:6 | out [post update] : Intent [android.content.Intent.extras, ] : String | Test.java:792:36:792:38 | out : Intent [android.content.Intent.extras, ] : String | provenance | | -| Test.java:791:18:791:19 | in : Intent [android.content.Intent.extras, ] : String | Test.java:791:4:791:6 | out [post update] : Intent [android.content.Intent.extras, ] : String | provenance | MaD:54 | | Test.java:791:18:791:19 | in : Intent [android.content.Intent.extras, ] : String | Test.java:791:4:791:6 | out [post update] : Intent [android.content.Intent.extras, ] : String | provenance | MaD:54 | | Test.java:792:19:792:39 | getIntent_extras(...) : Bundle [] : String | Test.java:24:19:24:30 | b : Bundle [] : String | provenance | | | Test.java:792:19:792:39 | getIntent_extras(...) : Bundle [] : String | Test.java:792:9:792:40 | getMapKey(...) | provenance | MaD:98 | | Test.java:792:36:792:38 | out : Intent [android.content.Intent.extras, ] : String | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : String | provenance | | -| Test.java:792:36:792:38 | out : Intent [android.content.Intent.extras, ] : String | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : String | provenance | | -| Test.java:792:36:792:38 | out : Intent [android.content.Intent.extras, ] : String | Test.java:792:19:792:39 | getIntent_extras(...) : Bundle [] : String | provenance | MaD:34 | | Test.java:792:36:792:38 | out : Intent [android.content.Intent.extras, ] : String | Test.java:792:19:792:39 | getIntent_extras(...) : Bundle [] : String | provenance | MaD:34 | | Test.java:797:16:797:76 | (...)... : Intent [android.content.Intent.extras, ] : Object | Test.java:798:18:798:19 | in : Intent [android.content.Intent.extras, ] : Object | provenance | | | Test.java:797:24:797:76 | newWithIntent_extras(...) : Intent [android.content.Intent.extras, ] : Object | Test.java:797:16:797:76 | (...)... : Intent [android.content.Intent.extras, ] : Object | provenance | | | Test.java:797:45:797:75 | newBundleWithMapValue(...) : Bundle [] : Object | Test.java:797:24:797:76 | newWithIntent_extras(...) : Intent [android.content.Intent.extras, ] : Object | provenance | MaD:178 | | Test.java:797:67:797:74 | source(...) : Object | Test.java:797:45:797:75 | newBundleWithMapValue(...) : Bundle [] : Object | provenance | MaD:176 | | Test.java:798:4:798:6 | out [post update] : Intent [android.content.Intent.extras, ] : Object | Test.java:799:38:799:40 | out : Intent [android.content.Intent.extras, ] : Object | provenance | | -| Test.java:798:4:798:6 | out [post update] : Intent [android.content.Intent.extras, ] : Object | Test.java:799:38:799:40 | out : Intent [android.content.Intent.extras, ] : Object | provenance | | -| Test.java:798:18:798:19 | in : Intent [android.content.Intent.extras, ] : Object | Test.java:798:4:798:6 | out [post update] : Intent [android.content.Intent.extras, ] : Object | provenance | MaD:55 | | Test.java:798:18:798:19 | in : Intent [android.content.Intent.extras, ] : Object | Test.java:798:4:798:6 | out [post update] : Intent [android.content.Intent.extras, ] : Object | provenance | MaD:55 | | Test.java:799:21:799:41 | getIntent_extras(...) : Bundle [] : Object | Test.java:799:9:799:42 | getMapValue(...) | provenance | MaD:175 | | Test.java:799:38:799:40 | out : Intent [android.content.Intent.extras, ] : Object | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : Object | provenance | | -| Test.java:799:38:799:40 | out : Intent [android.content.Intent.extras, ] : Object | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : Object | provenance | | -| Test.java:799:38:799:40 | out : Intent [android.content.Intent.extras, ] : Object | Test.java:799:21:799:41 | getIntent_extras(...) : Bundle [] : Object | provenance | MaD:34 | | Test.java:799:38:799:40 | out : Intent [android.content.Intent.extras, ] : Object | Test.java:799:21:799:41 | getIntent_extras(...) : Bundle [] : Object | provenance | MaD:34 | | Test.java:804:16:804:31 | (...)... : Intent | Test.java:805:10:805:11 | in : Intent | provenance | | | Test.java:804:24:804:31 | source(...) : Object | Test.java:804:16:804:31 | (...)... : Intent | provenance | | @@ -1241,14 +959,10 @@ edges | Test.java:811:16:811:31 | (...)... : String | Test.java:812:33:812:34 | in : String | provenance | | | Test.java:811:24:811:31 | source(...) : Object | Test.java:811:16:811:31 | (...)... : String | provenance | | | Test.java:812:4:812:6 | out [post update] : Intent [android.content.Intent.extras, ] : String | Test.java:813:36:813:38 | out : Intent [android.content.Intent.extras, ] : String | provenance | | -| Test.java:812:4:812:6 | out [post update] : Intent [android.content.Intent.extras, ] : String | Test.java:813:36:813:38 | out : Intent [android.content.Intent.extras, ] : String | provenance | | -| Test.java:812:33:812:34 | in : String | Test.java:812:4:812:6 | out [post update] : Intent [android.content.Intent.extras, ] : String | provenance | MaD:57 | | Test.java:812:33:812:34 | in : String | Test.java:812:4:812:6 | out [post update] : Intent [android.content.Intent.extras, ] : String | provenance | MaD:57 | | Test.java:813:19:813:39 | getIntent_extras(...) : Bundle [] : String | Test.java:24:19:24:30 | b : Bundle [] : String | provenance | | | Test.java:813:19:813:39 | getIntent_extras(...) : Bundle [] : String | Test.java:813:9:813:40 | getMapKey(...) | provenance | MaD:98 | | Test.java:813:36:813:38 | out : Intent [android.content.Intent.extras, ] : String | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : String | provenance | | -| Test.java:813:36:813:38 | out : Intent [android.content.Intent.extras, ] : String | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : String | provenance | | -| Test.java:813:36:813:38 | out : Intent [android.content.Intent.extras, ] : String | Test.java:813:19:813:39 | getIntent_extras(...) : Bundle [] : String | provenance | MaD:34 | | Test.java:813:36:813:38 | out : Intent [android.content.Intent.extras, ] : String | Test.java:813:19:813:39 | getIntent_extras(...) : Bundle [] : String | provenance | MaD:34 | | Test.java:818:16:818:31 | (...)... : Intent | Test.java:819:10:819:11 | in : Intent | provenance | | | Test.java:818:24:818:31 | source(...) : Object | Test.java:818:16:818:31 | (...)... : Intent | provenance | | @@ -1257,25 +971,17 @@ edges | Test.java:825:16:825:31 | (...)... : String | Test.java:826:36:826:37 | in : String | provenance | | | Test.java:825:24:825:31 | source(...) : Object | Test.java:825:16:825:31 | (...)... : String | provenance | | | Test.java:826:4:826:6 | out [post update] : Intent [android.content.Intent.extras, ] : String | Test.java:827:36:827:38 | out : Intent [android.content.Intent.extras, ] : String | provenance | | -| Test.java:826:4:826:6 | out [post update] : Intent [android.content.Intent.extras, ] : String | Test.java:827:36:827:38 | out : Intent [android.content.Intent.extras, ] : String | provenance | | -| Test.java:826:36:826:37 | in : String | Test.java:826:4:826:6 | out [post update] : Intent [android.content.Intent.extras, ] : String | provenance | MaD:59 | | Test.java:826:36:826:37 | in : String | Test.java:826:4:826:6 | out [post update] : Intent [android.content.Intent.extras, ] : String | provenance | MaD:59 | | Test.java:827:19:827:39 | getIntent_extras(...) : Bundle [] : String | Test.java:24:19:24:30 | b : Bundle [] : String | provenance | | | Test.java:827:19:827:39 | getIntent_extras(...) : Bundle [] : String | Test.java:827:9:827:40 | getMapKey(...) | provenance | MaD:98 | | Test.java:827:36:827:38 | out : Intent [android.content.Intent.extras, ] : String | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : String | provenance | | -| Test.java:827:36:827:38 | out : Intent [android.content.Intent.extras, ] : String | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : String | provenance | | -| Test.java:827:36:827:38 | out : Intent [android.content.Intent.extras, ] : String | Test.java:827:19:827:39 | getIntent_extras(...) : Bundle [] : String | provenance | MaD:34 | | Test.java:827:36:827:38 | out : Intent [android.content.Intent.extras, ] : String | Test.java:827:19:827:39 | getIntent_extras(...) : Bundle [] : String | provenance | MaD:34 | | Test.java:832:19:832:37 | (...)... : ArrayList | Test.java:833:42:833:43 | in : ArrayList | provenance | | | Test.java:832:30:832:37 | source(...) : Object | Test.java:832:19:832:37 | (...)... : ArrayList | provenance | | | Test.java:833:4:833:6 | out [post update] : Intent [android.content.Intent.extras, ] : ArrayList | Test.java:834:38:834:40 | out : Intent [android.content.Intent.extras, ] : ArrayList | provenance | | -| Test.java:833:4:833:6 | out [post update] : Intent [android.content.Intent.extras, ] : ArrayList | Test.java:834:38:834:40 | out : Intent [android.content.Intent.extras, ] : ArrayList | provenance | | -| Test.java:833:42:833:43 | in : ArrayList | Test.java:833:4:833:6 | out [post update] : Intent [android.content.Intent.extras, ] : ArrayList | provenance | MaD:60 | | Test.java:833:42:833:43 | in : ArrayList | Test.java:833:4:833:6 | out [post update] : Intent [android.content.Intent.extras, ] : ArrayList | provenance | MaD:60 | | Test.java:834:21:834:41 | getIntent_extras(...) : Bundle [] : ArrayList | Test.java:834:9:834:42 | getMapValue(...) | provenance | MaD:175 | | Test.java:834:38:834:40 | out : Intent [android.content.Intent.extras, ] : ArrayList | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : ArrayList | provenance | | -| Test.java:834:38:834:40 | out : Intent [android.content.Intent.extras, ] : ArrayList | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : ArrayList | provenance | | -| Test.java:834:38:834:40 | out : Intent [android.content.Intent.extras, ] : ArrayList | Test.java:834:21:834:41 | getIntent_extras(...) : Bundle [] : ArrayList | provenance | MaD:34 | | Test.java:834:38:834:40 | out : Intent [android.content.Intent.extras, ] : ArrayList | Test.java:834:21:834:41 | getIntent_extras(...) : Bundle [] : ArrayList | provenance | MaD:34 | | Test.java:839:16:839:31 | (...)... : Intent | Test.java:840:10:840:11 | in : Intent | provenance | | | Test.java:839:24:839:31 | source(...) : Object | Test.java:839:16:839:31 | (...)... : Intent | provenance | | @@ -1284,25 +990,17 @@ edges | Test.java:846:16:846:31 | (...)... : String | Test.java:847:32:847:33 | in : String | provenance | | | Test.java:846:24:846:31 | source(...) : Object | Test.java:846:16:846:31 | (...)... : String | provenance | | | Test.java:847:4:847:6 | out [post update] : Intent [android.content.Intent.extras, ] : String | Test.java:848:36:848:38 | out : Intent [android.content.Intent.extras, ] : String | provenance | | -| Test.java:847:4:847:6 | out [post update] : Intent [android.content.Intent.extras, ] : String | Test.java:848:36:848:38 | out : Intent [android.content.Intent.extras, ] : String | provenance | | -| Test.java:847:32:847:33 | in : String | Test.java:847:4:847:6 | out [post update] : Intent [android.content.Intent.extras, ] : String | provenance | MaD:62 | | Test.java:847:32:847:33 | in : String | Test.java:847:4:847:6 | out [post update] : Intent [android.content.Intent.extras, ] : String | provenance | MaD:62 | | Test.java:848:19:848:39 | getIntent_extras(...) : Bundle [] : String | Test.java:24:19:24:30 | b : Bundle [] : String | provenance | | | Test.java:848:19:848:39 | getIntent_extras(...) : Bundle [] : String | Test.java:848:9:848:40 | getMapKey(...) | provenance | MaD:98 | | Test.java:848:36:848:38 | out : Intent [android.content.Intent.extras, ] : String | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : String | provenance | | -| Test.java:848:36:848:38 | out : Intent [android.content.Intent.extras, ] : String | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : String | provenance | | -| Test.java:848:36:848:38 | out : Intent [android.content.Intent.extras, ] : String | Test.java:848:19:848:39 | getIntent_extras(...) : Bundle [] : String | provenance | MaD:34 | | Test.java:848:36:848:38 | out : Intent [android.content.Intent.extras, ] : String | Test.java:848:19:848:39 | getIntent_extras(...) : Bundle [] : String | provenance | MaD:34 | | Test.java:853:19:853:37 | (...)... : ArrayList | Test.java:854:38:854:39 | in : ArrayList | provenance | | | Test.java:853:30:853:37 | source(...) : Object | Test.java:853:19:853:37 | (...)... : ArrayList | provenance | | | Test.java:854:4:854:6 | out [post update] : Intent [android.content.Intent.extras, ] : ArrayList | Test.java:855:38:855:40 | out : Intent [android.content.Intent.extras, ] : ArrayList | provenance | | -| Test.java:854:4:854:6 | out [post update] : Intent [android.content.Intent.extras, ] : ArrayList | Test.java:855:38:855:40 | out : Intent [android.content.Intent.extras, ] : ArrayList | provenance | | -| Test.java:854:38:854:39 | in : ArrayList | Test.java:854:4:854:6 | out [post update] : Intent [android.content.Intent.extras, ] : ArrayList | provenance | MaD:63 | | Test.java:854:38:854:39 | in : ArrayList | Test.java:854:4:854:6 | out [post update] : Intent [android.content.Intent.extras, ] : ArrayList | provenance | MaD:63 | | Test.java:855:21:855:41 | getIntent_extras(...) : Bundle [] : ArrayList | Test.java:855:9:855:42 | getMapValue(...) | provenance | MaD:175 | | Test.java:855:38:855:40 | out : Intent [android.content.Intent.extras, ] : ArrayList | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : ArrayList | provenance | | -| Test.java:855:38:855:40 | out : Intent [android.content.Intent.extras, ] : ArrayList | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : ArrayList | provenance | | -| Test.java:855:38:855:40 | out : Intent [android.content.Intent.extras, ] : ArrayList | Test.java:855:21:855:41 | getIntent_extras(...) : Bundle [] : ArrayList | provenance | MaD:34 | | Test.java:855:38:855:40 | out : Intent [android.content.Intent.extras, ] : ArrayList | Test.java:855:21:855:41 | getIntent_extras(...) : Bundle [] : ArrayList | provenance | MaD:34 | | Test.java:860:16:860:31 | (...)... : Intent | Test.java:861:10:861:11 | in : Intent | provenance | | | Test.java:860:24:860:31 | source(...) : Object | Test.java:860:16:860:31 | (...)... : Intent | provenance | | @@ -1313,26 +1011,18 @@ edges | Test.java:867:44:867:51 | source(...) : String | Test.java:28:29:28:36 | k : String | provenance | | | Test.java:867:44:867:51 | source(...) : String | Test.java:867:24:867:52 | newBundleWithMapKey(...) : Bundle [] : String | provenance | MaD:105 | | Test.java:868:4:868:6 | out [post update] : Intent [android.content.Intent.extras, ] : String | Test.java:869:36:869:38 | out : Intent [android.content.Intent.extras, ] : String | provenance | | -| Test.java:868:4:868:6 | out [post update] : Intent [android.content.Intent.extras, ] : String | Test.java:869:36:869:38 | out : Intent [android.content.Intent.extras, ] : String | provenance | | -| Test.java:868:22:868:23 | in : Bundle [] : String | Test.java:868:4:868:6 | out [post update] : Intent [android.content.Intent.extras, ] : String | provenance | MaD:65 | | Test.java:868:22:868:23 | in : Bundle [] : String | Test.java:868:4:868:6 | out [post update] : Intent [android.content.Intent.extras, ] : String | provenance | MaD:65 | | Test.java:869:19:869:39 | getIntent_extras(...) : Bundle [] : String | Test.java:24:19:24:30 | b : Bundle [] : String | provenance | | | Test.java:869:19:869:39 | getIntent_extras(...) : Bundle [] : String | Test.java:869:9:869:40 | getMapKey(...) | provenance | MaD:98 | | Test.java:869:36:869:38 | out : Intent [android.content.Intent.extras, ] : String | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : String | provenance | | -| Test.java:869:36:869:38 | out : Intent [android.content.Intent.extras, ] : String | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : String | provenance | | -| Test.java:869:36:869:38 | out : Intent [android.content.Intent.extras, ] : String | Test.java:869:19:869:39 | getIntent_extras(...) : Bundle [] : String | provenance | MaD:34 | | Test.java:869:36:869:38 | out : Intent [android.content.Intent.extras, ] : String | Test.java:869:19:869:39 | getIntent_extras(...) : Bundle [] : String | provenance | MaD:34 | | Test.java:874:16:874:54 | (...)... : Bundle [] : Object | Test.java:875:22:875:23 | in : Bundle [] : Object | provenance | | | Test.java:874:24:874:54 | newBundleWithMapValue(...) : Bundle [] : Object | Test.java:874:16:874:54 | (...)... : Bundle [] : Object | provenance | | | Test.java:874:46:874:53 | source(...) : Object | Test.java:874:24:874:54 | newBundleWithMapValue(...) : Bundle [] : Object | provenance | MaD:176 | | Test.java:875:4:875:6 | out [post update] : Intent [android.content.Intent.extras, ] : Object | Test.java:876:38:876:40 | out : Intent [android.content.Intent.extras, ] : Object | provenance | | -| Test.java:875:4:875:6 | out [post update] : Intent [android.content.Intent.extras, ] : Object | Test.java:876:38:876:40 | out : Intent [android.content.Intent.extras, ] : Object | provenance | | -| Test.java:875:22:875:23 | in : Bundle [] : Object | Test.java:875:4:875:6 | out [post update] : Intent [android.content.Intent.extras, ] : Object | provenance | MaD:66 | | Test.java:875:22:875:23 | in : Bundle [] : Object | Test.java:875:4:875:6 | out [post update] : Intent [android.content.Intent.extras, ] : Object | provenance | MaD:66 | | Test.java:876:21:876:41 | getIntent_extras(...) : Bundle [] : Object | Test.java:876:9:876:42 | getMapValue(...) | provenance | MaD:175 | | Test.java:876:38:876:40 | out : Intent [android.content.Intent.extras, ] : Object | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : Object | provenance | | -| Test.java:876:38:876:40 | out : Intent [android.content.Intent.extras, ] : Object | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : Object | provenance | | -| Test.java:876:38:876:40 | out : Intent [android.content.Intent.extras, ] : Object | Test.java:876:21:876:41 | getIntent_extras(...) : Bundle [] : Object | provenance | MaD:34 | | Test.java:876:38:876:40 | out : Intent [android.content.Intent.extras, ] : Object | Test.java:876:21:876:41 | getIntent_extras(...) : Bundle [] : Object | provenance | MaD:34 | | Test.java:881:16:881:31 | (...)... : Intent | Test.java:882:10:882:11 | in : Intent | provenance | | | Test.java:881:24:881:31 | source(...) : Object | Test.java:881:16:881:31 | (...)... : Intent | provenance | | @@ -1344,27 +1034,19 @@ edges | Test.java:888:65:888:72 | source(...) : String | Test.java:28:29:28:36 | k : String | provenance | | | Test.java:888:65:888:72 | source(...) : String | Test.java:888:45:888:73 | newBundleWithMapKey(...) : Bundle [] : String | provenance | MaD:105 | | Test.java:889:4:889:6 | out [post update] : Intent [android.content.Intent.extras, ] : String | Test.java:890:36:890:38 | out : Intent [android.content.Intent.extras, ] : String | provenance | | -| Test.java:889:4:889:6 | out [post update] : Intent [android.content.Intent.extras, ] : String | Test.java:890:36:890:38 | out : Intent [android.content.Intent.extras, ] : String | provenance | | -| Test.java:889:22:889:23 | in : Intent [android.content.Intent.extras, ] : String | Test.java:889:4:889:6 | out [post update] : Intent [android.content.Intent.extras, ] : String | provenance | MaD:68 | | Test.java:889:22:889:23 | in : Intent [android.content.Intent.extras, ] : String | Test.java:889:4:889:6 | out [post update] : Intent [android.content.Intent.extras, ] : String | provenance | MaD:68 | | Test.java:890:19:890:39 | getIntent_extras(...) : Bundle [] : String | Test.java:24:19:24:30 | b : Bundle [] : String | provenance | | | Test.java:890:19:890:39 | getIntent_extras(...) : Bundle [] : String | Test.java:890:9:890:40 | getMapKey(...) | provenance | MaD:98 | | Test.java:890:36:890:38 | out : Intent [android.content.Intent.extras, ] : String | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : String | provenance | | -| Test.java:890:36:890:38 | out : Intent [android.content.Intent.extras, ] : String | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : String | provenance | | -| Test.java:890:36:890:38 | out : Intent [android.content.Intent.extras, ] : String | Test.java:890:19:890:39 | getIntent_extras(...) : Bundle [] : String | provenance | MaD:34 | | Test.java:890:36:890:38 | out : Intent [android.content.Intent.extras, ] : String | Test.java:890:19:890:39 | getIntent_extras(...) : Bundle [] : String | provenance | MaD:34 | | Test.java:895:16:895:76 | (...)... : Intent [android.content.Intent.extras, ] : Object | Test.java:896:22:896:23 | in : Intent [android.content.Intent.extras, ] : Object | provenance | | | Test.java:895:24:895:76 | newWithIntent_extras(...) : Intent [android.content.Intent.extras, ] : Object | Test.java:895:16:895:76 | (...)... : Intent [android.content.Intent.extras, ] : Object | provenance | | | Test.java:895:45:895:75 | newBundleWithMapValue(...) : Bundle [] : Object | Test.java:895:24:895:76 | newWithIntent_extras(...) : Intent [android.content.Intent.extras, ] : Object | provenance | MaD:178 | | Test.java:895:67:895:74 | source(...) : Object | Test.java:895:45:895:75 | newBundleWithMapValue(...) : Bundle [] : Object | provenance | MaD:176 | | Test.java:896:4:896:6 | out [post update] : Intent [android.content.Intent.extras, ] : Object | Test.java:897:38:897:40 | out : Intent [android.content.Intent.extras, ] : Object | provenance | | -| Test.java:896:4:896:6 | out [post update] : Intent [android.content.Intent.extras, ] : Object | Test.java:897:38:897:40 | out : Intent [android.content.Intent.extras, ] : Object | provenance | | -| Test.java:896:22:896:23 | in : Intent [android.content.Intent.extras, ] : Object | Test.java:896:4:896:6 | out [post update] : Intent [android.content.Intent.extras, ] : Object | provenance | MaD:69 | | Test.java:896:22:896:23 | in : Intent [android.content.Intent.extras, ] : Object | Test.java:896:4:896:6 | out [post update] : Intent [android.content.Intent.extras, ] : Object | provenance | MaD:69 | | Test.java:897:21:897:41 | getIntent_extras(...) : Bundle [] : Object | Test.java:897:9:897:42 | getMapValue(...) | provenance | MaD:175 | | Test.java:897:38:897:40 | out : Intent [android.content.Intent.extras, ] : Object | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : Object | provenance | | -| Test.java:897:38:897:40 | out : Intent [android.content.Intent.extras, ] : Object | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : Object | provenance | | -| Test.java:897:38:897:40 | out : Intent [android.content.Intent.extras, ] : Object | Test.java:897:21:897:41 | getIntent_extras(...) : Bundle [] : Object | provenance | MaD:34 | | Test.java:897:38:897:40 | out : Intent [android.content.Intent.extras, ] : Object | Test.java:897:21:897:41 | getIntent_extras(...) : Bundle [] : Object | provenance | MaD:34 | | Test.java:902:16:902:31 | (...)... : Intent | Test.java:903:10:903:11 | in : Intent | provenance | | | Test.java:902:24:902:31 | source(...) : Object | Test.java:902:16:902:31 | (...)... : Intent | provenance | | @@ -2001,430 +1683,164 @@ edges | Test.java:1759:4:1759:6 | out [post update] : Intent | Test.java:1760:9:1760:11 | out | provenance | | | Test.java:1759:19:1759:20 | in : String | Test.java:1759:4:1759:6 | out [post update] : Intent | provenance | MaD:89 | | TestStartActivityToGetIntent.java:18:13:18:18 | intent [post update] : Intent [android.content.Intent.extras, ] : String | TestStartActivityToGetIntent.java:19:31:19:36 | intent : Intent [android.content.Intent.extras, ] : String | provenance | | -| TestStartActivityToGetIntent.java:18:13:18:18 | intent [post update] : Intent [android.content.Intent.extras, ] : String | TestStartActivityToGetIntent.java:19:31:19:36 | intent : Intent [android.content.Intent.extras, ] : String | provenance | | -| TestStartActivityToGetIntent.java:18:13:18:18 | intent [post update] : Intent [android.content.Intent.extras, ] : String | TestStartActivityToGetIntent.java:19:31:19:36 | intent : Intent [android.content.Intent.extras, ] : String | provenance | | -| TestStartActivityToGetIntent.java:18:37:18:64 | (...)... : String | TestStartActivityToGetIntent.java:18:13:18:18 | intent [post update] : Intent [android.content.Intent.extras, ] : String | provenance | MaD:49 | -| TestStartActivityToGetIntent.java:18:37:18:64 | (...)... : String | TestStartActivityToGetIntent.java:18:13:18:18 | intent [post update] : Intent [android.content.Intent.extras, ] : String | provenance | MaD:49 | | TestStartActivityToGetIntent.java:18:37:18:64 | (...)... : String | TestStartActivityToGetIntent.java:18:13:18:18 | intent [post update] : Intent [android.content.Intent.extras, ] : String | provenance | MaD:49 | | TestStartActivityToGetIntent.java:18:46:18:64 | source(...) : Object | TestStartActivityToGetIntent.java:18:37:18:64 | (...)... : String | provenance | | | TestStartActivityToGetIntent.java:19:31:19:36 | intent : Intent [android.content.Intent.extras, ] : String | TestStartActivityToGetIntent.java:95:18:95:28 | getIntent(...) : Intent [android.content.Intent.extras, ] : String | provenance | | -| TestStartActivityToGetIntent.java:19:31:19:36 | intent : Intent [android.content.Intent.extras, ] : String | TestStartActivityToGetIntent.java:95:18:95:28 | getIntent(...) : Intent [android.content.Intent.extras, ] : String | provenance | | -| TestStartActivityToGetIntent.java:19:31:19:36 | intent : Intent [android.content.Intent.extras, ] : String | TestStartActivityToGetIntent.java:95:18:95:28 | getIntent(...) : Intent [android.content.Intent.extras, ] : String | provenance | | | TestStartActivityToGetIntent.java:23:13:23:18 | intent [post update] : Intent [android.content.Intent.extras, ] : String | TestStartActivityToGetIntent.java:24:46:24:51 | intent : Intent [android.content.Intent.extras, ] : String | provenance | | -| TestStartActivityToGetIntent.java:23:13:23:18 | intent [post update] : Intent [android.content.Intent.extras, ] : String | TestStartActivityToGetIntent.java:24:46:24:51 | intent : Intent [android.content.Intent.extras, ] : String | provenance | | -| TestStartActivityToGetIntent.java:23:13:23:18 | intent [post update] : Intent [android.content.Intent.extras, ] : String | TestStartActivityToGetIntent.java:24:46:24:51 | intent : Intent [android.content.Intent.extras, ] : String | provenance | | -| TestStartActivityToGetIntent.java:23:37:23:69 | (...)... : String | TestStartActivityToGetIntent.java:23:13:23:18 | intent [post update] : Intent [android.content.Intent.extras, ] : String | provenance | MaD:49 | -| TestStartActivityToGetIntent.java:23:37:23:69 | (...)... : String | TestStartActivityToGetIntent.java:23:13:23:18 | intent [post update] : Intent [android.content.Intent.extras, ] : String | provenance | MaD:49 | | TestStartActivityToGetIntent.java:23:37:23:69 | (...)... : String | TestStartActivityToGetIntent.java:23:13:23:18 | intent [post update] : Intent [android.content.Intent.extras, ] : String | provenance | MaD:49 | | TestStartActivityToGetIntent.java:23:46:23:69 | source(...) : Object | TestStartActivityToGetIntent.java:23:37:23:69 | (...)... : String | provenance | | | TestStartActivityToGetIntent.java:24:32:24:52 | {...} : Intent[] [[], android.content.Intent.extras, ] : String | TestStartActivityToGetIntent.java:25:33:25:39 | intents : Intent[] [[], android.content.Intent.extras, ] : String | provenance | | -| TestStartActivityToGetIntent.java:24:32:24:52 | {...} : Intent[] [[], android.content.Intent.extras, ] : String | TestStartActivityToGetIntent.java:25:33:25:39 | intents : Intent[] [[], android.content.Intent.extras, ] : String | provenance | | -| TestStartActivityToGetIntent.java:24:32:24:52 | {...} : Intent[] [[], android.content.Intent.extras, ] : String | TestStartActivityToGetIntent.java:25:33:25:39 | intents : Intent[] [[], android.content.Intent.extras, ] : String | provenance | | -| TestStartActivityToGetIntent.java:24:46:24:51 | intent : Intent [android.content.Intent.extras, ] : String | TestStartActivityToGetIntent.java:24:32:24:52 | {...} : Intent[] [[], android.content.Intent.extras, ] : String | provenance | | -| TestStartActivityToGetIntent.java:24:46:24:51 | intent : Intent [android.content.Intent.extras, ] : String | TestStartActivityToGetIntent.java:24:32:24:52 | {...} : Intent[] [[], android.content.Intent.extras, ] : String | provenance | | | TestStartActivityToGetIntent.java:24:46:24:51 | intent : Intent [android.content.Intent.extras, ] : String | TestStartActivityToGetIntent.java:24:32:24:52 | {...} : Intent[] [[], android.content.Intent.extras, ] : String | provenance | | | TestStartActivityToGetIntent.java:25:33:25:39 | intents : Intent[] [[], android.content.Intent.extras, ] : String | TestStartActivityToGetIntent.java:95:18:95:28 | getIntent(...) : Intent [android.content.Intent.extras, ] : String | provenance | android.content.Activity.startActivities()+TestStartActivityToGetIntent$SomeActivity | -| TestStartActivityToGetIntent.java:25:33:25:39 | intents : Intent[] [[], android.content.Intent.extras, ] : String | TestStartActivityToGetIntent.java:95:18:95:28 | getIntent(...) : Intent [android.content.Intent.extras, ] : String | provenance | android.content.Activity.startActivities()+TestStartActivityToGetIntent$SomeActivity | -| TestStartActivityToGetIntent.java:25:33:25:39 | intents : Intent[] [[], android.content.Intent.extras, ] : String | TestStartActivityToGetIntent.java:95:18:95:28 | getIntent(...) : Intent [android.content.Intent.extras, ] : String | provenance | android.content.Activity.startActivities()+TestStartActivityToGetIntent$SomeActivity | | TestStartActivityToGetIntent.java:29:13:29:18 | intent [post update] : Intent [android.content.Intent.extras, ] : String | TestStartActivityToGetIntent.java:30:46:30:51 | intent : Intent [android.content.Intent.extras, ] : String | provenance | | -| TestStartActivityToGetIntent.java:29:13:29:18 | intent [post update] : Intent [android.content.Intent.extras, ] : String | TestStartActivityToGetIntent.java:30:46:30:51 | intent : Intent [android.content.Intent.extras, ] : String | provenance | | -| TestStartActivityToGetIntent.java:29:13:29:18 | intent [post update] : Intent [android.content.Intent.extras, ] : String | TestStartActivityToGetIntent.java:30:46:30:51 | intent : Intent [android.content.Intent.extras, ] : String | provenance | | -| TestStartActivityToGetIntent.java:29:37:29:71 | (...)... : String | TestStartActivityToGetIntent.java:29:13:29:18 | intent [post update] : Intent [android.content.Intent.extras, ] : String | provenance | MaD:49 | -| TestStartActivityToGetIntent.java:29:37:29:71 | (...)... : String | TestStartActivityToGetIntent.java:29:13:29:18 | intent [post update] : Intent [android.content.Intent.extras, ] : String | provenance | MaD:49 | | TestStartActivityToGetIntent.java:29:37:29:71 | (...)... : String | TestStartActivityToGetIntent.java:29:13:29:18 | intent [post update] : Intent [android.content.Intent.extras, ] : String | provenance | MaD:49 | | TestStartActivityToGetIntent.java:29:46:29:71 | source(...) : Object | TestStartActivityToGetIntent.java:29:37:29:71 | (...)... : String | provenance | | | TestStartActivityToGetIntent.java:30:32:30:52 | {...} : Intent[] [[], android.content.Intent.extras, ] : String | TestStartActivityToGetIntent.java:31:33:31:39 | intents : Intent[] [[], android.content.Intent.extras, ] : String | provenance | | -| TestStartActivityToGetIntent.java:30:32:30:52 | {...} : Intent[] [[], android.content.Intent.extras, ] : String | TestStartActivityToGetIntent.java:31:33:31:39 | intents : Intent[] [[], android.content.Intent.extras, ] : String | provenance | | -| TestStartActivityToGetIntent.java:30:32:30:52 | {...} : Intent[] [[], android.content.Intent.extras, ] : String | TestStartActivityToGetIntent.java:31:33:31:39 | intents : Intent[] [[], android.content.Intent.extras, ] : String | provenance | | -| TestStartActivityToGetIntent.java:30:46:30:51 | intent : Intent [android.content.Intent.extras, ] : String | TestStartActivityToGetIntent.java:30:32:30:52 | {...} : Intent[] [[], android.content.Intent.extras, ] : String | provenance | | -| TestStartActivityToGetIntent.java:30:46:30:51 | intent : Intent [android.content.Intent.extras, ] : String | TestStartActivityToGetIntent.java:30:32:30:52 | {...} : Intent[] [[], android.content.Intent.extras, ] : String | provenance | | | TestStartActivityToGetIntent.java:30:46:30:51 | intent : Intent [android.content.Intent.extras, ] : String | TestStartActivityToGetIntent.java:30:32:30:52 | {...} : Intent[] [[], android.content.Intent.extras, ] : String | provenance | | | TestStartActivityToGetIntent.java:31:33:31:39 | intents : Intent[] [[], android.content.Intent.extras, ] : String | TestStartActivityToGetIntent.java:102:18:102:28 | getIntent(...) : Intent [android.content.Intent.extras, ] : String | provenance | android.content.Activity.startActivities()+TestStartActivityToGetIntent$AnotherActivity | -| TestStartActivityToGetIntent.java:31:33:31:39 | intents : Intent[] [[], android.content.Intent.extras, ] : String | TestStartActivityToGetIntent.java:102:18:102:28 | getIntent(...) : Intent [android.content.Intent.extras, ] : String | provenance | android.content.Activity.startActivities()+TestStartActivityToGetIntent$AnotherActivity | -| TestStartActivityToGetIntent.java:31:33:31:39 | intents : Intent[] [[], android.content.Intent.extras, ] : String | TestStartActivityToGetIntent.java:102:18:102:28 | getIntent(...) : Intent [android.content.Intent.extras, ] : String | provenance | android.content.Activity.startActivities()+TestStartActivityToGetIntent$AnotherActivity | | TestStartActivityToGetIntent.java:35:13:35:18 | intent [post update] : Intent [android.content.Intent.extras, ] : String | TestStartActivityToGetIntent.java:36:31:36:36 | intent : Intent [android.content.Intent.extras, ] : String | provenance | | -| TestStartActivityToGetIntent.java:35:13:35:18 | intent [post update] : Intent [android.content.Intent.extras, ] : String | TestStartActivityToGetIntent.java:36:31:36:36 | intent : Intent [android.content.Intent.extras, ] : String | provenance | | -| TestStartActivityToGetIntent.java:35:13:35:18 | intent [post update] : Intent [android.content.Intent.extras, ] : String | TestStartActivityToGetIntent.java:36:31:36:36 | intent : Intent [android.content.Intent.extras, ] : String | provenance | | -| TestStartActivityToGetIntent.java:35:37:35:64 | (...)... : String | TestStartActivityToGetIntent.java:35:13:35:18 | intent [post update] : Intent [android.content.Intent.extras, ] : String | provenance | MaD:49 | -| TestStartActivityToGetIntent.java:35:37:35:64 | (...)... : String | TestStartActivityToGetIntent.java:35:13:35:18 | intent [post update] : Intent [android.content.Intent.extras, ] : String | provenance | MaD:49 | | TestStartActivityToGetIntent.java:35:37:35:64 | (...)... : String | TestStartActivityToGetIntent.java:35:13:35:18 | intent [post update] : Intent [android.content.Intent.extras, ] : String | provenance | MaD:49 | | TestStartActivityToGetIntent.java:35:46:35:64 | source(...) : Object | TestStartActivityToGetIntent.java:35:37:35:64 | (...)... : String | provenance | | | TestStartActivityToGetIntent.java:36:31:36:36 | intent : Intent [android.content.Intent.extras, ] : String | TestStartActivityToGetIntent.java:95:18:95:28 | getIntent(...) : Intent [android.content.Intent.extras, ] : String | provenance | | -| TestStartActivityToGetIntent.java:36:31:36:36 | intent : Intent [android.content.Intent.extras, ] : String | TestStartActivityToGetIntent.java:95:18:95:28 | getIntent(...) : Intent [android.content.Intent.extras, ] : String | provenance | | -| TestStartActivityToGetIntent.java:36:31:36:36 | intent : Intent [android.content.Intent.extras, ] : String | TestStartActivityToGetIntent.java:95:18:95:28 | getIntent(...) : Intent [android.content.Intent.extras, ] : String | provenance | | | TestStartActivityToGetIntent.java:40:13:40:18 | intent [post update] : Intent [android.content.Intent.extras, ] : String | TestStartActivityToGetIntent.java:41:46:41:51 | intent : Intent [android.content.Intent.extras, ] : String | provenance | | -| TestStartActivityToGetIntent.java:40:13:40:18 | intent [post update] : Intent [android.content.Intent.extras, ] : String | TestStartActivityToGetIntent.java:41:46:41:51 | intent : Intent [android.content.Intent.extras, ] : String | provenance | | -| TestStartActivityToGetIntent.java:40:13:40:18 | intent [post update] : Intent [android.content.Intent.extras, ] : String | TestStartActivityToGetIntent.java:41:46:41:51 | intent : Intent [android.content.Intent.extras, ] : String | provenance | | -| TestStartActivityToGetIntent.java:40:37:40:69 | (...)... : String | TestStartActivityToGetIntent.java:40:13:40:18 | intent [post update] : Intent [android.content.Intent.extras, ] : String | provenance | MaD:49 | -| TestStartActivityToGetIntent.java:40:37:40:69 | (...)... : String | TestStartActivityToGetIntent.java:40:13:40:18 | intent [post update] : Intent [android.content.Intent.extras, ] : String | provenance | MaD:49 | | TestStartActivityToGetIntent.java:40:37:40:69 | (...)... : String | TestStartActivityToGetIntent.java:40:13:40:18 | intent [post update] : Intent [android.content.Intent.extras, ] : String | provenance | MaD:49 | | TestStartActivityToGetIntent.java:40:46:40:69 | source(...) : Object | TestStartActivityToGetIntent.java:40:37:40:69 | (...)... : String | provenance | | | TestStartActivityToGetIntent.java:41:32:41:52 | {...} : Intent[] [[], android.content.Intent.extras, ] : String | TestStartActivityToGetIntent.java:42:33:42:39 | intents : Intent[] [[], android.content.Intent.extras, ] : String | provenance | | -| TestStartActivityToGetIntent.java:41:32:41:52 | {...} : Intent[] [[], android.content.Intent.extras, ] : String | TestStartActivityToGetIntent.java:42:33:42:39 | intents : Intent[] [[], android.content.Intent.extras, ] : String | provenance | | -| TestStartActivityToGetIntent.java:41:32:41:52 | {...} : Intent[] [[], android.content.Intent.extras, ] : String | TestStartActivityToGetIntent.java:42:33:42:39 | intents : Intent[] [[], android.content.Intent.extras, ] : String | provenance | | -| TestStartActivityToGetIntent.java:41:46:41:51 | intent : Intent [android.content.Intent.extras, ] : String | TestStartActivityToGetIntent.java:41:32:41:52 | {...} : Intent[] [[], android.content.Intent.extras, ] : String | provenance | | -| TestStartActivityToGetIntent.java:41:46:41:51 | intent : Intent [android.content.Intent.extras, ] : String | TestStartActivityToGetIntent.java:41:32:41:52 | {...} : Intent[] [[], android.content.Intent.extras, ] : String | provenance | | | TestStartActivityToGetIntent.java:41:46:41:51 | intent : Intent [android.content.Intent.extras, ] : String | TestStartActivityToGetIntent.java:41:32:41:52 | {...} : Intent[] [[], android.content.Intent.extras, ] : String | provenance | | | TestStartActivityToGetIntent.java:42:33:42:39 | intents : Intent[] [[], android.content.Intent.extras, ] : String | TestStartActivityToGetIntent.java:95:18:95:28 | getIntent(...) : Intent [android.content.Intent.extras, ] : String | provenance | android.content.Activity.startActivities()+TestStartActivityToGetIntent$SomeActivity | -| TestStartActivityToGetIntent.java:42:33:42:39 | intents : Intent[] [[], android.content.Intent.extras, ] : String | TestStartActivityToGetIntent.java:95:18:95:28 | getIntent(...) : Intent [android.content.Intent.extras, ] : String | provenance | android.content.Activity.startActivities()+TestStartActivityToGetIntent$SomeActivity | -| TestStartActivityToGetIntent.java:42:33:42:39 | intents : Intent[] [[], android.content.Intent.extras, ] : String | TestStartActivityToGetIntent.java:95:18:95:28 | getIntent(...) : Intent [android.content.Intent.extras, ] : String | provenance | android.content.Activity.startActivities()+TestStartActivityToGetIntent$SomeActivity | | TestStartActivityToGetIntent.java:52:13:52:18 | intent [post update] : Intent [android.content.Intent.extras, ] : String | TestStartActivityToGetIntent.java:53:40:53:45 | intent : Intent [android.content.Intent.extras, ] : String | provenance | | -| TestStartActivityToGetIntent.java:52:13:52:18 | intent [post update] : Intent [android.content.Intent.extras, ] : String | TestStartActivityToGetIntent.java:53:40:53:45 | intent : Intent [android.content.Intent.extras, ] : String | provenance | | -| TestStartActivityToGetIntent.java:52:13:52:18 | intent [post update] : Intent [android.content.Intent.extras, ] : String | TestStartActivityToGetIntent.java:53:40:53:45 | intent : Intent [android.content.Intent.extras, ] : String | provenance | | -| TestStartActivityToGetIntent.java:52:37:52:71 | (...)... : String | TestStartActivityToGetIntent.java:52:13:52:18 | intent [post update] : Intent [android.content.Intent.extras, ] : String | provenance | MaD:49 | -| TestStartActivityToGetIntent.java:52:37:52:71 | (...)... : String | TestStartActivityToGetIntent.java:52:13:52:18 | intent [post update] : Intent [android.content.Intent.extras, ] : String | provenance | MaD:49 | | TestStartActivityToGetIntent.java:52:37:52:71 | (...)... : String | TestStartActivityToGetIntent.java:52:13:52:18 | intent [post update] : Intent [android.content.Intent.extras, ] : String | provenance | MaD:49 | | TestStartActivityToGetIntent.java:52:46:52:71 | source(...) : Object | TestStartActivityToGetIntent.java:52:37:52:71 | (...)... : String | provenance | | | TestStartActivityToGetIntent.java:53:40:53:45 | intent : Intent [android.content.Intent.extras, ] : String | TestStartActivityToGetIntent.java:95:18:95:28 | getIntent(...) : Intent [android.content.Intent.extras, ] : String | provenance | | -| TestStartActivityToGetIntent.java:53:40:53:45 | intent : Intent [android.content.Intent.extras, ] : String | TestStartActivityToGetIntent.java:95:18:95:28 | getIntent(...) : Intent [android.content.Intent.extras, ] : String | provenance | | -| TestStartActivityToGetIntent.java:53:40:53:45 | intent : Intent [android.content.Intent.extras, ] : String | TestStartActivityToGetIntent.java:95:18:95:28 | getIntent(...) : Intent [android.content.Intent.extras, ] : String | provenance | | | TestStartActivityToGetIntent.java:57:13:57:18 | intent [post update] : Intent [android.content.Intent.extras, ] : String | TestStartActivityToGetIntent.java:58:39:58:44 | intent : Intent [android.content.Intent.extras, ] : String | provenance | | -| TestStartActivityToGetIntent.java:57:13:57:18 | intent [post update] : Intent [android.content.Intent.extras, ] : String | TestStartActivityToGetIntent.java:58:39:58:44 | intent : Intent [android.content.Intent.extras, ] : String | provenance | | -| TestStartActivityToGetIntent.java:57:13:57:18 | intent [post update] : Intent [android.content.Intent.extras, ] : String | TestStartActivityToGetIntent.java:58:39:58:44 | intent : Intent [android.content.Intent.extras, ] : String | provenance | | -| TestStartActivityToGetIntent.java:57:37:57:70 | (...)... : String | TestStartActivityToGetIntent.java:57:13:57:18 | intent [post update] : Intent [android.content.Intent.extras, ] : String | provenance | MaD:49 | -| TestStartActivityToGetIntent.java:57:37:57:70 | (...)... : String | TestStartActivityToGetIntent.java:57:13:57:18 | intent [post update] : Intent [android.content.Intent.extras, ] : String | provenance | MaD:49 | | TestStartActivityToGetIntent.java:57:37:57:70 | (...)... : String | TestStartActivityToGetIntent.java:57:13:57:18 | intent [post update] : Intent [android.content.Intent.extras, ] : String | provenance | MaD:49 | | TestStartActivityToGetIntent.java:57:46:57:70 | source(...) : Object | TestStartActivityToGetIntent.java:57:37:57:70 | (...)... : String | provenance | | | TestStartActivityToGetIntent.java:58:39:58:44 | intent : Intent [android.content.Intent.extras, ] : String | TestStartActivityToGetIntent.java:95:18:95:28 | getIntent(...) : Intent [android.content.Intent.extras, ] : String | provenance | | -| TestStartActivityToGetIntent.java:58:39:58:44 | intent : Intent [android.content.Intent.extras, ] : String | TestStartActivityToGetIntent.java:95:18:95:28 | getIntent(...) : Intent [android.content.Intent.extras, ] : String | provenance | | -| TestStartActivityToGetIntent.java:58:39:58:44 | intent : Intent [android.content.Intent.extras, ] : String | TestStartActivityToGetIntent.java:95:18:95:28 | getIntent(...) : Intent [android.content.Intent.extras, ] : String | provenance | | | TestStartActivityToGetIntent.java:62:13:62:18 | intent [post update] : Intent [android.content.Intent.extras, ] : String | TestStartActivityToGetIntent.java:63:43:63:48 | intent : Intent [android.content.Intent.extras, ] : String | provenance | | -| TestStartActivityToGetIntent.java:62:13:62:18 | intent [post update] : Intent [android.content.Intent.extras, ] : String | TestStartActivityToGetIntent.java:63:43:63:48 | intent : Intent [android.content.Intent.extras, ] : String | provenance | | -| TestStartActivityToGetIntent.java:62:13:62:18 | intent [post update] : Intent [android.content.Intent.extras, ] : String | TestStartActivityToGetIntent.java:63:43:63:48 | intent : Intent [android.content.Intent.extras, ] : String | provenance | | -| TestStartActivityToGetIntent.java:62:37:62:69 | (...)... : String | TestStartActivityToGetIntent.java:62:13:62:18 | intent [post update] : Intent [android.content.Intent.extras, ] : String | provenance | MaD:49 | -| TestStartActivityToGetIntent.java:62:37:62:69 | (...)... : String | TestStartActivityToGetIntent.java:62:13:62:18 | intent [post update] : Intent [android.content.Intent.extras, ] : String | provenance | MaD:49 | | TestStartActivityToGetIntent.java:62:37:62:69 | (...)... : String | TestStartActivityToGetIntent.java:62:13:62:18 | intent [post update] : Intent [android.content.Intent.extras, ] : String | provenance | MaD:49 | | TestStartActivityToGetIntent.java:62:46:62:69 | source(...) : Object | TestStartActivityToGetIntent.java:62:37:62:69 | (...)... : String | provenance | | | TestStartActivityToGetIntent.java:63:43:63:48 | intent : Intent [android.content.Intent.extras, ] : String | TestStartActivityToGetIntent.java:95:18:95:28 | getIntent(...) : Intent [android.content.Intent.extras, ] : String | provenance | | -| TestStartActivityToGetIntent.java:63:43:63:48 | intent : Intent [android.content.Intent.extras, ] : String | TestStartActivityToGetIntent.java:95:18:95:28 | getIntent(...) : Intent [android.content.Intent.extras, ] : String | provenance | | -| TestStartActivityToGetIntent.java:63:43:63:48 | intent : Intent [android.content.Intent.extras, ] : String | TestStartActivityToGetIntent.java:95:18:95:28 | getIntent(...) : Intent [android.content.Intent.extras, ] : String | provenance | | | TestStartActivityToGetIntent.java:67:13:67:18 | intent [post update] : Intent [android.content.Intent.extras, ] : String | TestStartActivityToGetIntent.java:68:46:68:51 | intent : Intent [android.content.Intent.extras, ] : String | provenance | | -| TestStartActivityToGetIntent.java:67:13:67:18 | intent [post update] : Intent [android.content.Intent.extras, ] : String | TestStartActivityToGetIntent.java:68:46:68:51 | intent : Intent [android.content.Intent.extras, ] : String | provenance | | -| TestStartActivityToGetIntent.java:67:13:67:18 | intent [post update] : Intent [android.content.Intent.extras, ] : String | TestStartActivityToGetIntent.java:68:46:68:51 | intent : Intent [android.content.Intent.extras, ] : String | provenance | | -| TestStartActivityToGetIntent.java:67:37:67:71 | (...)... : String | TestStartActivityToGetIntent.java:67:13:67:18 | intent [post update] : Intent [android.content.Intent.extras, ] : String | provenance | MaD:49 | -| TestStartActivityToGetIntent.java:67:37:67:71 | (...)... : String | TestStartActivityToGetIntent.java:67:13:67:18 | intent [post update] : Intent [android.content.Intent.extras, ] : String | provenance | MaD:49 | | TestStartActivityToGetIntent.java:67:37:67:71 | (...)... : String | TestStartActivityToGetIntent.java:67:13:67:18 | intent [post update] : Intent [android.content.Intent.extras, ] : String | provenance | MaD:49 | | TestStartActivityToGetIntent.java:67:46:67:71 | source(...) : Object | TestStartActivityToGetIntent.java:67:37:67:71 | (...)... : String | provenance | | | TestStartActivityToGetIntent.java:68:46:68:51 | intent : Intent [android.content.Intent.extras, ] : String | TestStartActivityToGetIntent.java:95:18:95:28 | getIntent(...) : Intent [android.content.Intent.extras, ] : String | provenance | | -| TestStartActivityToGetIntent.java:68:46:68:51 | intent : Intent [android.content.Intent.extras, ] : String | TestStartActivityToGetIntent.java:95:18:95:28 | getIntent(...) : Intent [android.content.Intent.extras, ] : String | provenance | | -| TestStartActivityToGetIntent.java:68:46:68:51 | intent : Intent [android.content.Intent.extras, ] : String | TestStartActivityToGetIntent.java:95:18:95:28 | getIntent(...) : Intent [android.content.Intent.extras, ] : String | provenance | | | TestStartActivityToGetIntent.java:72:13:72:18 | intent [post update] : Intent [android.content.Intent.extras, ] : String | TestStartActivityToGetIntent.java:73:49:73:54 | intent : Intent [android.content.Intent.extras, ] : String | provenance | | -| TestStartActivityToGetIntent.java:72:13:72:18 | intent [post update] : Intent [android.content.Intent.extras, ] : String | TestStartActivityToGetIntent.java:73:49:73:54 | intent : Intent [android.content.Intent.extras, ] : String | provenance | | -| TestStartActivityToGetIntent.java:72:13:72:18 | intent [post update] : Intent [android.content.Intent.extras, ] : String | TestStartActivityToGetIntent.java:73:49:73:54 | intent : Intent [android.content.Intent.extras, ] : String | provenance | | -| TestStartActivityToGetIntent.java:72:37:72:70 | (...)... : String | TestStartActivityToGetIntent.java:72:13:72:18 | intent [post update] : Intent [android.content.Intent.extras, ] : String | provenance | MaD:49 | -| TestStartActivityToGetIntent.java:72:37:72:70 | (...)... : String | TestStartActivityToGetIntent.java:72:13:72:18 | intent [post update] : Intent [android.content.Intent.extras, ] : String | provenance | MaD:49 | | TestStartActivityToGetIntent.java:72:37:72:70 | (...)... : String | TestStartActivityToGetIntent.java:72:13:72:18 | intent [post update] : Intent [android.content.Intent.extras, ] : String | provenance | MaD:49 | | TestStartActivityToGetIntent.java:72:46:72:70 | source(...) : Object | TestStartActivityToGetIntent.java:72:37:72:70 | (...)... : String | provenance | | | TestStartActivityToGetIntent.java:73:49:73:54 | intent : Intent [android.content.Intent.extras, ] : String | TestStartActivityToGetIntent.java:95:18:95:28 | getIntent(...) : Intent [android.content.Intent.extras, ] : String | provenance | | -| TestStartActivityToGetIntent.java:73:49:73:54 | intent : Intent [android.content.Intent.extras, ] : String | TestStartActivityToGetIntent.java:95:18:95:28 | getIntent(...) : Intent [android.content.Intent.extras, ] : String | provenance | | -| TestStartActivityToGetIntent.java:73:49:73:54 | intent : Intent [android.content.Intent.extras, ] : String | TestStartActivityToGetIntent.java:95:18:95:28 | getIntent(...) : Intent [android.content.Intent.extras, ] : String | provenance | | | TestStartActivityToGetIntent.java:79:13:79:18 | intent [post update] : Intent [android.content.Intent.extras, ] : String | TestStartActivityToGetIntent.java:80:31:80:36 | intent : Intent [android.content.Intent.extras, ] : String | provenance | | -| TestStartActivityToGetIntent.java:79:13:79:18 | intent [post update] : Intent [android.content.Intent.extras, ] : String | TestStartActivityToGetIntent.java:80:31:80:36 | intent : Intent [android.content.Intent.extras, ] : String | provenance | | -| TestStartActivityToGetIntent.java:79:13:79:18 | intent [post update] : Intent [android.content.Intent.extras, ] : String | TestStartActivityToGetIntent.java:80:31:80:36 | intent : Intent [android.content.Intent.extras, ] : String | provenance | | -| TestStartActivityToGetIntent.java:79:37:79:60 | (...)... : String | TestStartActivityToGetIntent.java:79:13:79:18 | intent [post update] : Intent [android.content.Intent.extras, ] : String | provenance | MaD:49 | -| TestStartActivityToGetIntent.java:79:37:79:60 | (...)... : String | TestStartActivityToGetIntent.java:79:13:79:18 | intent [post update] : Intent [android.content.Intent.extras, ] : String | provenance | MaD:49 | | TestStartActivityToGetIntent.java:79:37:79:60 | (...)... : String | TestStartActivityToGetIntent.java:79:13:79:18 | intent [post update] : Intent [android.content.Intent.extras, ] : String | provenance | MaD:49 | | TestStartActivityToGetIntent.java:79:46:79:60 | source(...) : Object | TestStartActivityToGetIntent.java:79:37:79:60 | (...)... : String | provenance | | | TestStartActivityToGetIntent.java:80:31:80:36 | intent : Intent [android.content.Intent.extras, ] : String | TestStartActivityToGetIntent.java:95:18:95:28 | getIntent(...) : Intent [android.content.Intent.extras, ] : String | provenance | | -| TestStartActivityToGetIntent.java:80:31:80:36 | intent : Intent [android.content.Intent.extras, ] : String | TestStartActivityToGetIntent.java:95:18:95:28 | getIntent(...) : Intent [android.content.Intent.extras, ] : String | provenance | | -| TestStartActivityToGetIntent.java:80:31:80:36 | intent : Intent [android.content.Intent.extras, ] : String | TestStartActivityToGetIntent.java:95:18:95:28 | getIntent(...) : Intent [android.content.Intent.extras, ] : String | provenance | | -| TestStartActivityToGetIntent.java:95:18:95:28 | getIntent(...) : Intent [android.content.Intent.extras, ] : String | TestStartActivityToGetIntent.java:95:18:95:51 | getStringExtra(...) | provenance | MaD:43 | -| TestStartActivityToGetIntent.java:95:18:95:28 | getIntent(...) : Intent [android.content.Intent.extras, ] : String | TestStartActivityToGetIntent.java:95:18:95:51 | getStringExtra(...) | provenance | MaD:43 | | TestStartActivityToGetIntent.java:95:18:95:28 | getIntent(...) : Intent [android.content.Intent.extras, ] : String | TestStartActivityToGetIntent.java:95:18:95:51 | getStringExtra(...) | provenance | MaD:43 | | TestStartActivityToGetIntent.java:102:18:102:28 | getIntent(...) : Intent [android.content.Intent.extras, ] : String | TestStartActivityToGetIntent.java:102:18:102:51 | getStringExtra(...) | provenance | MaD:43 | -| TestStartActivityToGetIntent.java:102:18:102:28 | getIntent(...) : Intent [android.content.Intent.extras, ] : String | TestStartActivityToGetIntent.java:102:18:102:51 | getStringExtra(...) | provenance | MaD:43 | -| TestStartActivityToGetIntent.java:102:18:102:28 | getIntent(...) : Intent [android.content.Intent.extras, ] : String | TestStartActivityToGetIntent.java:102:18:102:51 | getStringExtra(...) | provenance | MaD:43 | | TestStartBroadcastReceiverToIntent.java:18:13:18:18 | intent [post update] : Intent [android.content.Intent.extras, ] : String | TestStartBroadcastReceiverToIntent.java:19:31:19:36 | intent : Intent [android.content.Intent.extras, ] : String | provenance | | -| TestStartBroadcastReceiverToIntent.java:18:13:18:18 | intent [post update] : Intent [android.content.Intent.extras, ] : String | TestStartBroadcastReceiverToIntent.java:19:31:19:36 | intent : Intent [android.content.Intent.extras, ] : String | provenance | | -| TestStartBroadcastReceiverToIntent.java:18:13:18:18 | intent [post update] : Intent [android.content.Intent.extras, ] : String | TestStartBroadcastReceiverToIntent.java:19:31:19:36 | intent : Intent [android.content.Intent.extras, ] : String | provenance | | -| TestStartBroadcastReceiverToIntent.java:18:37:18:59 | (...)... : String | TestStartBroadcastReceiverToIntent.java:18:13:18:18 | intent [post update] : Intent [android.content.Intent.extras, ] : String | provenance | MaD:49 | -| TestStartBroadcastReceiverToIntent.java:18:37:18:59 | (...)... : String | TestStartBroadcastReceiverToIntent.java:18:13:18:18 | intent [post update] : Intent [android.content.Intent.extras, ] : String | provenance | MaD:49 | | TestStartBroadcastReceiverToIntent.java:18:37:18:59 | (...)... : String | TestStartBroadcastReceiverToIntent.java:18:13:18:18 | intent [post update] : Intent [android.content.Intent.extras, ] : String | provenance | MaD:49 | | TestStartBroadcastReceiverToIntent.java:18:46:18:59 | source(...) : Object | TestStartBroadcastReceiverToIntent.java:18:37:18:59 | (...)... : String | provenance | | | TestStartBroadcastReceiverToIntent.java:19:31:19:36 | intent : Intent [android.content.Intent.extras, ] : String | TestStartBroadcastReceiverToIntent.java:81:48:81:60 | intent : Intent [android.content.Intent.extras, ] : String | provenance | | -| TestStartBroadcastReceiverToIntent.java:19:31:19:36 | intent : Intent [android.content.Intent.extras, ] : String | TestStartBroadcastReceiverToIntent.java:81:48:81:60 | intent : Intent [android.content.Intent.extras, ] : String | provenance | | -| TestStartBroadcastReceiverToIntent.java:19:31:19:36 | intent : Intent [android.content.Intent.extras, ] : String | TestStartBroadcastReceiverToIntent.java:81:48:81:60 | intent : Intent [android.content.Intent.extras, ] : String | provenance | | | TestStartBroadcastReceiverToIntent.java:23:13:23:18 | intent [post update] : Intent [android.content.Intent.extras, ] : String | TestStartBroadcastReceiverToIntent.java:24:37:24:42 | intent : Intent [android.content.Intent.extras, ] : String | provenance | | -| TestStartBroadcastReceiverToIntent.java:23:13:23:18 | intent [post update] : Intent [android.content.Intent.extras, ] : String | TestStartBroadcastReceiverToIntent.java:24:37:24:42 | intent : Intent [android.content.Intent.extras, ] : String | provenance | | -| TestStartBroadcastReceiverToIntent.java:23:13:23:18 | intent [post update] : Intent [android.content.Intent.extras, ] : String | TestStartBroadcastReceiverToIntent.java:24:37:24:42 | intent : Intent [android.content.Intent.extras, ] : String | provenance | | -| TestStartBroadcastReceiverToIntent.java:23:37:23:67 | (...)... : String | TestStartBroadcastReceiverToIntent.java:23:13:23:18 | intent [post update] : Intent [android.content.Intent.extras, ] : String | provenance | MaD:49 | -| TestStartBroadcastReceiverToIntent.java:23:37:23:67 | (...)... : String | TestStartBroadcastReceiverToIntent.java:23:13:23:18 | intent [post update] : Intent [android.content.Intent.extras, ] : String | provenance | MaD:49 | | TestStartBroadcastReceiverToIntent.java:23:37:23:67 | (...)... : String | TestStartBroadcastReceiverToIntent.java:23:13:23:18 | intent [post update] : Intent [android.content.Intent.extras, ] : String | provenance | MaD:49 | | TestStartBroadcastReceiverToIntent.java:23:46:23:67 | source(...) : Object | TestStartBroadcastReceiverToIntent.java:23:37:23:67 | (...)... : String | provenance | | | TestStartBroadcastReceiverToIntent.java:24:37:24:42 | intent : Intent [android.content.Intent.extras, ] : String | TestStartBroadcastReceiverToIntent.java:81:48:81:60 | intent : Intent [android.content.Intent.extras, ] : String | provenance | | -| TestStartBroadcastReceiverToIntent.java:24:37:24:42 | intent : Intent [android.content.Intent.extras, ] : String | TestStartBroadcastReceiverToIntent.java:81:48:81:60 | intent : Intent [android.content.Intent.extras, ] : String | provenance | | -| TestStartBroadcastReceiverToIntent.java:24:37:24:42 | intent : Intent [android.content.Intent.extras, ] : String | TestStartBroadcastReceiverToIntent.java:81:48:81:60 | intent : Intent [android.content.Intent.extras, ] : String | provenance | | | TestStartBroadcastReceiverToIntent.java:28:13:28:18 | intent [post update] : Intent [android.content.Intent.extras, ] : String | TestStartBroadcastReceiverToIntent.java:29:54:29:59 | intent : Intent [android.content.Intent.extras, ] : String | provenance | | -| TestStartBroadcastReceiverToIntent.java:28:13:28:18 | intent [post update] : Intent [android.content.Intent.extras, ] : String | TestStartBroadcastReceiverToIntent.java:29:54:29:59 | intent : Intent [android.content.Intent.extras, ] : String | provenance | | -| TestStartBroadcastReceiverToIntent.java:28:13:28:18 | intent [post update] : Intent [android.content.Intent.extras, ] : String | TestStartBroadcastReceiverToIntent.java:29:54:29:59 | intent : Intent [android.content.Intent.extras, ] : String | provenance | | -| TestStartBroadcastReceiverToIntent.java:28:37:28:69 | (...)... : String | TestStartBroadcastReceiverToIntent.java:28:13:28:18 | intent [post update] : Intent [android.content.Intent.extras, ] : String | provenance | MaD:49 | -| TestStartBroadcastReceiverToIntent.java:28:37:28:69 | (...)... : String | TestStartBroadcastReceiverToIntent.java:28:13:28:18 | intent [post update] : Intent [android.content.Intent.extras, ] : String | provenance | MaD:49 | | TestStartBroadcastReceiverToIntent.java:28:37:28:69 | (...)... : String | TestStartBroadcastReceiverToIntent.java:28:13:28:18 | intent [post update] : Intent [android.content.Intent.extras, ] : String | provenance | MaD:49 | | TestStartBroadcastReceiverToIntent.java:28:46:28:69 | source(...) : Object | TestStartBroadcastReceiverToIntent.java:28:37:28:69 | (...)... : String | provenance | | | TestStartBroadcastReceiverToIntent.java:29:54:29:59 | intent : Intent [android.content.Intent.extras, ] : String | TestStartBroadcastReceiverToIntent.java:81:48:81:60 | intent : Intent [android.content.Intent.extras, ] : String | provenance | | -| TestStartBroadcastReceiverToIntent.java:29:54:29:59 | intent : Intent [android.content.Intent.extras, ] : String | TestStartBroadcastReceiverToIntent.java:81:48:81:60 | intent : Intent [android.content.Intent.extras, ] : String | provenance | | -| TestStartBroadcastReceiverToIntent.java:29:54:29:59 | intent : Intent [android.content.Intent.extras, ] : String | TestStartBroadcastReceiverToIntent.java:81:48:81:60 | intent : Intent [android.content.Intent.extras, ] : String | provenance | | | TestStartBroadcastReceiverToIntent.java:33:13:33:18 | intent [post update] : Intent [android.content.Intent.extras, ] : String | TestStartBroadcastReceiverToIntent.java:34:38:34:43 | intent : Intent [android.content.Intent.extras, ] : String | provenance | | -| TestStartBroadcastReceiverToIntent.java:33:13:33:18 | intent [post update] : Intent [android.content.Intent.extras, ] : String | TestStartBroadcastReceiverToIntent.java:34:38:34:43 | intent : Intent [android.content.Intent.extras, ] : String | provenance | | -| TestStartBroadcastReceiverToIntent.java:33:13:33:18 | intent [post update] : Intent [android.content.Intent.extras, ] : String | TestStartBroadcastReceiverToIntent.java:34:38:34:43 | intent : Intent [android.content.Intent.extras, ] : String | provenance | | -| TestStartBroadcastReceiverToIntent.java:33:37:33:67 | (...)... : String | TestStartBroadcastReceiverToIntent.java:33:13:33:18 | intent [post update] : Intent [android.content.Intent.extras, ] : String | provenance | MaD:49 | -| TestStartBroadcastReceiverToIntent.java:33:37:33:67 | (...)... : String | TestStartBroadcastReceiverToIntent.java:33:13:33:18 | intent [post update] : Intent [android.content.Intent.extras, ] : String | provenance | MaD:49 | | TestStartBroadcastReceiverToIntent.java:33:37:33:67 | (...)... : String | TestStartBroadcastReceiverToIntent.java:33:13:33:18 | intent [post update] : Intent [android.content.Intent.extras, ] : String | provenance | MaD:49 | | TestStartBroadcastReceiverToIntent.java:33:46:33:67 | source(...) : Object | TestStartBroadcastReceiverToIntent.java:33:37:33:67 | (...)... : String | provenance | | | TestStartBroadcastReceiverToIntent.java:34:38:34:43 | intent : Intent [android.content.Intent.extras, ] : String | TestStartBroadcastReceiverToIntent.java:81:48:81:60 | intent : Intent [android.content.Intent.extras, ] : String | provenance | | -| TestStartBroadcastReceiverToIntent.java:34:38:34:43 | intent : Intent [android.content.Intent.extras, ] : String | TestStartBroadcastReceiverToIntent.java:81:48:81:60 | intent : Intent [android.content.Intent.extras, ] : String | provenance | | -| TestStartBroadcastReceiverToIntent.java:34:38:34:43 | intent : Intent [android.content.Intent.extras, ] : String | TestStartBroadcastReceiverToIntent.java:81:48:81:60 | intent : Intent [android.content.Intent.extras, ] : String | provenance | | | TestStartBroadcastReceiverToIntent.java:38:13:38:18 | intent [post update] : Intent [android.content.Intent.extras, ] : String | TestStartBroadcastReceiverToIntent.java:39:44:39:49 | intent : Intent [android.content.Intent.extras, ] : String | provenance | | -| TestStartBroadcastReceiverToIntent.java:38:13:38:18 | intent [post update] : Intent [android.content.Intent.extras, ] : String | TestStartBroadcastReceiverToIntent.java:39:44:39:49 | intent : Intent [android.content.Intent.extras, ] : String | provenance | | -| TestStartBroadcastReceiverToIntent.java:38:13:38:18 | intent [post update] : Intent [android.content.Intent.extras, ] : String | TestStartBroadcastReceiverToIntent.java:39:44:39:49 | intent : Intent [android.content.Intent.extras, ] : String | provenance | | -| TestStartBroadcastReceiverToIntent.java:38:37:38:75 | (...)... : String | TestStartBroadcastReceiverToIntent.java:38:13:38:18 | intent [post update] : Intent [android.content.Intent.extras, ] : String | provenance | MaD:49 | -| TestStartBroadcastReceiverToIntent.java:38:37:38:75 | (...)... : String | TestStartBroadcastReceiverToIntent.java:38:13:38:18 | intent [post update] : Intent [android.content.Intent.extras, ] : String | provenance | MaD:49 | | TestStartBroadcastReceiverToIntent.java:38:37:38:75 | (...)... : String | TestStartBroadcastReceiverToIntent.java:38:13:38:18 | intent [post update] : Intent [android.content.Intent.extras, ] : String | provenance | MaD:49 | | TestStartBroadcastReceiverToIntent.java:38:46:38:75 | source(...) : Object | TestStartBroadcastReceiverToIntent.java:38:37:38:75 | (...)... : String | provenance | | | TestStartBroadcastReceiverToIntent.java:39:44:39:49 | intent : Intent [android.content.Intent.extras, ] : String | TestStartBroadcastReceiverToIntent.java:81:48:81:60 | intent : Intent [android.content.Intent.extras, ] : String | provenance | | -| TestStartBroadcastReceiverToIntent.java:39:44:39:49 | intent : Intent [android.content.Intent.extras, ] : String | TestStartBroadcastReceiverToIntent.java:81:48:81:60 | intent : Intent [android.content.Intent.extras, ] : String | provenance | | -| TestStartBroadcastReceiverToIntent.java:39:44:39:49 | intent : Intent [android.content.Intent.extras, ] : String | TestStartBroadcastReceiverToIntent.java:81:48:81:60 | intent : Intent [android.content.Intent.extras, ] : String | provenance | | | TestStartBroadcastReceiverToIntent.java:43:13:43:18 | intent [post update] : Intent [android.content.Intent.extras, ] : String | TestStartBroadcastReceiverToIntent.java:44:37:44:42 | intent : Intent [android.content.Intent.extras, ] : String | provenance | | -| TestStartBroadcastReceiverToIntent.java:43:13:43:18 | intent [post update] : Intent [android.content.Intent.extras, ] : String | TestStartBroadcastReceiverToIntent.java:44:37:44:42 | intent : Intent [android.content.Intent.extras, ] : String | provenance | | -| TestStartBroadcastReceiverToIntent.java:43:13:43:18 | intent [post update] : Intent [android.content.Intent.extras, ] : String | TestStartBroadcastReceiverToIntent.java:44:37:44:42 | intent : Intent [android.content.Intent.extras, ] : String | provenance | | -| TestStartBroadcastReceiverToIntent.java:43:37:43:66 | (...)... : String | TestStartBroadcastReceiverToIntent.java:43:13:43:18 | intent [post update] : Intent [android.content.Intent.extras, ] : String | provenance | MaD:49 | -| TestStartBroadcastReceiverToIntent.java:43:37:43:66 | (...)... : String | TestStartBroadcastReceiverToIntent.java:43:13:43:18 | intent [post update] : Intent [android.content.Intent.extras, ] : String | provenance | MaD:49 | | TestStartBroadcastReceiverToIntent.java:43:37:43:66 | (...)... : String | TestStartBroadcastReceiverToIntent.java:43:13:43:18 | intent [post update] : Intent [android.content.Intent.extras, ] : String | provenance | MaD:49 | | TestStartBroadcastReceiverToIntent.java:43:46:43:66 | source(...) : Object | TestStartBroadcastReceiverToIntent.java:43:37:43:66 | (...)... : String | provenance | | | TestStartBroadcastReceiverToIntent.java:44:37:44:42 | intent : Intent [android.content.Intent.extras, ] : String | TestStartBroadcastReceiverToIntent.java:81:48:81:60 | intent : Intent [android.content.Intent.extras, ] : String | provenance | | -| TestStartBroadcastReceiverToIntent.java:44:37:44:42 | intent : Intent [android.content.Intent.extras, ] : String | TestStartBroadcastReceiverToIntent.java:81:48:81:60 | intent : Intent [android.content.Intent.extras, ] : String | provenance | | -| TestStartBroadcastReceiverToIntent.java:44:37:44:42 | intent : Intent [android.content.Intent.extras, ] : String | TestStartBroadcastReceiverToIntent.java:81:48:81:60 | intent : Intent [android.content.Intent.extras, ] : String | provenance | | | TestStartBroadcastReceiverToIntent.java:48:13:48:18 | intent [post update] : Intent [android.content.Intent.extras, ] : String | TestStartBroadcastReceiverToIntent.java:49:43:49:48 | intent : Intent [android.content.Intent.extras, ] : String | provenance | | -| TestStartBroadcastReceiverToIntent.java:48:13:48:18 | intent [post update] : Intent [android.content.Intent.extras, ] : String | TestStartBroadcastReceiverToIntent.java:49:43:49:48 | intent : Intent [android.content.Intent.extras, ] : String | provenance | | -| TestStartBroadcastReceiverToIntent.java:48:13:48:18 | intent [post update] : Intent [android.content.Intent.extras, ] : String | TestStartBroadcastReceiverToIntent.java:49:43:49:48 | intent : Intent [android.content.Intent.extras, ] : String | provenance | | -| TestStartBroadcastReceiverToIntent.java:48:37:48:74 | (...)... : String | TestStartBroadcastReceiverToIntent.java:48:13:48:18 | intent [post update] : Intent [android.content.Intent.extras, ] : String | provenance | MaD:49 | -| TestStartBroadcastReceiverToIntent.java:48:37:48:74 | (...)... : String | TestStartBroadcastReceiverToIntent.java:48:13:48:18 | intent [post update] : Intent [android.content.Intent.extras, ] : String | provenance | MaD:49 | | TestStartBroadcastReceiverToIntent.java:48:37:48:74 | (...)... : String | TestStartBroadcastReceiverToIntent.java:48:13:48:18 | intent [post update] : Intent [android.content.Intent.extras, ] : String | provenance | MaD:49 | | TestStartBroadcastReceiverToIntent.java:48:46:48:74 | source(...) : Object | TestStartBroadcastReceiverToIntent.java:48:37:48:74 | (...)... : String | provenance | | | TestStartBroadcastReceiverToIntent.java:49:43:49:48 | intent : Intent [android.content.Intent.extras, ] : String | TestStartBroadcastReceiverToIntent.java:81:48:81:60 | intent : Intent [android.content.Intent.extras, ] : String | provenance | | -| TestStartBroadcastReceiverToIntent.java:49:43:49:48 | intent : Intent [android.content.Intent.extras, ] : String | TestStartBroadcastReceiverToIntent.java:81:48:81:60 | intent : Intent [android.content.Intent.extras, ] : String | provenance | | -| TestStartBroadcastReceiverToIntent.java:49:43:49:48 | intent : Intent [android.content.Intent.extras, ] : String | TestStartBroadcastReceiverToIntent.java:81:48:81:60 | intent : Intent [android.content.Intent.extras, ] : String | provenance | | | TestStartBroadcastReceiverToIntent.java:53:13:53:18 | intent [post update] : Intent [android.content.Intent.extras, ] : String | TestStartBroadcastReceiverToIntent.java:54:44:54:49 | intent : Intent [android.content.Intent.extras, ] : String | provenance | | -| TestStartBroadcastReceiverToIntent.java:53:13:53:18 | intent [post update] : Intent [android.content.Intent.extras, ] : String | TestStartBroadcastReceiverToIntent.java:54:44:54:49 | intent : Intent [android.content.Intent.extras, ] : String | provenance | | -| TestStartBroadcastReceiverToIntent.java:53:13:53:18 | intent [post update] : Intent [android.content.Intent.extras, ] : String | TestStartBroadcastReceiverToIntent.java:54:44:54:49 | intent : Intent [android.content.Intent.extras, ] : String | provenance | | -| TestStartBroadcastReceiverToIntent.java:53:37:53:74 | (...)... : String | TestStartBroadcastReceiverToIntent.java:53:13:53:18 | intent [post update] : Intent [android.content.Intent.extras, ] : String | provenance | MaD:49 | -| TestStartBroadcastReceiverToIntent.java:53:37:53:74 | (...)... : String | TestStartBroadcastReceiverToIntent.java:53:13:53:18 | intent [post update] : Intent [android.content.Intent.extras, ] : String | provenance | MaD:49 | | TestStartBroadcastReceiverToIntent.java:53:37:53:74 | (...)... : String | TestStartBroadcastReceiverToIntent.java:53:13:53:18 | intent [post update] : Intent [android.content.Intent.extras, ] : String | provenance | MaD:49 | | TestStartBroadcastReceiverToIntent.java:53:46:53:74 | source(...) : Object | TestStartBroadcastReceiverToIntent.java:53:37:53:74 | (...)... : String | provenance | | | TestStartBroadcastReceiverToIntent.java:54:44:54:49 | intent : Intent [android.content.Intent.extras, ] : String | TestStartBroadcastReceiverToIntent.java:81:48:81:60 | intent : Intent [android.content.Intent.extras, ] : String | provenance | | -| TestStartBroadcastReceiverToIntent.java:54:44:54:49 | intent : Intent [android.content.Intent.extras, ] : String | TestStartBroadcastReceiverToIntent.java:81:48:81:60 | intent : Intent [android.content.Intent.extras, ] : String | provenance | | -| TestStartBroadcastReceiverToIntent.java:54:44:54:49 | intent : Intent [android.content.Intent.extras, ] : String | TestStartBroadcastReceiverToIntent.java:81:48:81:60 | intent : Intent [android.content.Intent.extras, ] : String | provenance | | | TestStartBroadcastReceiverToIntent.java:58:13:58:18 | intent [post update] : Intent [android.content.Intent.extras, ] : String | TestStartBroadcastReceiverToIntent.java:59:50:59:55 | intent : Intent [android.content.Intent.extras, ] : String | provenance | | -| TestStartBroadcastReceiverToIntent.java:58:13:58:18 | intent [post update] : Intent [android.content.Intent.extras, ] : String | TestStartBroadcastReceiverToIntent.java:59:50:59:55 | intent : Intent [android.content.Intent.extras, ] : String | provenance | | -| TestStartBroadcastReceiverToIntent.java:58:13:58:18 | intent [post update] : Intent [android.content.Intent.extras, ] : String | TestStartBroadcastReceiverToIntent.java:59:50:59:55 | intent : Intent [android.content.Intent.extras, ] : String | provenance | | -| TestStartBroadcastReceiverToIntent.java:58:37:58:82 | (...)... : String | TestStartBroadcastReceiverToIntent.java:58:13:58:18 | intent [post update] : Intent [android.content.Intent.extras, ] : String | provenance | MaD:49 | -| TestStartBroadcastReceiverToIntent.java:58:37:58:82 | (...)... : String | TestStartBroadcastReceiverToIntent.java:58:13:58:18 | intent [post update] : Intent [android.content.Intent.extras, ] : String | provenance | MaD:49 | | TestStartBroadcastReceiverToIntent.java:58:37:58:82 | (...)... : String | TestStartBroadcastReceiverToIntent.java:58:13:58:18 | intent [post update] : Intent [android.content.Intent.extras, ] : String | provenance | MaD:49 | | TestStartBroadcastReceiverToIntent.java:58:46:58:82 | source(...) : Object | TestStartBroadcastReceiverToIntent.java:58:37:58:82 | (...)... : String | provenance | | | TestStartBroadcastReceiverToIntent.java:59:50:59:55 | intent : Intent [android.content.Intent.extras, ] : String | TestStartBroadcastReceiverToIntent.java:81:48:81:60 | intent : Intent [android.content.Intent.extras, ] : String | provenance | | -| TestStartBroadcastReceiverToIntent.java:59:50:59:55 | intent : Intent [android.content.Intent.extras, ] : String | TestStartBroadcastReceiverToIntent.java:81:48:81:60 | intent : Intent [android.content.Intent.extras, ] : String | provenance | | -| TestStartBroadcastReceiverToIntent.java:59:50:59:55 | intent : Intent [android.content.Intent.extras, ] : String | TestStartBroadcastReceiverToIntent.java:81:48:81:60 | intent : Intent [android.content.Intent.extras, ] : String | provenance | | | TestStartBroadcastReceiverToIntent.java:65:13:65:18 | intent [post update] : Intent [android.content.Intent.extras, ] : String | TestStartBroadcastReceiverToIntent.java:66:31:66:36 | intent : Intent [android.content.Intent.extras, ] : String | provenance | | -| TestStartBroadcastReceiverToIntent.java:65:13:65:18 | intent [post update] : Intent [android.content.Intent.extras, ] : String | TestStartBroadcastReceiverToIntent.java:66:31:66:36 | intent : Intent [android.content.Intent.extras, ] : String | provenance | | -| TestStartBroadcastReceiverToIntent.java:65:13:65:18 | intent [post update] : Intent [android.content.Intent.extras, ] : String | TestStartBroadcastReceiverToIntent.java:66:31:66:36 | intent : Intent [android.content.Intent.extras, ] : String | provenance | | -| TestStartBroadcastReceiverToIntent.java:65:37:65:60 | (...)... : String | TestStartBroadcastReceiverToIntent.java:65:13:65:18 | intent [post update] : Intent [android.content.Intent.extras, ] : String | provenance | MaD:49 | -| TestStartBroadcastReceiverToIntent.java:65:37:65:60 | (...)... : String | TestStartBroadcastReceiverToIntent.java:65:13:65:18 | intent [post update] : Intent [android.content.Intent.extras, ] : String | provenance | MaD:49 | | TestStartBroadcastReceiverToIntent.java:65:37:65:60 | (...)... : String | TestStartBroadcastReceiverToIntent.java:65:13:65:18 | intent [post update] : Intent [android.content.Intent.extras, ] : String | provenance | MaD:49 | | TestStartBroadcastReceiverToIntent.java:65:46:65:60 | source(...) : Object | TestStartBroadcastReceiverToIntent.java:65:37:65:60 | (...)... : String | provenance | | | TestStartBroadcastReceiverToIntent.java:66:31:66:36 | intent : Intent [android.content.Intent.extras, ] : String | TestStartBroadcastReceiverToIntent.java:81:48:81:60 | intent : Intent [android.content.Intent.extras, ] : String | provenance | | -| TestStartBroadcastReceiverToIntent.java:66:31:66:36 | intent : Intent [android.content.Intent.extras, ] : String | TestStartBroadcastReceiverToIntent.java:81:48:81:60 | intent : Intent [android.content.Intent.extras, ] : String | provenance | | -| TestStartBroadcastReceiverToIntent.java:66:31:66:36 | intent : Intent [android.content.Intent.extras, ] : String | TestStartBroadcastReceiverToIntent.java:81:48:81:60 | intent : Intent [android.content.Intent.extras, ] : String | provenance | | -| TestStartBroadcastReceiverToIntent.java:81:48:81:60 | intent : Intent [android.content.Intent.extras, ] : String | TestStartBroadcastReceiverToIntent.java:82:18:82:23 | intent : Intent [android.content.Intent.extras, ] : String | provenance | | -| TestStartBroadcastReceiverToIntent.java:81:48:81:60 | intent : Intent [android.content.Intent.extras, ] : String | TestStartBroadcastReceiverToIntent.java:82:18:82:23 | intent : Intent [android.content.Intent.extras, ] : String | provenance | | | TestStartBroadcastReceiverToIntent.java:81:48:81:60 | intent : Intent [android.content.Intent.extras, ] : String | TestStartBroadcastReceiverToIntent.java:82:18:82:23 | intent : Intent [android.content.Intent.extras, ] : String | provenance | | | TestStartBroadcastReceiverToIntent.java:82:18:82:23 | intent : Intent [android.content.Intent.extras, ] : String | TestStartBroadcastReceiverToIntent.java:82:18:82:46 | getStringExtra(...) | provenance | MaD:43 | -| TestStartBroadcastReceiverToIntent.java:82:18:82:23 | intent : Intent [android.content.Intent.extras, ] : String | TestStartBroadcastReceiverToIntent.java:82:18:82:46 | getStringExtra(...) | provenance | MaD:43 | -| TestStartBroadcastReceiverToIntent.java:82:18:82:23 | intent : Intent [android.content.Intent.extras, ] : String | TestStartBroadcastReceiverToIntent.java:82:18:82:46 | getStringExtra(...) | provenance | MaD:43 | | TestStartServiceToIntent.java:19:13:19:18 | intent [post update] : Intent [android.content.Intent.extras, ] : String | TestStartServiceToIntent.java:20:29:20:34 | intent : Intent [android.content.Intent.extras, ] : String | provenance | | -| TestStartServiceToIntent.java:19:13:19:18 | intent [post update] : Intent [android.content.Intent.extras, ] : String | TestStartServiceToIntent.java:20:29:20:34 | intent : Intent [android.content.Intent.extras, ] : String | provenance | | -| TestStartServiceToIntent.java:19:13:19:18 | intent [post update] : Intent [android.content.Intent.extras, ] : String | TestStartServiceToIntent.java:20:29:20:34 | intent : Intent [android.content.Intent.extras, ] : String | provenance | | -| TestStartServiceToIntent.java:19:37:19:59 | (...)... : String | TestStartServiceToIntent.java:19:13:19:18 | intent [post update] : Intent [android.content.Intent.extras, ] : String | provenance | MaD:49 | -| TestStartServiceToIntent.java:19:37:19:59 | (...)... : String | TestStartServiceToIntent.java:19:13:19:18 | intent [post update] : Intent [android.content.Intent.extras, ] : String | provenance | MaD:49 | | TestStartServiceToIntent.java:19:37:19:59 | (...)... : String | TestStartServiceToIntent.java:19:13:19:18 | intent [post update] : Intent [android.content.Intent.extras, ] : String | provenance | MaD:49 | | TestStartServiceToIntent.java:19:46:19:59 | source(...) : Object | TestStartServiceToIntent.java:19:37:19:59 | (...)... : String | provenance | | | TestStartServiceToIntent.java:20:29:20:34 | intent : Intent [android.content.Intent.extras, ] : String | TestStartServiceToIntent.java:62:29:62:41 | intent : Intent [android.content.Intent.extras, ] : String | provenance | | -| TestStartServiceToIntent.java:20:29:20:34 | intent : Intent [android.content.Intent.extras, ] : String | TestStartServiceToIntent.java:62:29:62:41 | intent : Intent [android.content.Intent.extras, ] : String | provenance | | -| TestStartServiceToIntent.java:20:29:20:34 | intent : Intent [android.content.Intent.extras, ] : String | TestStartServiceToIntent.java:62:29:62:41 | intent : Intent [android.content.Intent.extras, ] : String | provenance | | -| TestStartServiceToIntent.java:20:29:20:34 | intent : Intent [android.content.Intent.extras, ] : String | TestStartServiceToIntent.java:67:35:67:47 | intent : Intent [android.content.Intent.extras, ] : String | provenance | | -| TestStartServiceToIntent.java:20:29:20:34 | intent : Intent [android.content.Intent.extras, ] : String | TestStartServiceToIntent.java:67:35:67:47 | intent : Intent [android.content.Intent.extras, ] : String | provenance | | | TestStartServiceToIntent.java:20:29:20:34 | intent : Intent [android.content.Intent.extras, ] : String | TestStartServiceToIntent.java:67:35:67:47 | intent : Intent [android.content.Intent.extras, ] : String | provenance | | | TestStartServiceToIntent.java:20:29:20:34 | intent : Intent [android.content.Intent.extras, ] : String | TestStartServiceToIntent.java:73:31:73:43 | intent : Intent [android.content.Intent.extras, ] : String | provenance | | -| TestStartServiceToIntent.java:20:29:20:34 | intent : Intent [android.content.Intent.extras, ] : String | TestStartServiceToIntent.java:73:31:73:43 | intent : Intent [android.content.Intent.extras, ] : String | provenance | | -| TestStartServiceToIntent.java:20:29:20:34 | intent : Intent [android.content.Intent.extras, ] : String | TestStartServiceToIntent.java:73:31:73:43 | intent : Intent [android.content.Intent.extras, ] : String | provenance | | -| TestStartServiceToIntent.java:20:29:20:34 | intent : Intent [android.content.Intent.extras, ] : String | TestStartServiceToIntent.java:79:33:79:45 | intent : Intent [android.content.Intent.extras, ] : String | provenance | | -| TestStartServiceToIntent.java:20:29:20:34 | intent : Intent [android.content.Intent.extras, ] : String | TestStartServiceToIntent.java:79:33:79:45 | intent : Intent [android.content.Intent.extras, ] : String | provenance | | | TestStartServiceToIntent.java:20:29:20:34 | intent : Intent [android.content.Intent.extras, ] : String | TestStartServiceToIntent.java:79:33:79:45 | intent : Intent [android.content.Intent.extras, ] : String | provenance | | | TestStartServiceToIntent.java:20:29:20:34 | intent : Intent [android.content.Intent.extras, ] : String | TestStartServiceToIntent.java:85:30:85:42 | intent : Intent [android.content.Intent.extras, ] : String | provenance | | -| TestStartServiceToIntent.java:20:29:20:34 | intent : Intent [android.content.Intent.extras, ] : String | TestStartServiceToIntent.java:85:30:85:42 | intent : Intent [android.content.Intent.extras, ] : String | provenance | | -| TestStartServiceToIntent.java:20:29:20:34 | intent : Intent [android.content.Intent.extras, ] : String | TestStartServiceToIntent.java:85:30:85:42 | intent : Intent [android.content.Intent.extras, ] : String | provenance | | -| TestStartServiceToIntent.java:20:29:20:34 | intent : Intent [android.content.Intent.extras, ] : String | TestStartServiceToIntent.java:90:35:90:47 | intent : Intent [android.content.Intent.extras, ] : String | provenance | | -| TestStartServiceToIntent.java:20:29:20:34 | intent : Intent [android.content.Intent.extras, ] : String | TestStartServiceToIntent.java:90:35:90:47 | intent : Intent [android.content.Intent.extras, ] : String | provenance | | | TestStartServiceToIntent.java:20:29:20:34 | intent : Intent [android.content.Intent.extras, ] : String | TestStartServiceToIntent.java:90:35:90:47 | intent : Intent [android.content.Intent.extras, ] : String | provenance | | | TestStartServiceToIntent.java:24:13:24:18 | intent [post update] : Intent [android.content.Intent.extras, ] : String | TestStartServiceToIntent.java:25:35:25:40 | intent : Intent [android.content.Intent.extras, ] : String | provenance | | -| TestStartServiceToIntent.java:24:13:24:18 | intent [post update] : Intent [android.content.Intent.extras, ] : String | TestStartServiceToIntent.java:25:35:25:40 | intent : Intent [android.content.Intent.extras, ] : String | provenance | | -| TestStartServiceToIntent.java:24:13:24:18 | intent [post update] : Intent [android.content.Intent.extras, ] : String | TestStartServiceToIntent.java:25:35:25:40 | intent : Intent [android.content.Intent.extras, ] : String | provenance | | -| TestStartServiceToIntent.java:24:37:24:67 | (...)... : String | TestStartServiceToIntent.java:24:13:24:18 | intent [post update] : Intent [android.content.Intent.extras, ] : String | provenance | MaD:49 | -| TestStartServiceToIntent.java:24:37:24:67 | (...)... : String | TestStartServiceToIntent.java:24:13:24:18 | intent [post update] : Intent [android.content.Intent.extras, ] : String | provenance | MaD:49 | | TestStartServiceToIntent.java:24:37:24:67 | (...)... : String | TestStartServiceToIntent.java:24:13:24:18 | intent [post update] : Intent [android.content.Intent.extras, ] : String | provenance | MaD:49 | | TestStartServiceToIntent.java:24:46:24:67 | source(...) : Object | TestStartServiceToIntent.java:24:37:24:67 | (...)... : String | provenance | | | TestStartServiceToIntent.java:25:35:25:40 | intent : Intent [android.content.Intent.extras, ] : String | TestStartServiceToIntent.java:62:29:62:41 | intent : Intent [android.content.Intent.extras, ] : String | provenance | | -| TestStartServiceToIntent.java:25:35:25:40 | intent : Intent [android.content.Intent.extras, ] : String | TestStartServiceToIntent.java:62:29:62:41 | intent : Intent [android.content.Intent.extras, ] : String | provenance | | -| TestStartServiceToIntent.java:25:35:25:40 | intent : Intent [android.content.Intent.extras, ] : String | TestStartServiceToIntent.java:62:29:62:41 | intent : Intent [android.content.Intent.extras, ] : String | provenance | | -| TestStartServiceToIntent.java:25:35:25:40 | intent : Intent [android.content.Intent.extras, ] : String | TestStartServiceToIntent.java:67:35:67:47 | intent : Intent [android.content.Intent.extras, ] : String | provenance | | -| TestStartServiceToIntent.java:25:35:25:40 | intent : Intent [android.content.Intent.extras, ] : String | TestStartServiceToIntent.java:67:35:67:47 | intent : Intent [android.content.Intent.extras, ] : String | provenance | | | TestStartServiceToIntent.java:25:35:25:40 | intent : Intent [android.content.Intent.extras, ] : String | TestStartServiceToIntent.java:67:35:67:47 | intent : Intent [android.content.Intent.extras, ] : String | provenance | | | TestStartServiceToIntent.java:25:35:25:40 | intent : Intent [android.content.Intent.extras, ] : String | TestStartServiceToIntent.java:73:31:73:43 | intent : Intent [android.content.Intent.extras, ] : String | provenance | | -| TestStartServiceToIntent.java:25:35:25:40 | intent : Intent [android.content.Intent.extras, ] : String | TestStartServiceToIntent.java:73:31:73:43 | intent : Intent [android.content.Intent.extras, ] : String | provenance | | -| TestStartServiceToIntent.java:25:35:25:40 | intent : Intent [android.content.Intent.extras, ] : String | TestStartServiceToIntent.java:73:31:73:43 | intent : Intent [android.content.Intent.extras, ] : String | provenance | | -| TestStartServiceToIntent.java:25:35:25:40 | intent : Intent [android.content.Intent.extras, ] : String | TestStartServiceToIntent.java:79:33:79:45 | intent : Intent [android.content.Intent.extras, ] : String | provenance | | -| TestStartServiceToIntent.java:25:35:25:40 | intent : Intent [android.content.Intent.extras, ] : String | TestStartServiceToIntent.java:79:33:79:45 | intent : Intent [android.content.Intent.extras, ] : String | provenance | | | TestStartServiceToIntent.java:25:35:25:40 | intent : Intent [android.content.Intent.extras, ] : String | TestStartServiceToIntent.java:79:33:79:45 | intent : Intent [android.content.Intent.extras, ] : String | provenance | | | TestStartServiceToIntent.java:25:35:25:40 | intent : Intent [android.content.Intent.extras, ] : String | TestStartServiceToIntent.java:85:30:85:42 | intent : Intent [android.content.Intent.extras, ] : String | provenance | | -| TestStartServiceToIntent.java:25:35:25:40 | intent : Intent [android.content.Intent.extras, ] : String | TestStartServiceToIntent.java:85:30:85:42 | intent : Intent [android.content.Intent.extras, ] : String | provenance | | -| TestStartServiceToIntent.java:25:35:25:40 | intent : Intent [android.content.Intent.extras, ] : String | TestStartServiceToIntent.java:85:30:85:42 | intent : Intent [android.content.Intent.extras, ] : String | provenance | | -| TestStartServiceToIntent.java:25:35:25:40 | intent : Intent [android.content.Intent.extras, ] : String | TestStartServiceToIntent.java:90:35:90:47 | intent : Intent [android.content.Intent.extras, ] : String | provenance | | -| TestStartServiceToIntent.java:25:35:25:40 | intent : Intent [android.content.Intent.extras, ] : String | TestStartServiceToIntent.java:90:35:90:47 | intent : Intent [android.content.Intent.extras, ] : String | provenance | | | TestStartServiceToIntent.java:25:35:25:40 | intent : Intent [android.content.Intent.extras, ] : String | TestStartServiceToIntent.java:90:35:90:47 | intent : Intent [android.content.Intent.extras, ] : String | provenance | | | TestStartServiceToIntent.java:29:13:29:18 | intent [post update] : Intent [android.content.Intent.extras, ] : String | TestStartServiceToIntent.java:30:37:30:42 | intent : Intent [android.content.Intent.extras, ] : String | provenance | | -| TestStartServiceToIntent.java:29:13:29:18 | intent [post update] : Intent [android.content.Intent.extras, ] : String | TestStartServiceToIntent.java:30:37:30:42 | intent : Intent [android.content.Intent.extras, ] : String | provenance | | -| TestStartServiceToIntent.java:29:13:29:18 | intent [post update] : Intent [android.content.Intent.extras, ] : String | TestStartServiceToIntent.java:30:37:30:42 | intent : Intent [android.content.Intent.extras, ] : String | provenance | | -| TestStartServiceToIntent.java:29:37:29:68 | (...)... : String | TestStartServiceToIntent.java:29:13:29:18 | intent [post update] : Intent [android.content.Intent.extras, ] : String | provenance | MaD:49 | -| TestStartServiceToIntent.java:29:37:29:68 | (...)... : String | TestStartServiceToIntent.java:29:13:29:18 | intent [post update] : Intent [android.content.Intent.extras, ] : String | provenance | MaD:49 | | TestStartServiceToIntent.java:29:37:29:68 | (...)... : String | TestStartServiceToIntent.java:29:13:29:18 | intent [post update] : Intent [android.content.Intent.extras, ] : String | provenance | MaD:49 | | TestStartServiceToIntent.java:29:46:29:68 | source(...) : Object | TestStartServiceToIntent.java:29:37:29:68 | (...)... : String | provenance | | | TestStartServiceToIntent.java:30:37:30:42 | intent : Intent [android.content.Intent.extras, ] : String | TestStartServiceToIntent.java:62:29:62:41 | intent : Intent [android.content.Intent.extras, ] : String | provenance | | -| TestStartServiceToIntent.java:30:37:30:42 | intent : Intent [android.content.Intent.extras, ] : String | TestStartServiceToIntent.java:62:29:62:41 | intent : Intent [android.content.Intent.extras, ] : String | provenance | | -| TestStartServiceToIntent.java:30:37:30:42 | intent : Intent [android.content.Intent.extras, ] : String | TestStartServiceToIntent.java:62:29:62:41 | intent : Intent [android.content.Intent.extras, ] : String | provenance | | -| TestStartServiceToIntent.java:30:37:30:42 | intent : Intent [android.content.Intent.extras, ] : String | TestStartServiceToIntent.java:67:35:67:47 | intent : Intent [android.content.Intent.extras, ] : String | provenance | | -| TestStartServiceToIntent.java:30:37:30:42 | intent : Intent [android.content.Intent.extras, ] : String | TestStartServiceToIntent.java:67:35:67:47 | intent : Intent [android.content.Intent.extras, ] : String | provenance | | | TestStartServiceToIntent.java:30:37:30:42 | intent : Intent [android.content.Intent.extras, ] : String | TestStartServiceToIntent.java:67:35:67:47 | intent : Intent [android.content.Intent.extras, ] : String | provenance | | | TestStartServiceToIntent.java:30:37:30:42 | intent : Intent [android.content.Intent.extras, ] : String | TestStartServiceToIntent.java:73:31:73:43 | intent : Intent [android.content.Intent.extras, ] : String | provenance | | -| TestStartServiceToIntent.java:30:37:30:42 | intent : Intent [android.content.Intent.extras, ] : String | TestStartServiceToIntent.java:73:31:73:43 | intent : Intent [android.content.Intent.extras, ] : String | provenance | | -| TestStartServiceToIntent.java:30:37:30:42 | intent : Intent [android.content.Intent.extras, ] : String | TestStartServiceToIntent.java:73:31:73:43 | intent : Intent [android.content.Intent.extras, ] : String | provenance | | -| TestStartServiceToIntent.java:30:37:30:42 | intent : Intent [android.content.Intent.extras, ] : String | TestStartServiceToIntent.java:79:33:79:45 | intent : Intent [android.content.Intent.extras, ] : String | provenance | | -| TestStartServiceToIntent.java:30:37:30:42 | intent : Intent [android.content.Intent.extras, ] : String | TestStartServiceToIntent.java:79:33:79:45 | intent : Intent [android.content.Intent.extras, ] : String | provenance | | | TestStartServiceToIntent.java:30:37:30:42 | intent : Intent [android.content.Intent.extras, ] : String | TestStartServiceToIntent.java:79:33:79:45 | intent : Intent [android.content.Intent.extras, ] : String | provenance | | | TestStartServiceToIntent.java:30:37:30:42 | intent : Intent [android.content.Intent.extras, ] : String | TestStartServiceToIntent.java:85:30:85:42 | intent : Intent [android.content.Intent.extras, ] : String | provenance | | -| TestStartServiceToIntent.java:30:37:30:42 | intent : Intent [android.content.Intent.extras, ] : String | TestStartServiceToIntent.java:85:30:85:42 | intent : Intent [android.content.Intent.extras, ] : String | provenance | | -| TestStartServiceToIntent.java:30:37:30:42 | intent : Intent [android.content.Intent.extras, ] : String | TestStartServiceToIntent.java:85:30:85:42 | intent : Intent [android.content.Intent.extras, ] : String | provenance | | -| TestStartServiceToIntent.java:30:37:30:42 | intent : Intent [android.content.Intent.extras, ] : String | TestStartServiceToIntent.java:90:35:90:47 | intent : Intent [android.content.Intent.extras, ] : String | provenance | | -| TestStartServiceToIntent.java:30:37:30:42 | intent : Intent [android.content.Intent.extras, ] : String | TestStartServiceToIntent.java:90:35:90:47 | intent : Intent [android.content.Intent.extras, ] : String | provenance | | | TestStartServiceToIntent.java:30:37:30:42 | intent : Intent [android.content.Intent.extras, ] : String | TestStartServiceToIntent.java:90:35:90:47 | intent : Intent [android.content.Intent.extras, ] : String | provenance | | | TestStartServiceToIntent.java:34:13:34:18 | intent [post update] : Intent [android.content.Intent.extras, ] : String | TestStartServiceToIntent.java:35:30:35:35 | intent : Intent [android.content.Intent.extras, ] : String | provenance | | -| TestStartServiceToIntent.java:34:13:34:18 | intent [post update] : Intent [android.content.Intent.extras, ] : String | TestStartServiceToIntent.java:35:30:35:35 | intent : Intent [android.content.Intent.extras, ] : String | provenance | | -| TestStartServiceToIntent.java:34:13:34:18 | intent [post update] : Intent [android.content.Intent.extras, ] : String | TestStartServiceToIntent.java:35:30:35:35 | intent : Intent [android.content.Intent.extras, ] : String | provenance | | -| TestStartServiceToIntent.java:34:37:34:60 | (...)... : String | TestStartServiceToIntent.java:34:13:34:18 | intent [post update] : Intent [android.content.Intent.extras, ] : String | provenance | MaD:49 | -| TestStartServiceToIntent.java:34:37:34:60 | (...)... : String | TestStartServiceToIntent.java:34:13:34:18 | intent [post update] : Intent [android.content.Intent.extras, ] : String | provenance | MaD:49 | | TestStartServiceToIntent.java:34:37:34:60 | (...)... : String | TestStartServiceToIntent.java:34:13:34:18 | intent [post update] : Intent [android.content.Intent.extras, ] : String | provenance | MaD:49 | | TestStartServiceToIntent.java:34:46:34:60 | source(...) : Object | TestStartServiceToIntent.java:34:37:34:60 | (...)... : String | provenance | | | TestStartServiceToIntent.java:35:30:35:35 | intent : Intent [android.content.Intent.extras, ] : String | TestStartServiceToIntent.java:62:29:62:41 | intent : Intent [android.content.Intent.extras, ] : String | provenance | | -| TestStartServiceToIntent.java:35:30:35:35 | intent : Intent [android.content.Intent.extras, ] : String | TestStartServiceToIntent.java:62:29:62:41 | intent : Intent [android.content.Intent.extras, ] : String | provenance | | -| TestStartServiceToIntent.java:35:30:35:35 | intent : Intent [android.content.Intent.extras, ] : String | TestStartServiceToIntent.java:62:29:62:41 | intent : Intent [android.content.Intent.extras, ] : String | provenance | | -| TestStartServiceToIntent.java:35:30:35:35 | intent : Intent [android.content.Intent.extras, ] : String | TestStartServiceToIntent.java:67:35:67:47 | intent : Intent [android.content.Intent.extras, ] : String | provenance | | -| TestStartServiceToIntent.java:35:30:35:35 | intent : Intent [android.content.Intent.extras, ] : String | TestStartServiceToIntent.java:67:35:67:47 | intent : Intent [android.content.Intent.extras, ] : String | provenance | | | TestStartServiceToIntent.java:35:30:35:35 | intent : Intent [android.content.Intent.extras, ] : String | TestStartServiceToIntent.java:67:35:67:47 | intent : Intent [android.content.Intent.extras, ] : String | provenance | | | TestStartServiceToIntent.java:35:30:35:35 | intent : Intent [android.content.Intent.extras, ] : String | TestStartServiceToIntent.java:73:31:73:43 | intent : Intent [android.content.Intent.extras, ] : String | provenance | | -| TestStartServiceToIntent.java:35:30:35:35 | intent : Intent [android.content.Intent.extras, ] : String | TestStartServiceToIntent.java:73:31:73:43 | intent : Intent [android.content.Intent.extras, ] : String | provenance | | -| TestStartServiceToIntent.java:35:30:35:35 | intent : Intent [android.content.Intent.extras, ] : String | TestStartServiceToIntent.java:73:31:73:43 | intent : Intent [android.content.Intent.extras, ] : String | provenance | | -| TestStartServiceToIntent.java:35:30:35:35 | intent : Intent [android.content.Intent.extras, ] : String | TestStartServiceToIntent.java:79:33:79:45 | intent : Intent [android.content.Intent.extras, ] : String | provenance | | -| TestStartServiceToIntent.java:35:30:35:35 | intent : Intent [android.content.Intent.extras, ] : String | TestStartServiceToIntent.java:79:33:79:45 | intent : Intent [android.content.Intent.extras, ] : String | provenance | | | TestStartServiceToIntent.java:35:30:35:35 | intent : Intent [android.content.Intent.extras, ] : String | TestStartServiceToIntent.java:79:33:79:45 | intent : Intent [android.content.Intent.extras, ] : String | provenance | | | TestStartServiceToIntent.java:35:30:35:35 | intent : Intent [android.content.Intent.extras, ] : String | TestStartServiceToIntent.java:85:30:85:42 | intent : Intent [android.content.Intent.extras, ] : String | provenance | | -| TestStartServiceToIntent.java:35:30:35:35 | intent : Intent [android.content.Intent.extras, ] : String | TestStartServiceToIntent.java:85:30:85:42 | intent : Intent [android.content.Intent.extras, ] : String | provenance | | -| TestStartServiceToIntent.java:35:30:35:35 | intent : Intent [android.content.Intent.extras, ] : String | TestStartServiceToIntent.java:85:30:85:42 | intent : Intent [android.content.Intent.extras, ] : String | provenance | | -| TestStartServiceToIntent.java:35:30:35:35 | intent : Intent [android.content.Intent.extras, ] : String | TestStartServiceToIntent.java:90:35:90:47 | intent : Intent [android.content.Intent.extras, ] : String | provenance | | -| TestStartServiceToIntent.java:35:30:35:35 | intent : Intent [android.content.Intent.extras, ] : String | TestStartServiceToIntent.java:90:35:90:47 | intent : Intent [android.content.Intent.extras, ] : String | provenance | | | TestStartServiceToIntent.java:35:30:35:35 | intent : Intent [android.content.Intent.extras, ] : String | TestStartServiceToIntent.java:90:35:90:47 | intent : Intent [android.content.Intent.extras, ] : String | provenance | | | TestStartServiceToIntent.java:39:13:39:18 | intent [post update] : Intent [android.content.Intent.extras, ] : String | TestStartServiceToIntent.java:40:40:40:45 | intent : Intent [android.content.Intent.extras, ] : String | provenance | | -| TestStartServiceToIntent.java:39:13:39:18 | intent [post update] : Intent [android.content.Intent.extras, ] : String | TestStartServiceToIntent.java:40:40:40:45 | intent : Intent [android.content.Intent.extras, ] : String | provenance | | -| TestStartServiceToIntent.java:39:13:39:18 | intent [post update] : Intent [android.content.Intent.extras, ] : String | TestStartServiceToIntent.java:40:40:40:45 | intent : Intent [android.content.Intent.extras, ] : String | provenance | | -| TestStartServiceToIntent.java:39:37:39:71 | (...)... : String | TestStartServiceToIntent.java:39:13:39:18 | intent [post update] : Intent [android.content.Intent.extras, ] : String | provenance | MaD:49 | -| TestStartServiceToIntent.java:39:37:39:71 | (...)... : String | TestStartServiceToIntent.java:39:13:39:18 | intent [post update] : Intent [android.content.Intent.extras, ] : String | provenance | MaD:49 | | TestStartServiceToIntent.java:39:37:39:71 | (...)... : String | TestStartServiceToIntent.java:39:13:39:18 | intent [post update] : Intent [android.content.Intent.extras, ] : String | provenance | MaD:49 | | TestStartServiceToIntent.java:39:46:39:71 | source(...) : Object | TestStartServiceToIntent.java:39:37:39:71 | (...)... : String | provenance | | | TestStartServiceToIntent.java:40:40:40:45 | intent : Intent [android.content.Intent.extras, ] : String | TestStartServiceToIntent.java:62:29:62:41 | intent : Intent [android.content.Intent.extras, ] : String | provenance | | -| TestStartServiceToIntent.java:40:40:40:45 | intent : Intent [android.content.Intent.extras, ] : String | TestStartServiceToIntent.java:62:29:62:41 | intent : Intent [android.content.Intent.extras, ] : String | provenance | | -| TestStartServiceToIntent.java:40:40:40:45 | intent : Intent [android.content.Intent.extras, ] : String | TestStartServiceToIntent.java:62:29:62:41 | intent : Intent [android.content.Intent.extras, ] : String | provenance | | -| TestStartServiceToIntent.java:40:40:40:45 | intent : Intent [android.content.Intent.extras, ] : String | TestStartServiceToIntent.java:67:35:67:47 | intent : Intent [android.content.Intent.extras, ] : String | provenance | | -| TestStartServiceToIntent.java:40:40:40:45 | intent : Intent [android.content.Intent.extras, ] : String | TestStartServiceToIntent.java:67:35:67:47 | intent : Intent [android.content.Intent.extras, ] : String | provenance | | | TestStartServiceToIntent.java:40:40:40:45 | intent : Intent [android.content.Intent.extras, ] : String | TestStartServiceToIntent.java:67:35:67:47 | intent : Intent [android.content.Intent.extras, ] : String | provenance | | | TestStartServiceToIntent.java:40:40:40:45 | intent : Intent [android.content.Intent.extras, ] : String | TestStartServiceToIntent.java:73:31:73:43 | intent : Intent [android.content.Intent.extras, ] : String | provenance | | -| TestStartServiceToIntent.java:40:40:40:45 | intent : Intent [android.content.Intent.extras, ] : String | TestStartServiceToIntent.java:73:31:73:43 | intent : Intent [android.content.Intent.extras, ] : String | provenance | | -| TestStartServiceToIntent.java:40:40:40:45 | intent : Intent [android.content.Intent.extras, ] : String | TestStartServiceToIntent.java:73:31:73:43 | intent : Intent [android.content.Intent.extras, ] : String | provenance | | -| TestStartServiceToIntent.java:40:40:40:45 | intent : Intent [android.content.Intent.extras, ] : String | TestStartServiceToIntent.java:79:33:79:45 | intent : Intent [android.content.Intent.extras, ] : String | provenance | | -| TestStartServiceToIntent.java:40:40:40:45 | intent : Intent [android.content.Intent.extras, ] : String | TestStartServiceToIntent.java:79:33:79:45 | intent : Intent [android.content.Intent.extras, ] : String | provenance | | | TestStartServiceToIntent.java:40:40:40:45 | intent : Intent [android.content.Intent.extras, ] : String | TestStartServiceToIntent.java:79:33:79:45 | intent : Intent [android.content.Intent.extras, ] : String | provenance | | | TestStartServiceToIntent.java:40:40:40:45 | intent : Intent [android.content.Intent.extras, ] : String | TestStartServiceToIntent.java:85:30:85:42 | intent : Intent [android.content.Intent.extras, ] : String | provenance | | -| TestStartServiceToIntent.java:40:40:40:45 | intent : Intent [android.content.Intent.extras, ] : String | TestStartServiceToIntent.java:85:30:85:42 | intent : Intent [android.content.Intent.extras, ] : String | provenance | | -| TestStartServiceToIntent.java:40:40:40:45 | intent : Intent [android.content.Intent.extras, ] : String | TestStartServiceToIntent.java:85:30:85:42 | intent : Intent [android.content.Intent.extras, ] : String | provenance | | -| TestStartServiceToIntent.java:40:40:40:45 | intent : Intent [android.content.Intent.extras, ] : String | TestStartServiceToIntent.java:90:35:90:47 | intent : Intent [android.content.Intent.extras, ] : String | provenance | | -| TestStartServiceToIntent.java:40:40:40:45 | intent : Intent [android.content.Intent.extras, ] : String | TestStartServiceToIntent.java:90:35:90:47 | intent : Intent [android.content.Intent.extras, ] : String | provenance | | | TestStartServiceToIntent.java:40:40:40:45 | intent : Intent [android.content.Intent.extras, ] : String | TestStartServiceToIntent.java:90:35:90:47 | intent : Intent [android.content.Intent.extras, ] : String | provenance | | | TestStartServiceToIntent.java:46:13:46:18 | intent [post update] : Intent [android.content.Intent.extras, ] : String | TestStartServiceToIntent.java:47:30:47:35 | intent : Intent [android.content.Intent.extras, ] : String | provenance | | -| TestStartServiceToIntent.java:46:13:46:18 | intent [post update] : Intent [android.content.Intent.extras, ] : String | TestStartServiceToIntent.java:47:30:47:35 | intent : Intent [android.content.Intent.extras, ] : String | provenance | | -| TestStartServiceToIntent.java:46:13:46:18 | intent [post update] : Intent [android.content.Intent.extras, ] : String | TestStartServiceToIntent.java:47:30:47:35 | intent : Intent [android.content.Intent.extras, ] : String | provenance | | -| TestStartServiceToIntent.java:46:37:46:60 | (...)... : String | TestStartServiceToIntent.java:46:13:46:18 | intent [post update] : Intent [android.content.Intent.extras, ] : String | provenance | MaD:49 | -| TestStartServiceToIntent.java:46:37:46:60 | (...)... : String | TestStartServiceToIntent.java:46:13:46:18 | intent [post update] : Intent [android.content.Intent.extras, ] : String | provenance | MaD:49 | | TestStartServiceToIntent.java:46:37:46:60 | (...)... : String | TestStartServiceToIntent.java:46:13:46:18 | intent [post update] : Intent [android.content.Intent.extras, ] : String | provenance | MaD:49 | | TestStartServiceToIntent.java:46:46:46:60 | source(...) : Object | TestStartServiceToIntent.java:46:37:46:60 | (...)... : String | provenance | | | TestStartServiceToIntent.java:47:30:47:35 | intent : Intent [android.content.Intent.extras, ] : String | TestStartServiceToIntent.java:62:29:62:41 | intent : Intent [android.content.Intent.extras, ] : String | provenance | | -| TestStartServiceToIntent.java:47:30:47:35 | intent : Intent [android.content.Intent.extras, ] : String | TestStartServiceToIntent.java:62:29:62:41 | intent : Intent [android.content.Intent.extras, ] : String | provenance | | -| TestStartServiceToIntent.java:47:30:47:35 | intent : Intent [android.content.Intent.extras, ] : String | TestStartServiceToIntent.java:62:29:62:41 | intent : Intent [android.content.Intent.extras, ] : String | provenance | | -| TestStartServiceToIntent.java:47:30:47:35 | intent : Intent [android.content.Intent.extras, ] : String | TestStartServiceToIntent.java:67:35:67:47 | intent : Intent [android.content.Intent.extras, ] : String | provenance | | -| TestStartServiceToIntent.java:47:30:47:35 | intent : Intent [android.content.Intent.extras, ] : String | TestStartServiceToIntent.java:67:35:67:47 | intent : Intent [android.content.Intent.extras, ] : String | provenance | | | TestStartServiceToIntent.java:47:30:47:35 | intent : Intent [android.content.Intent.extras, ] : String | TestStartServiceToIntent.java:67:35:67:47 | intent : Intent [android.content.Intent.extras, ] : String | provenance | | | TestStartServiceToIntent.java:47:30:47:35 | intent : Intent [android.content.Intent.extras, ] : String | TestStartServiceToIntent.java:73:31:73:43 | intent : Intent [android.content.Intent.extras, ] : String | provenance | | -| TestStartServiceToIntent.java:47:30:47:35 | intent : Intent [android.content.Intent.extras, ] : String | TestStartServiceToIntent.java:73:31:73:43 | intent : Intent [android.content.Intent.extras, ] : String | provenance | | -| TestStartServiceToIntent.java:47:30:47:35 | intent : Intent [android.content.Intent.extras, ] : String | TestStartServiceToIntent.java:73:31:73:43 | intent : Intent [android.content.Intent.extras, ] : String | provenance | | -| TestStartServiceToIntent.java:47:30:47:35 | intent : Intent [android.content.Intent.extras, ] : String | TestStartServiceToIntent.java:79:33:79:45 | intent : Intent [android.content.Intent.extras, ] : String | provenance | | -| TestStartServiceToIntent.java:47:30:47:35 | intent : Intent [android.content.Intent.extras, ] : String | TestStartServiceToIntent.java:79:33:79:45 | intent : Intent [android.content.Intent.extras, ] : String | provenance | | | TestStartServiceToIntent.java:47:30:47:35 | intent : Intent [android.content.Intent.extras, ] : String | TestStartServiceToIntent.java:79:33:79:45 | intent : Intent [android.content.Intent.extras, ] : String | provenance | | | TestStartServiceToIntent.java:47:30:47:35 | intent : Intent [android.content.Intent.extras, ] : String | TestStartServiceToIntent.java:85:30:85:42 | intent : Intent [android.content.Intent.extras, ] : String | provenance | | -| TestStartServiceToIntent.java:47:30:47:35 | intent : Intent [android.content.Intent.extras, ] : String | TestStartServiceToIntent.java:85:30:85:42 | intent : Intent [android.content.Intent.extras, ] : String | provenance | | -| TestStartServiceToIntent.java:47:30:47:35 | intent : Intent [android.content.Intent.extras, ] : String | TestStartServiceToIntent.java:85:30:85:42 | intent : Intent [android.content.Intent.extras, ] : String | provenance | | -| TestStartServiceToIntent.java:47:30:47:35 | intent : Intent [android.content.Intent.extras, ] : String | TestStartServiceToIntent.java:90:35:90:47 | intent : Intent [android.content.Intent.extras, ] : String | provenance | | -| TestStartServiceToIntent.java:47:30:47:35 | intent : Intent [android.content.Intent.extras, ] : String | TestStartServiceToIntent.java:90:35:90:47 | intent : Intent [android.content.Intent.extras, ] : String | provenance | | | TestStartServiceToIntent.java:47:30:47:35 | intent : Intent [android.content.Intent.extras, ] : String | TestStartServiceToIntent.java:90:35:90:47 | intent : Intent [android.content.Intent.extras, ] : String | provenance | | | TestStartServiceToIntent.java:62:29:62:41 | intent : Intent [android.content.Intent.extras, ] : String | TestStartServiceToIntent.java:63:18:63:23 | intent : Intent [android.content.Intent.extras, ] : String | provenance | | -| TestStartServiceToIntent.java:62:29:62:41 | intent : Intent [android.content.Intent.extras, ] : String | TestStartServiceToIntent.java:63:18:63:23 | intent : Intent [android.content.Intent.extras, ] : String | provenance | | -| TestStartServiceToIntent.java:62:29:62:41 | intent : Intent [android.content.Intent.extras, ] : String | TestStartServiceToIntent.java:63:18:63:23 | intent : Intent [android.content.Intent.extras, ] : String | provenance | | -| TestStartServiceToIntent.java:63:18:63:23 | intent : Intent [android.content.Intent.extras, ] : String | TestStartServiceToIntent.java:63:18:63:46 | getStringExtra(...) | provenance | MaD:43 | -| TestStartServiceToIntent.java:63:18:63:23 | intent : Intent [android.content.Intent.extras, ] : String | TestStartServiceToIntent.java:63:18:63:46 | getStringExtra(...) | provenance | MaD:43 | | TestStartServiceToIntent.java:63:18:63:23 | intent : Intent [android.content.Intent.extras, ] : String | TestStartServiceToIntent.java:63:18:63:46 | getStringExtra(...) | provenance | MaD:43 | | TestStartServiceToIntent.java:67:35:67:47 | intent : Intent [android.content.Intent.extras, ] : String | TestStartServiceToIntent.java:68:18:68:23 | intent : Intent [android.content.Intent.extras, ] : String | provenance | | -| TestStartServiceToIntent.java:67:35:67:47 | intent : Intent [android.content.Intent.extras, ] : String | TestStartServiceToIntent.java:68:18:68:23 | intent : Intent [android.content.Intent.extras, ] : String | provenance | | -| TestStartServiceToIntent.java:67:35:67:47 | intent : Intent [android.content.Intent.extras, ] : String | TestStartServiceToIntent.java:68:18:68:23 | intent : Intent [android.content.Intent.extras, ] : String | provenance | | -| TestStartServiceToIntent.java:68:18:68:23 | intent : Intent [android.content.Intent.extras, ] : String | TestStartServiceToIntent.java:68:18:68:46 | getStringExtra(...) | provenance | MaD:43 | -| TestStartServiceToIntent.java:68:18:68:23 | intent : Intent [android.content.Intent.extras, ] : String | TestStartServiceToIntent.java:68:18:68:46 | getStringExtra(...) | provenance | MaD:43 | | TestStartServiceToIntent.java:68:18:68:23 | intent : Intent [android.content.Intent.extras, ] : String | TestStartServiceToIntent.java:68:18:68:46 | getStringExtra(...) | provenance | MaD:43 | | TestStartServiceToIntent.java:73:31:73:43 | intent : Intent [android.content.Intent.extras, ] : String | TestStartServiceToIntent.java:74:18:74:23 | intent : Intent [android.content.Intent.extras, ] : String | provenance | | -| TestStartServiceToIntent.java:73:31:73:43 | intent : Intent [android.content.Intent.extras, ] : String | TestStartServiceToIntent.java:74:18:74:23 | intent : Intent [android.content.Intent.extras, ] : String | provenance | | -| TestStartServiceToIntent.java:73:31:73:43 | intent : Intent [android.content.Intent.extras, ] : String | TestStartServiceToIntent.java:74:18:74:23 | intent : Intent [android.content.Intent.extras, ] : String | provenance | | -| TestStartServiceToIntent.java:74:18:74:23 | intent : Intent [android.content.Intent.extras, ] : String | TestStartServiceToIntent.java:74:18:74:46 | getStringExtra(...) | provenance | MaD:43 | -| TestStartServiceToIntent.java:74:18:74:23 | intent : Intent [android.content.Intent.extras, ] : String | TestStartServiceToIntent.java:74:18:74:46 | getStringExtra(...) | provenance | MaD:43 | | TestStartServiceToIntent.java:74:18:74:23 | intent : Intent [android.content.Intent.extras, ] : String | TestStartServiceToIntent.java:74:18:74:46 | getStringExtra(...) | provenance | MaD:43 | | TestStartServiceToIntent.java:79:33:79:45 | intent : Intent [android.content.Intent.extras, ] : String | TestStartServiceToIntent.java:80:18:80:23 | intent : Intent [android.content.Intent.extras, ] : String | provenance | | -| TestStartServiceToIntent.java:79:33:79:45 | intent : Intent [android.content.Intent.extras, ] : String | TestStartServiceToIntent.java:80:18:80:23 | intent : Intent [android.content.Intent.extras, ] : String | provenance | | -| TestStartServiceToIntent.java:79:33:79:45 | intent : Intent [android.content.Intent.extras, ] : String | TestStartServiceToIntent.java:80:18:80:23 | intent : Intent [android.content.Intent.extras, ] : String | provenance | | -| TestStartServiceToIntent.java:80:18:80:23 | intent : Intent [android.content.Intent.extras, ] : String | TestStartServiceToIntent.java:80:18:80:46 | getStringExtra(...) | provenance | MaD:43 | -| TestStartServiceToIntent.java:80:18:80:23 | intent : Intent [android.content.Intent.extras, ] : String | TestStartServiceToIntent.java:80:18:80:46 | getStringExtra(...) | provenance | MaD:43 | | TestStartServiceToIntent.java:80:18:80:23 | intent : Intent [android.content.Intent.extras, ] : String | TestStartServiceToIntent.java:80:18:80:46 | getStringExtra(...) | provenance | MaD:43 | | TestStartServiceToIntent.java:85:30:85:42 | intent : Intent [android.content.Intent.extras, ] : String | TestStartServiceToIntent.java:86:18:86:23 | intent : Intent [android.content.Intent.extras, ] : String | provenance | | -| TestStartServiceToIntent.java:85:30:85:42 | intent : Intent [android.content.Intent.extras, ] : String | TestStartServiceToIntent.java:86:18:86:23 | intent : Intent [android.content.Intent.extras, ] : String | provenance | | -| TestStartServiceToIntent.java:85:30:85:42 | intent : Intent [android.content.Intent.extras, ] : String | TestStartServiceToIntent.java:86:18:86:23 | intent : Intent [android.content.Intent.extras, ] : String | provenance | | -| TestStartServiceToIntent.java:86:18:86:23 | intent : Intent [android.content.Intent.extras, ] : String | TestStartServiceToIntent.java:86:18:86:46 | getStringExtra(...) | provenance | MaD:43 | -| TestStartServiceToIntent.java:86:18:86:23 | intent : Intent [android.content.Intent.extras, ] : String | TestStartServiceToIntent.java:86:18:86:46 | getStringExtra(...) | provenance | MaD:43 | | TestStartServiceToIntent.java:86:18:86:23 | intent : Intent [android.content.Intent.extras, ] : String | TestStartServiceToIntent.java:86:18:86:46 | getStringExtra(...) | provenance | MaD:43 | | TestStartServiceToIntent.java:90:35:90:47 | intent : Intent [android.content.Intent.extras, ] : String | TestStartServiceToIntent.java:91:18:91:23 | intent : Intent [android.content.Intent.extras, ] : String | provenance | | -| TestStartServiceToIntent.java:90:35:90:47 | intent : Intent [android.content.Intent.extras, ] : String | TestStartServiceToIntent.java:91:18:91:23 | intent : Intent [android.content.Intent.extras, ] : String | provenance | | -| TestStartServiceToIntent.java:90:35:90:47 | intent : Intent [android.content.Intent.extras, ] : String | TestStartServiceToIntent.java:91:18:91:23 | intent : Intent [android.content.Intent.extras, ] : String | provenance | | -| TestStartServiceToIntent.java:91:18:91:23 | intent : Intent [android.content.Intent.extras, ] : String | TestStartServiceToIntent.java:91:18:91:46 | getStringExtra(...) | provenance | MaD:43 | -| TestStartServiceToIntent.java:91:18:91:23 | intent : Intent [android.content.Intent.extras, ] : String | TestStartServiceToIntent.java:91:18:91:46 | getStringExtra(...) | provenance | MaD:43 | | TestStartServiceToIntent.java:91:18:91:23 | intent : Intent [android.content.Intent.extras, ] : String | TestStartServiceToIntent.java:91:18:91:46 | getStringExtra(...) | provenance | MaD:43 | nodes | Test.java:22:19:22:32 | it : Set [] : String | semmle.label | it : Set [] : String | @@ -2432,142 +1848,73 @@ nodes | Test.java:22:44:22:56 | iterator(...) : Iterator [] : String | semmle.label | iterator(...) : Iterator [] : String | | Test.java:22:44:22:63 | next(...) : String | semmle.label | next(...) : String | | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : String | semmle.label | i : Intent [android.content.Intent.extras, ] : String | -| Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : String | semmle.label | i : Intent [android.content.Intent.extras, ] : String | -| Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : ArrayList | semmle.label | i : Intent [android.content.Intent.extras, ] : ArrayList | | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : ArrayList | semmle.label | i : Intent [android.content.Intent.extras, ] : ArrayList | | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : Boolean | semmle.label | i : Intent [android.content.Intent.extras, ] : Boolean | -| Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : Boolean | semmle.label | i : Intent [android.content.Intent.extras, ] : Boolean | -| Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : Bundle | semmle.label | i : Intent [android.content.Intent.extras, ] : Bundle | | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : Bundle | semmle.label | i : Intent [android.content.Intent.extras, ] : Bundle | | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : CharSequence | semmle.label | i : Intent [android.content.Intent.extras, ] : CharSequence | -| Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : CharSequence | semmle.label | i : Intent [android.content.Intent.extras, ] : CharSequence | -| Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : CharSequence[] | semmle.label | i : Intent [android.content.Intent.extras, ] : CharSequence[] | | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : CharSequence[] | semmle.label | i : Intent [android.content.Intent.extras, ] : CharSequence[] | | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : Intent | semmle.label | i : Intent [android.content.Intent.extras, ] : Intent | -| Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : Intent | semmle.label | i : Intent [android.content.Intent.extras, ] : Intent | -| Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : IntentSender | semmle.label | i : Intent [android.content.Intent.extras, ] : IntentSender | | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : IntentSender | semmle.label | i : Intent [android.content.Intent.extras, ] : IntentSender | | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : Number | semmle.label | i : Intent [android.content.Intent.extras, ] : Number | -| Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : Number | semmle.label | i : Intent [android.content.Intent.extras, ] : Number | -| Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : Object | semmle.label | i : Intent [android.content.Intent.extras, ] : Object | | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : Object | semmle.label | i : Intent [android.content.Intent.extras, ] : Object | | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : Parcelable | semmle.label | i : Intent [android.content.Intent.extras, ] : Parcelable | -| Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : Parcelable | semmle.label | i : Intent [android.content.Intent.extras, ] : Parcelable | -| Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : Parcelable[] | semmle.label | i : Intent [android.content.Intent.extras, ] : Parcelable[] | | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : Parcelable[] | semmle.label | i : Intent [android.content.Intent.extras, ] : Parcelable[] | | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : Serializable | semmle.label | i : Intent [android.content.Intent.extras, ] : Serializable | -| Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : Serializable | semmle.label | i : Intent [android.content.Intent.extras, ] : Serializable | -| Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : String | semmle.label | i : Intent [android.content.Intent.extras, ] : String | | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : String | semmle.label | i : Intent [android.content.Intent.extras, ] : String | | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : String[] | semmle.label | i : Intent [android.content.Intent.extras, ] : String[] | -| Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : String[] | semmle.label | i : Intent [android.content.Intent.extras, ] : String[] | -| Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : boolean[] | semmle.label | i : Intent [android.content.Intent.extras, ] : boolean[] | | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : boolean[] | semmle.label | i : Intent [android.content.Intent.extras, ] : boolean[] | | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : byte[] | semmle.label | i : Intent [android.content.Intent.extras, ] : byte[] | -| Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : byte[] | semmle.label | i : Intent [android.content.Intent.extras, ] : byte[] | -| Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : char[] | semmle.label | i : Intent [android.content.Intent.extras, ] : char[] | | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : char[] | semmle.label | i : Intent [android.content.Intent.extras, ] : char[] | | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : double[] | semmle.label | i : Intent [android.content.Intent.extras, ] : double[] | -| Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : double[] | semmle.label | i : Intent [android.content.Intent.extras, ] : double[] | -| Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : float[] | semmle.label | i : Intent [android.content.Intent.extras, ] : float[] | | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : float[] | semmle.label | i : Intent [android.content.Intent.extras, ] : float[] | | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : int[] | semmle.label | i : Intent [android.content.Intent.extras, ] : int[] | -| Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : int[] | semmle.label | i : Intent [android.content.Intent.extras, ] : int[] | -| Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : long[] | semmle.label | i : Intent [android.content.Intent.extras, ] : long[] | | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : long[] | semmle.label | i : Intent [android.content.Intent.extras, ] : long[] | | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : short[] | semmle.label | i : Intent [android.content.Intent.extras, ] : short[] | -| Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : short[] | semmle.label | i : Intent [android.content.Intent.extras, ] : short[] | -| Test.java:23:45:23:45 | i : Intent [android.content.Intent.extras, ] : String | semmle.label | i : Intent [android.content.Intent.extras, ] : String | | Test.java:23:45:23:45 | i : Intent [android.content.Intent.extras, ] : String | semmle.label | i : Intent [android.content.Intent.extras, ] : String | | Test.java:23:45:23:45 | i : Intent [android.content.Intent.extras, ] : ArrayList | semmle.label | i : Intent [android.content.Intent.extras, ] : ArrayList | -| Test.java:23:45:23:45 | i : Intent [android.content.Intent.extras, ] : ArrayList | semmle.label | i : Intent [android.content.Intent.extras, ] : ArrayList | -| Test.java:23:45:23:45 | i : Intent [android.content.Intent.extras, ] : Boolean | semmle.label | i : Intent [android.content.Intent.extras, ] : Boolean | | Test.java:23:45:23:45 | i : Intent [android.content.Intent.extras, ] : Boolean | semmle.label | i : Intent [android.content.Intent.extras, ] : Boolean | | Test.java:23:45:23:45 | i : Intent [android.content.Intent.extras, ] : Bundle | semmle.label | i : Intent [android.content.Intent.extras, ] : Bundle | -| Test.java:23:45:23:45 | i : Intent [android.content.Intent.extras, ] : Bundle | semmle.label | i : Intent [android.content.Intent.extras, ] : Bundle | -| Test.java:23:45:23:45 | i : Intent [android.content.Intent.extras, ] : CharSequence | semmle.label | i : Intent [android.content.Intent.extras, ] : CharSequence | | Test.java:23:45:23:45 | i : Intent [android.content.Intent.extras, ] : CharSequence | semmle.label | i : Intent [android.content.Intent.extras, ] : CharSequence | | Test.java:23:45:23:45 | i : Intent [android.content.Intent.extras, ] : CharSequence[] | semmle.label | i : Intent [android.content.Intent.extras, ] : CharSequence[] | -| Test.java:23:45:23:45 | i : Intent [android.content.Intent.extras, ] : CharSequence[] | semmle.label | i : Intent [android.content.Intent.extras, ] : CharSequence[] | -| Test.java:23:45:23:45 | i : Intent [android.content.Intent.extras, ] : Intent | semmle.label | i : Intent [android.content.Intent.extras, ] : Intent | | Test.java:23:45:23:45 | i : Intent [android.content.Intent.extras, ] : Intent | semmle.label | i : Intent [android.content.Intent.extras, ] : Intent | | Test.java:23:45:23:45 | i : Intent [android.content.Intent.extras, ] : IntentSender | semmle.label | i : Intent [android.content.Intent.extras, ] : IntentSender | -| Test.java:23:45:23:45 | i : Intent [android.content.Intent.extras, ] : IntentSender | semmle.label | i : Intent [android.content.Intent.extras, ] : IntentSender | -| Test.java:23:45:23:45 | i : Intent [android.content.Intent.extras, ] : Number | semmle.label | i : Intent [android.content.Intent.extras, ] : Number | | Test.java:23:45:23:45 | i : Intent [android.content.Intent.extras, ] : Number | semmle.label | i : Intent [android.content.Intent.extras, ] : Number | | Test.java:23:45:23:45 | i : Intent [android.content.Intent.extras, ] : Object | semmle.label | i : Intent [android.content.Intent.extras, ] : Object | -| Test.java:23:45:23:45 | i : Intent [android.content.Intent.extras, ] : Object | semmle.label | i : Intent [android.content.Intent.extras, ] : Object | -| Test.java:23:45:23:45 | i : Intent [android.content.Intent.extras, ] : Parcelable | semmle.label | i : Intent [android.content.Intent.extras, ] : Parcelable | | Test.java:23:45:23:45 | i : Intent [android.content.Intent.extras, ] : Parcelable | semmle.label | i : Intent [android.content.Intent.extras, ] : Parcelable | | Test.java:23:45:23:45 | i : Intent [android.content.Intent.extras, ] : Parcelable[] | semmle.label | i : Intent [android.content.Intent.extras, ] : Parcelable[] | -| Test.java:23:45:23:45 | i : Intent [android.content.Intent.extras, ] : Parcelable[] | semmle.label | i : Intent [android.content.Intent.extras, ] : Parcelable[] | -| Test.java:23:45:23:45 | i : Intent [android.content.Intent.extras, ] : Serializable | semmle.label | i : Intent [android.content.Intent.extras, ] : Serializable | | Test.java:23:45:23:45 | i : Intent [android.content.Intent.extras, ] : Serializable | semmle.label | i : Intent [android.content.Intent.extras, ] : Serializable | | Test.java:23:45:23:45 | i : Intent [android.content.Intent.extras, ] : String | semmle.label | i : Intent [android.content.Intent.extras, ] : String | -| Test.java:23:45:23:45 | i : Intent [android.content.Intent.extras, ] : String | semmle.label | i : Intent [android.content.Intent.extras, ] : String | -| Test.java:23:45:23:45 | i : Intent [android.content.Intent.extras, ] : String[] | semmle.label | i : Intent [android.content.Intent.extras, ] : String[] | | Test.java:23:45:23:45 | i : Intent [android.content.Intent.extras, ] : String[] | semmle.label | i : Intent [android.content.Intent.extras, ] : String[] | | Test.java:23:45:23:45 | i : Intent [android.content.Intent.extras, ] : boolean[] | semmle.label | i : Intent [android.content.Intent.extras, ] : boolean[] | -| Test.java:23:45:23:45 | i : Intent [android.content.Intent.extras, ] : boolean[] | semmle.label | i : Intent [android.content.Intent.extras, ] : boolean[] | -| Test.java:23:45:23:45 | i : Intent [android.content.Intent.extras, ] : byte[] | semmle.label | i : Intent [android.content.Intent.extras, ] : byte[] | | Test.java:23:45:23:45 | i : Intent [android.content.Intent.extras, ] : byte[] | semmle.label | i : Intent [android.content.Intent.extras, ] : byte[] | | Test.java:23:45:23:45 | i : Intent [android.content.Intent.extras, ] : char[] | semmle.label | i : Intent [android.content.Intent.extras, ] : char[] | -| Test.java:23:45:23:45 | i : Intent [android.content.Intent.extras, ] : char[] | semmle.label | i : Intent [android.content.Intent.extras, ] : char[] | -| Test.java:23:45:23:45 | i : Intent [android.content.Intent.extras, ] : double[] | semmle.label | i : Intent [android.content.Intent.extras, ] : double[] | | Test.java:23:45:23:45 | i : Intent [android.content.Intent.extras, ] : double[] | semmle.label | i : Intent [android.content.Intent.extras, ] : double[] | | Test.java:23:45:23:45 | i : Intent [android.content.Intent.extras, ] : float[] | semmle.label | i : Intent [android.content.Intent.extras, ] : float[] | -| Test.java:23:45:23:45 | i : Intent [android.content.Intent.extras, ] : float[] | semmle.label | i : Intent [android.content.Intent.extras, ] : float[] | -| Test.java:23:45:23:45 | i : Intent [android.content.Intent.extras, ] : int[] | semmle.label | i : Intent [android.content.Intent.extras, ] : int[] | | Test.java:23:45:23:45 | i : Intent [android.content.Intent.extras, ] : int[] | semmle.label | i : Intent [android.content.Intent.extras, ] : int[] | | Test.java:23:45:23:45 | i : Intent [android.content.Intent.extras, ] : long[] | semmle.label | i : Intent [android.content.Intent.extras, ] : long[] | -| Test.java:23:45:23:45 | i : Intent [android.content.Intent.extras, ] : long[] | semmle.label | i : Intent [android.content.Intent.extras, ] : long[] | -| Test.java:23:45:23:45 | i : Intent [android.content.Intent.extras, ] : short[] | semmle.label | i : Intent [android.content.Intent.extras, ] : short[] | | Test.java:23:45:23:45 | i : Intent [android.content.Intent.extras, ] : short[] | semmle.label | i : Intent [android.content.Intent.extras, ] : short[] | | Test.java:23:45:23:57 | getExtras(...) : Bundle [] : String | semmle.label | getExtras(...) : Bundle [] : String | -| Test.java:23:45:23:57 | getExtras(...) : Bundle [] : String | semmle.label | getExtras(...) : Bundle [] : String | -| Test.java:23:45:23:57 | getExtras(...) : Bundle [] : ArrayList | semmle.label | getExtras(...) : Bundle [] : ArrayList | | Test.java:23:45:23:57 | getExtras(...) : Bundle [] : ArrayList | semmle.label | getExtras(...) : Bundle [] : ArrayList | | Test.java:23:45:23:57 | getExtras(...) : Bundle [] : Boolean | semmle.label | getExtras(...) : Bundle [] : Boolean | -| Test.java:23:45:23:57 | getExtras(...) : Bundle [] : Boolean | semmle.label | getExtras(...) : Bundle [] : Boolean | -| Test.java:23:45:23:57 | getExtras(...) : Bundle [] : Bundle | semmle.label | getExtras(...) : Bundle [] : Bundle | | Test.java:23:45:23:57 | getExtras(...) : Bundle [] : Bundle | semmle.label | getExtras(...) : Bundle [] : Bundle | | Test.java:23:45:23:57 | getExtras(...) : Bundle [] : CharSequence | semmle.label | getExtras(...) : Bundle [] : CharSequence | -| Test.java:23:45:23:57 | getExtras(...) : Bundle [] : CharSequence | semmle.label | getExtras(...) : Bundle [] : CharSequence | -| Test.java:23:45:23:57 | getExtras(...) : Bundle [] : CharSequence[] | semmle.label | getExtras(...) : Bundle [] : CharSequence[] | | Test.java:23:45:23:57 | getExtras(...) : Bundle [] : CharSequence[] | semmle.label | getExtras(...) : Bundle [] : CharSequence[] | | Test.java:23:45:23:57 | getExtras(...) : Bundle [] : Intent | semmle.label | getExtras(...) : Bundle [] : Intent | -| Test.java:23:45:23:57 | getExtras(...) : Bundle [] : Intent | semmle.label | getExtras(...) : Bundle [] : Intent | -| Test.java:23:45:23:57 | getExtras(...) : Bundle [] : IntentSender | semmle.label | getExtras(...) : Bundle [] : IntentSender | | Test.java:23:45:23:57 | getExtras(...) : Bundle [] : IntentSender | semmle.label | getExtras(...) : Bundle [] : IntentSender | | Test.java:23:45:23:57 | getExtras(...) : Bundle [] : Number | semmle.label | getExtras(...) : Bundle [] : Number | -| Test.java:23:45:23:57 | getExtras(...) : Bundle [] : Number | semmle.label | getExtras(...) : Bundle [] : Number | -| Test.java:23:45:23:57 | getExtras(...) : Bundle [] : Object | semmle.label | getExtras(...) : Bundle [] : Object | | Test.java:23:45:23:57 | getExtras(...) : Bundle [] : Object | semmle.label | getExtras(...) : Bundle [] : Object | | Test.java:23:45:23:57 | getExtras(...) : Bundle [] : Parcelable | semmle.label | getExtras(...) : Bundle [] : Parcelable | -| Test.java:23:45:23:57 | getExtras(...) : Bundle [] : Parcelable | semmle.label | getExtras(...) : Bundle [] : Parcelable | -| Test.java:23:45:23:57 | getExtras(...) : Bundle [] : Parcelable[] | semmle.label | getExtras(...) : Bundle [] : Parcelable[] | | Test.java:23:45:23:57 | getExtras(...) : Bundle [] : Parcelable[] | semmle.label | getExtras(...) : Bundle [] : Parcelable[] | | Test.java:23:45:23:57 | getExtras(...) : Bundle [] : Serializable | semmle.label | getExtras(...) : Bundle [] : Serializable | -| Test.java:23:45:23:57 | getExtras(...) : Bundle [] : Serializable | semmle.label | getExtras(...) : Bundle [] : Serializable | -| Test.java:23:45:23:57 | getExtras(...) : Bundle [] : String | semmle.label | getExtras(...) : Bundle [] : String | | Test.java:23:45:23:57 | getExtras(...) : Bundle [] : String | semmle.label | getExtras(...) : Bundle [] : String | | Test.java:23:45:23:57 | getExtras(...) : Bundle [] : String[] | semmle.label | getExtras(...) : Bundle [] : String[] | -| Test.java:23:45:23:57 | getExtras(...) : Bundle [] : String[] | semmle.label | getExtras(...) : Bundle [] : String[] | -| Test.java:23:45:23:57 | getExtras(...) : Bundle [] : boolean[] | semmle.label | getExtras(...) : Bundle [] : boolean[] | | Test.java:23:45:23:57 | getExtras(...) : Bundle [] : boolean[] | semmle.label | getExtras(...) : Bundle [] : boolean[] | | Test.java:23:45:23:57 | getExtras(...) : Bundle [] : byte[] | semmle.label | getExtras(...) : Bundle [] : byte[] | -| Test.java:23:45:23:57 | getExtras(...) : Bundle [] : byte[] | semmle.label | getExtras(...) : Bundle [] : byte[] | -| Test.java:23:45:23:57 | getExtras(...) : Bundle [] : char[] | semmle.label | getExtras(...) : Bundle [] : char[] | | Test.java:23:45:23:57 | getExtras(...) : Bundle [] : char[] | semmle.label | getExtras(...) : Bundle [] : char[] | | Test.java:23:45:23:57 | getExtras(...) : Bundle [] : double[] | semmle.label | getExtras(...) : Bundle [] : double[] | -| Test.java:23:45:23:57 | getExtras(...) : Bundle [] : double[] | semmle.label | getExtras(...) : Bundle [] : double[] | -| Test.java:23:45:23:57 | getExtras(...) : Bundle [] : float[] | semmle.label | getExtras(...) : Bundle [] : float[] | | Test.java:23:45:23:57 | getExtras(...) : Bundle [] : float[] | semmle.label | getExtras(...) : Bundle [] : float[] | | Test.java:23:45:23:57 | getExtras(...) : Bundle [] : int[] | semmle.label | getExtras(...) : Bundle [] : int[] | -| Test.java:23:45:23:57 | getExtras(...) : Bundle [] : int[] | semmle.label | getExtras(...) : Bundle [] : int[] | | Test.java:23:45:23:57 | getExtras(...) : Bundle [] : long[] | semmle.label | getExtras(...) : Bundle [] : long[] | -| Test.java:23:45:23:57 | getExtras(...) : Bundle [] : long[] | semmle.label | getExtras(...) : Bundle [] : long[] | -| Test.java:23:45:23:57 | getExtras(...) : Bundle [] : short[] | semmle.label | getExtras(...) : Bundle [] : short[] | | Test.java:23:45:23:57 | getExtras(...) : Bundle [] : short[] | semmle.label | getExtras(...) : Bundle [] : short[] | | Test.java:24:19:24:30 | b : BaseBundle [] : String | semmle.label | b : BaseBundle [] : String | | Test.java:24:19:24:30 | b : Bundle [] : Object | semmle.label | b : Bundle [] : Object | @@ -2603,23 +1950,19 @@ nodes | Test.java:41:45:41:73 | newBundleWithMapKey(...) : Bundle [] : String | semmle.label | newBundleWithMapKey(...) : Bundle [] : String | | Test.java:41:65:41:72 | source(...) : String | semmle.label | source(...) : String | | Test.java:42:10:42:23 | new Intent(...) : Intent [android.content.Intent.extras, ] : String | semmle.label | new Intent(...) : Intent [android.content.Intent.extras, ] : String | -| Test.java:42:10:42:23 | new Intent(...) : Intent [android.content.Intent.extras, ] : String | semmle.label | new Intent(...) : Intent [android.content.Intent.extras, ] : String | | Test.java:42:21:42:22 | in : Intent [android.content.Intent.extras, ] : String | semmle.label | in : Intent [android.content.Intent.extras, ] : String | | Test.java:43:9:43:40 | getMapKey(...) | semmle.label | getMapKey(...) | | Test.java:43:19:43:39 | getIntent_extras(...) : Bundle [] : String | semmle.label | getIntent_extras(...) : Bundle [] : String | | Test.java:43:36:43:38 | out : Intent [android.content.Intent.extras, ] : String | semmle.label | out : Intent [android.content.Intent.extras, ] : String | -| Test.java:43:36:43:38 | out : Intent [android.content.Intent.extras, ] : String | semmle.label | out : Intent [android.content.Intent.extras, ] : String | | Test.java:48:16:48:76 | (...)... : Intent [android.content.Intent.extras, ] : Object | semmle.label | (...)... : Intent [android.content.Intent.extras, ] : Object | | Test.java:48:24:48:76 | newWithIntent_extras(...) : Intent [android.content.Intent.extras, ] : Object | semmle.label | newWithIntent_extras(...) : Intent [android.content.Intent.extras, ] : Object | | Test.java:48:45:48:75 | newBundleWithMapValue(...) : Bundle [] : Object | semmle.label | newBundleWithMapValue(...) : Bundle [] : Object | | Test.java:48:67:48:74 | source(...) : Object | semmle.label | source(...) : Object | | Test.java:49:10:49:23 | new Intent(...) : Intent [android.content.Intent.extras, ] : Object | semmle.label | new Intent(...) : Intent [android.content.Intent.extras, ] : Object | -| Test.java:49:10:49:23 | new Intent(...) : Intent [android.content.Intent.extras, ] : Object | semmle.label | new Intent(...) : Intent [android.content.Intent.extras, ] : Object | | Test.java:49:21:49:22 | in : Intent [android.content.Intent.extras, ] : Object | semmle.label | in : Intent [android.content.Intent.extras, ] : Object | | Test.java:50:9:50:42 | getMapValue(...) | semmle.label | getMapValue(...) | | Test.java:50:21:50:41 | getIntent_extras(...) : Bundle [] : Object | semmle.label | getIntent_extras(...) : Bundle [] : Object | | Test.java:50:38:50:40 | out : Intent [android.content.Intent.extras, ] : Object | semmle.label | out : Intent [android.content.Intent.extras, ] : Object | -| Test.java:50:38:50:40 | out : Intent [android.content.Intent.extras, ] : Object | semmle.label | out : Intent [android.content.Intent.extras, ] : Object | | Test.java:55:13:55:25 | (...)... : Uri | semmle.label | (...)... : Uri | | Test.java:55:18:55:25 | source(...) : Object | semmle.label | source(...) : Object | | Test.java:56:10:56:29 | new Intent(...) : Intent [android.content.Intent.data] : Uri | semmle.label | new Intent(...) : Intent [android.content.Intent.data] : Uri | @@ -2645,30 +1988,24 @@ nodes | Test.java:83:22:83:43 | (...)... : CharSequence | semmle.label | (...)... : CharSequence | | Test.java:83:36:83:43 | source(...) : Object | semmle.label | source(...) : Object | | Test.java:84:10:84:45 | createChooser(...) : Intent [android.content.Intent.extras, ] : CharSequence | semmle.label | createChooser(...) : Intent [android.content.Intent.extras, ] : CharSequence | -| Test.java:84:10:84:45 | createChooser(...) : Intent [android.content.Intent.extras, ] : CharSequence | semmle.label | createChooser(...) : Intent [android.content.Intent.extras, ] : CharSequence | | Test.java:84:37:84:38 | in : CharSequence | semmle.label | in : CharSequence | | Test.java:85:9:85:42 | getMapValue(...) | semmle.label | getMapValue(...) | | Test.java:85:21:85:41 | getIntent_extras(...) : Bundle [] : CharSequence | semmle.label | getIntent_extras(...) : Bundle [] : CharSequence | | Test.java:85:38:85:40 | out : Intent [android.content.Intent.extras, ] : CharSequence | semmle.label | out : Intent [android.content.Intent.extras, ] : CharSequence | -| Test.java:85:38:85:40 | out : Intent [android.content.Intent.extras, ] : CharSequence | semmle.label | out : Intent [android.content.Intent.extras, ] : CharSequence | | Test.java:90:22:90:43 | (...)... : IntentSender | semmle.label | (...)... : IntentSender | | Test.java:90:36:90:43 | source(...) : Object | semmle.label | source(...) : Object | | Test.java:91:10:91:45 | createChooser(...) : Intent [android.content.Intent.extras, ] : IntentSender | semmle.label | createChooser(...) : Intent [android.content.Intent.extras, ] : IntentSender | -| Test.java:91:10:91:45 | createChooser(...) : Intent [android.content.Intent.extras, ] : IntentSender | semmle.label | createChooser(...) : Intent [android.content.Intent.extras, ] : IntentSender | | Test.java:91:43:91:44 | in : IntentSender | semmle.label | in : IntentSender | | Test.java:92:9:92:42 | getMapValue(...) | semmle.label | getMapValue(...) | | Test.java:92:21:92:41 | getIntent_extras(...) : Bundle [] : IntentSender | semmle.label | getIntent_extras(...) : Bundle [] : IntentSender | | Test.java:92:38:92:40 | out : Intent [android.content.Intent.extras, ] : IntentSender | semmle.label | out : Intent [android.content.Intent.extras, ] : IntentSender | -| Test.java:92:38:92:40 | out : Intent [android.content.Intent.extras, ] : IntentSender | semmle.label | out : Intent [android.content.Intent.extras, ] : IntentSender | | Test.java:97:16:97:31 | (...)... : Intent | semmle.label | (...)... : Intent | | Test.java:97:24:97:31 | source(...) : Object | semmle.label | source(...) : Object | | Test.java:98:10:98:45 | createChooser(...) : Intent [android.content.Intent.extras, ] : Intent | semmle.label | createChooser(...) : Intent [android.content.Intent.extras, ] : Intent | -| Test.java:98:10:98:45 | createChooser(...) : Intent [android.content.Intent.extras, ] : Intent | semmle.label | createChooser(...) : Intent [android.content.Intent.extras, ] : Intent | | Test.java:98:31:98:32 | in : Intent | semmle.label | in : Intent | | Test.java:99:9:99:42 | getMapValue(...) | semmle.label | getMapValue(...) | | Test.java:99:21:99:41 | getIntent_extras(...) : Bundle [] : Intent | semmle.label | getIntent_extras(...) : Bundle [] : Intent | | Test.java:99:38:99:40 | out : Intent [android.content.Intent.extras, ] : Intent | semmle.label | out : Intent [android.content.Intent.extras, ] : Intent | -| Test.java:99:38:99:40 | out : Intent [android.content.Intent.extras, ] : Intent | semmle.label | out : Intent [android.content.Intent.extras, ] : Intent | | Test.java:104:16:104:76 | (...)... : Intent [android.content.Intent.extras, ] : Object | semmle.label | (...)... : Intent [android.content.Intent.extras, ] : Object | | Test.java:104:24:104:76 | newWithIntent_extras(...) : Intent [android.content.Intent.extras, ] : Object | semmle.label | newWithIntent_extras(...) : Intent [android.content.Intent.extras, ] : Object | | Test.java:104:45:104:75 | newBundleWithMapValue(...) : Bundle [] : Object | semmle.label | newBundleWithMapValue(...) : Bundle [] : Object | @@ -2810,21 +2147,17 @@ nodes | Test.java:244:16:244:31 | (...)... : String | semmle.label | (...)... : String | | Test.java:244:24:244:31 | source(...) : Object | semmle.label | source(...) : Object | | Test.java:245:4:245:6 | out [post update] : Intent [android.content.Intent.extras, ] : String | semmle.label | out [post update] : Intent [android.content.Intent.extras, ] : String | -| Test.java:245:4:245:6 | out [post update] : Intent [android.content.Intent.extras, ] : String | semmle.label | out [post update] : Intent [android.content.Intent.extras, ] : String | | Test.java:245:38:245:39 | in : String | semmle.label | in : String | | Test.java:246:9:246:40 | getMapKey(...) | semmle.label | getMapKey(...) | | Test.java:246:19:246:39 | getIntent_extras(...) : Bundle [] : String | semmle.label | getIntent_extras(...) : Bundle [] : String | | Test.java:246:36:246:38 | out : Intent [android.content.Intent.extras, ] : String | semmle.label | out : Intent [android.content.Intent.extras, ] : String | -| Test.java:246:36:246:38 | out : Intent [android.content.Intent.extras, ] : String | semmle.label | out : Intent [android.content.Intent.extras, ] : String | | Test.java:251:19:251:37 | (...)... : ArrayList | semmle.label | (...)... : ArrayList | | Test.java:251:30:251:37 | source(...) : Object | semmle.label | source(...) : Object | | Test.java:252:4:252:6 | out [post update] : Intent [android.content.Intent.extras, ] : ArrayList | semmle.label | out [post update] : Intent [android.content.Intent.extras, ] : ArrayList | -| Test.java:252:4:252:6 | out [post update] : Intent [android.content.Intent.extras, ] : ArrayList | semmle.label | out [post update] : Intent [android.content.Intent.extras, ] : ArrayList | | Test.java:252:44:252:45 | in : ArrayList | semmle.label | in : ArrayList | | Test.java:253:9:253:42 | getMapValue(...) | semmle.label | getMapValue(...) | | Test.java:253:21:253:41 | getIntent_extras(...) : Bundle [] : ArrayList | semmle.label | getIntent_extras(...) : Bundle [] : ArrayList | | Test.java:253:38:253:40 | out : Intent [android.content.Intent.extras, ] : ArrayList | semmle.label | out : Intent [android.content.Intent.extras, ] : ArrayList | -| Test.java:253:38:253:40 | out : Intent [android.content.Intent.extras, ] : ArrayList | semmle.label | out : Intent [android.content.Intent.extras, ] : ArrayList | | Test.java:258:16:258:31 | (...)... : Intent | semmle.label | (...)... : Intent | | Test.java:258:24:258:31 | source(...) : Object | semmle.label | source(...) : Object | | Test.java:259:10:259:11 | in : Intent | semmle.label | in : Intent | @@ -2948,435 +2281,339 @@ nodes | Test.java:426:16:426:31 | (...)... : String | semmle.label | (...)... : String | | Test.java:426:24:426:31 | source(...) : Object | semmle.label | source(...) : Object | | Test.java:427:4:427:6 | out [post update] : Intent [android.content.Intent.extras, ] : String | semmle.label | out [post update] : Intent [android.content.Intent.extras, ] : String | -| Test.java:427:4:427:6 | out [post update] : Intent [android.content.Intent.extras, ] : String | semmle.label | out [post update] : Intent [android.content.Intent.extras, ] : String | | Test.java:427:17:427:18 | in : String | semmle.label | in : String | | Test.java:428:9:428:40 | getMapKey(...) | semmle.label | getMapKey(...) | | Test.java:428:19:428:39 | getIntent_extras(...) : Bundle [] : String | semmle.label | getIntent_extras(...) : Bundle [] : String | | Test.java:428:36:428:38 | out : Intent [android.content.Intent.extras, ] : String | semmle.label | out : Intent [android.content.Intent.extras, ] : String | -| Test.java:428:36:428:38 | out : Intent [android.content.Intent.extras, ] : String | semmle.label | out : Intent [android.content.Intent.extras, ] : String | | Test.java:433:16:433:31 | (...)... : String | semmle.label | (...)... : String | | Test.java:433:24:433:31 | source(...) : Object | semmle.label | source(...) : Object | | Test.java:434:4:434:6 | out [post update] : Intent [android.content.Intent.extras, ] : String | semmle.label | out [post update] : Intent [android.content.Intent.extras, ] : String | -| Test.java:434:4:434:6 | out [post update] : Intent [android.content.Intent.extras, ] : String | semmle.label | out [post update] : Intent [android.content.Intent.extras, ] : String | | Test.java:434:17:434:18 | in : String | semmle.label | in : String | | Test.java:435:9:435:40 | getMapKey(...) | semmle.label | getMapKey(...) | | Test.java:435:19:435:39 | getIntent_extras(...) : Bundle [] : String | semmle.label | getIntent_extras(...) : Bundle [] : String | | Test.java:435:36:435:38 | out : Intent [android.content.Intent.extras, ] : String | semmle.label | out : Intent [android.content.Intent.extras, ] : String | -| Test.java:435:36:435:38 | out : Intent [android.content.Intent.extras, ] : String | semmle.label | out : Intent [android.content.Intent.extras, ] : String | | Test.java:440:16:440:31 | (...)... : String | semmle.label | (...)... : String | | Test.java:440:24:440:31 | source(...) : Object | semmle.label | source(...) : Object | | Test.java:441:4:441:6 | out [post update] : Intent [android.content.Intent.extras, ] : String | semmle.label | out [post update] : Intent [android.content.Intent.extras, ] : String | -| Test.java:441:4:441:6 | out [post update] : Intent [android.content.Intent.extras, ] : String | semmle.label | out [post update] : Intent [android.content.Intent.extras, ] : String | | Test.java:441:17:441:18 | in : String | semmle.label | in : String | | Test.java:442:9:442:40 | getMapKey(...) | semmle.label | getMapKey(...) | | Test.java:442:19:442:39 | getIntent_extras(...) : Bundle [] : String | semmle.label | getIntent_extras(...) : Bundle [] : String | | Test.java:442:36:442:38 | out : Intent [android.content.Intent.extras, ] : String | semmle.label | out : Intent [android.content.Intent.extras, ] : String | -| Test.java:442:36:442:38 | out : Intent [android.content.Intent.extras, ] : String | semmle.label | out : Intent [android.content.Intent.extras, ] : String | | Test.java:447:16:447:31 | (...)... : String | semmle.label | (...)... : String | | Test.java:447:24:447:31 | source(...) : Object | semmle.label | source(...) : Object | | Test.java:448:4:448:6 | out [post update] : Intent [android.content.Intent.extras, ] : String | semmle.label | out [post update] : Intent [android.content.Intent.extras, ] : String | -| Test.java:448:4:448:6 | out [post update] : Intent [android.content.Intent.extras, ] : String | semmle.label | out [post update] : Intent [android.content.Intent.extras, ] : String | | Test.java:448:17:448:18 | in : String | semmle.label | in : String | | Test.java:449:9:449:40 | getMapKey(...) | semmle.label | getMapKey(...) | | Test.java:449:19:449:39 | getIntent_extras(...) : Bundle [] : String | semmle.label | getIntent_extras(...) : Bundle [] : String | | Test.java:449:36:449:38 | out : Intent [android.content.Intent.extras, ] : String | semmle.label | out : Intent [android.content.Intent.extras, ] : String | -| Test.java:449:36:449:38 | out : Intent [android.content.Intent.extras, ] : String | semmle.label | out : Intent [android.content.Intent.extras, ] : String | | Test.java:454:16:454:31 | (...)... : String | semmle.label | (...)... : String | | Test.java:454:24:454:31 | source(...) : Object | semmle.label | source(...) : Object | | Test.java:455:4:455:6 | out [post update] : Intent [android.content.Intent.extras, ] : String | semmle.label | out [post update] : Intent [android.content.Intent.extras, ] : String | -| Test.java:455:4:455:6 | out [post update] : Intent [android.content.Intent.extras, ] : String | semmle.label | out [post update] : Intent [android.content.Intent.extras, ] : String | | Test.java:455:17:455:18 | in : String | semmle.label | in : String | | Test.java:456:9:456:40 | getMapKey(...) | semmle.label | getMapKey(...) | | Test.java:456:19:456:39 | getIntent_extras(...) : Bundle [] : String | semmle.label | getIntent_extras(...) : Bundle [] : String | | Test.java:456:36:456:38 | out : Intent [android.content.Intent.extras, ] : String | semmle.label | out : Intent [android.content.Intent.extras, ] : String | -| Test.java:456:36:456:38 | out : Intent [android.content.Intent.extras, ] : String | semmle.label | out : Intent [android.content.Intent.extras, ] : String | | Test.java:461:16:461:31 | (...)... : String | semmle.label | (...)... : String | | Test.java:461:24:461:31 | source(...) : Object | semmle.label | source(...) : Object | | Test.java:462:4:462:6 | out [post update] : Intent [android.content.Intent.extras, ] : String | semmle.label | out [post update] : Intent [android.content.Intent.extras, ] : String | -| Test.java:462:4:462:6 | out [post update] : Intent [android.content.Intent.extras, ] : String | semmle.label | out [post update] : Intent [android.content.Intent.extras, ] : String | | Test.java:462:17:462:18 | in : String | semmle.label | in : String | | Test.java:463:9:463:40 | getMapKey(...) | semmle.label | getMapKey(...) | | Test.java:463:19:463:39 | getIntent_extras(...) : Bundle [] : String | semmle.label | getIntent_extras(...) : Bundle [] : String | | Test.java:463:36:463:38 | out : Intent [android.content.Intent.extras, ] : String | semmle.label | out : Intent [android.content.Intent.extras, ] : String | -| Test.java:463:36:463:38 | out : Intent [android.content.Intent.extras, ] : String | semmle.label | out : Intent [android.content.Intent.extras, ] : String | | Test.java:468:16:468:31 | (...)... : String | semmle.label | (...)... : String | | Test.java:468:24:468:31 | source(...) : Object | semmle.label | source(...) : Object | | Test.java:469:4:469:6 | out [post update] : Intent [android.content.Intent.extras, ] : String | semmle.label | out [post update] : Intent [android.content.Intent.extras, ] : String | -| Test.java:469:4:469:6 | out [post update] : Intent [android.content.Intent.extras, ] : String | semmle.label | out [post update] : Intent [android.content.Intent.extras, ] : String | | Test.java:469:17:469:18 | in : String | semmle.label | in : String | | Test.java:470:9:470:40 | getMapKey(...) | semmle.label | getMapKey(...) | | Test.java:470:19:470:39 | getIntent_extras(...) : Bundle [] : String | semmle.label | getIntent_extras(...) : Bundle [] : String | | Test.java:470:36:470:38 | out : Intent [android.content.Intent.extras, ] : String | semmle.label | out : Intent [android.content.Intent.extras, ] : String | -| Test.java:470:36:470:38 | out : Intent [android.content.Intent.extras, ] : String | semmle.label | out : Intent [android.content.Intent.extras, ] : String | | Test.java:475:16:475:31 | (...)... : String | semmle.label | (...)... : String | | Test.java:475:24:475:31 | source(...) : Object | semmle.label | source(...) : Object | | Test.java:476:4:476:6 | out [post update] : Intent [android.content.Intent.extras, ] : String | semmle.label | out [post update] : Intent [android.content.Intent.extras, ] : String | -| Test.java:476:4:476:6 | out [post update] : Intent [android.content.Intent.extras, ] : String | semmle.label | out [post update] : Intent [android.content.Intent.extras, ] : String | | Test.java:476:17:476:18 | in : String | semmle.label | in : String | | Test.java:477:9:477:40 | getMapKey(...) | semmle.label | getMapKey(...) | | Test.java:477:19:477:39 | getIntent_extras(...) : Bundle [] : String | semmle.label | getIntent_extras(...) : Bundle [] : String | | Test.java:477:36:477:38 | out : Intent [android.content.Intent.extras, ] : String | semmle.label | out : Intent [android.content.Intent.extras, ] : String | -| Test.java:477:36:477:38 | out : Intent [android.content.Intent.extras, ] : String | semmle.label | out : Intent [android.content.Intent.extras, ] : String | | Test.java:482:16:482:31 | (...)... : String | semmle.label | (...)... : String | | Test.java:482:24:482:31 | source(...) : Object | semmle.label | source(...) : Object | | Test.java:483:4:483:6 | out [post update] : Intent [android.content.Intent.extras, ] : String | semmle.label | out [post update] : Intent [android.content.Intent.extras, ] : String | -| Test.java:483:4:483:6 | out [post update] : Intent [android.content.Intent.extras, ] : String | semmle.label | out [post update] : Intent [android.content.Intent.extras, ] : String | | Test.java:483:17:483:18 | in : String | semmle.label | in : String | | Test.java:484:9:484:40 | getMapKey(...) | semmle.label | getMapKey(...) | | Test.java:484:19:484:39 | getIntent_extras(...) : Bundle [] : String | semmle.label | getIntent_extras(...) : Bundle [] : String | | Test.java:484:36:484:38 | out : Intent [android.content.Intent.extras, ] : String | semmle.label | out : Intent [android.content.Intent.extras, ] : String | -| Test.java:484:36:484:38 | out : Intent [android.content.Intent.extras, ] : String | semmle.label | out : Intent [android.content.Intent.extras, ] : String | | Test.java:489:16:489:31 | (...)... : String | semmle.label | (...)... : String | | Test.java:489:24:489:31 | source(...) : Object | semmle.label | source(...) : Object | | Test.java:490:4:490:6 | out [post update] : Intent [android.content.Intent.extras, ] : String | semmle.label | out [post update] : Intent [android.content.Intent.extras, ] : String | -| Test.java:490:4:490:6 | out [post update] : Intent [android.content.Intent.extras, ] : String | semmle.label | out [post update] : Intent [android.content.Intent.extras, ] : String | | Test.java:490:17:490:18 | in : String | semmle.label | in : String | | Test.java:491:9:491:40 | getMapKey(...) | semmle.label | getMapKey(...) | | Test.java:491:19:491:39 | getIntent_extras(...) : Bundle [] : String | semmle.label | getIntent_extras(...) : Bundle [] : String | | Test.java:491:36:491:38 | out : Intent [android.content.Intent.extras, ] : String | semmle.label | out : Intent [android.content.Intent.extras, ] : String | -| Test.java:491:36:491:38 | out : Intent [android.content.Intent.extras, ] : String | semmle.label | out : Intent [android.content.Intent.extras, ] : String | | Test.java:496:16:496:31 | (...)... : String | semmle.label | (...)... : String | | Test.java:496:24:496:31 | source(...) : Object | semmle.label | source(...) : Object | | Test.java:497:4:497:6 | out [post update] : Intent [android.content.Intent.extras, ] : String | semmle.label | out [post update] : Intent [android.content.Intent.extras, ] : String | -| Test.java:497:4:497:6 | out [post update] : Intent [android.content.Intent.extras, ] : String | semmle.label | out [post update] : Intent [android.content.Intent.extras, ] : String | | Test.java:497:17:497:18 | in : String | semmle.label | in : String | | Test.java:498:9:498:40 | getMapKey(...) | semmle.label | getMapKey(...) | | Test.java:498:19:498:39 | getIntent_extras(...) : Bundle [] : String | semmle.label | getIntent_extras(...) : Bundle [] : String | | Test.java:498:36:498:38 | out : Intent [android.content.Intent.extras, ] : String | semmle.label | out : Intent [android.content.Intent.extras, ] : String | -| Test.java:498:36:498:38 | out : Intent [android.content.Intent.extras, ] : String | semmle.label | out : Intent [android.content.Intent.extras, ] : String | | Test.java:503:16:503:31 | (...)... : String | semmle.label | (...)... : String | | Test.java:503:24:503:31 | source(...) : Object | semmle.label | source(...) : Object | | Test.java:504:4:504:6 | out [post update] : Intent [android.content.Intent.extras, ] : String | semmle.label | out [post update] : Intent [android.content.Intent.extras, ] : String | -| Test.java:504:4:504:6 | out [post update] : Intent [android.content.Intent.extras, ] : String | semmle.label | out [post update] : Intent [android.content.Intent.extras, ] : String | | Test.java:504:17:504:18 | in : String | semmle.label | in : String | | Test.java:505:9:505:40 | getMapKey(...) | semmle.label | getMapKey(...) | | Test.java:505:19:505:39 | getIntent_extras(...) : Bundle [] : String | semmle.label | getIntent_extras(...) : Bundle [] : String | | Test.java:505:36:505:38 | out : Intent [android.content.Intent.extras, ] : String | semmle.label | out : Intent [android.content.Intent.extras, ] : String | -| Test.java:505:36:505:38 | out : Intent [android.content.Intent.extras, ] : String | semmle.label | out : Intent [android.content.Intent.extras, ] : String | | Test.java:510:16:510:31 | (...)... : String | semmle.label | (...)... : String | | Test.java:510:24:510:31 | source(...) : Object | semmle.label | source(...) : Object | | Test.java:511:4:511:6 | out [post update] : Intent [android.content.Intent.extras, ] : String | semmle.label | out [post update] : Intent [android.content.Intent.extras, ] : String | -| Test.java:511:4:511:6 | out [post update] : Intent [android.content.Intent.extras, ] : String | semmle.label | out [post update] : Intent [android.content.Intent.extras, ] : String | | Test.java:511:17:511:18 | in : String | semmle.label | in : String | | Test.java:512:9:512:40 | getMapKey(...) | semmle.label | getMapKey(...) | | Test.java:512:19:512:39 | getIntent_extras(...) : Bundle [] : String | semmle.label | getIntent_extras(...) : Bundle [] : String | | Test.java:512:36:512:38 | out : Intent [android.content.Intent.extras, ] : String | semmle.label | out : Intent [android.content.Intent.extras, ] : String | -| Test.java:512:36:512:38 | out : Intent [android.content.Intent.extras, ] : String | semmle.label | out : Intent [android.content.Intent.extras, ] : String | | Test.java:517:16:517:31 | (...)... : String | semmle.label | (...)... : String | | Test.java:517:24:517:31 | source(...) : Object | semmle.label | source(...) : Object | | Test.java:518:4:518:6 | out [post update] : Intent [android.content.Intent.extras, ] : String | semmle.label | out [post update] : Intent [android.content.Intent.extras, ] : String | -| Test.java:518:4:518:6 | out [post update] : Intent [android.content.Intent.extras, ] : String | semmle.label | out [post update] : Intent [android.content.Intent.extras, ] : String | | Test.java:518:17:518:18 | in : String | semmle.label | in : String | | Test.java:519:9:519:40 | getMapKey(...) | semmle.label | getMapKey(...) | | Test.java:519:19:519:39 | getIntent_extras(...) : Bundle [] : String | semmle.label | getIntent_extras(...) : Bundle [] : String | | Test.java:519:36:519:38 | out : Intent [android.content.Intent.extras, ] : String | semmle.label | out : Intent [android.content.Intent.extras, ] : String | -| Test.java:519:36:519:38 | out : Intent [android.content.Intent.extras, ] : String | semmle.label | out : Intent [android.content.Intent.extras, ] : String | | Test.java:524:16:524:31 | (...)... : String | semmle.label | (...)... : String | | Test.java:524:24:524:31 | source(...) : Object | semmle.label | source(...) : Object | | Test.java:525:4:525:6 | out [post update] : Intent [android.content.Intent.extras, ] : String | semmle.label | out [post update] : Intent [android.content.Intent.extras, ] : String | -| Test.java:525:4:525:6 | out [post update] : Intent [android.content.Intent.extras, ] : String | semmle.label | out [post update] : Intent [android.content.Intent.extras, ] : String | | Test.java:525:17:525:18 | in : String | semmle.label | in : String | | Test.java:526:9:526:40 | getMapKey(...) | semmle.label | getMapKey(...) | | Test.java:526:19:526:39 | getIntent_extras(...) : Bundle [] : String | semmle.label | getIntent_extras(...) : Bundle [] : String | | Test.java:526:36:526:38 | out : Intent [android.content.Intent.extras, ] : String | semmle.label | out : Intent [android.content.Intent.extras, ] : String | -| Test.java:526:36:526:38 | out : Intent [android.content.Intent.extras, ] : String | semmle.label | out : Intent [android.content.Intent.extras, ] : String | | Test.java:531:16:531:31 | (...)... : String | semmle.label | (...)... : String | | Test.java:531:24:531:31 | source(...) : Object | semmle.label | source(...) : Object | | Test.java:532:4:532:6 | out [post update] : Intent [android.content.Intent.extras, ] : String | semmle.label | out [post update] : Intent [android.content.Intent.extras, ] : String | -| Test.java:532:4:532:6 | out [post update] : Intent [android.content.Intent.extras, ] : String | semmle.label | out [post update] : Intent [android.content.Intent.extras, ] : String | | Test.java:532:17:532:18 | in : String | semmle.label | in : String | | Test.java:533:9:533:40 | getMapKey(...) | semmle.label | getMapKey(...) | | Test.java:533:19:533:39 | getIntent_extras(...) : Bundle [] : String | semmle.label | getIntent_extras(...) : Bundle [] : String | | Test.java:533:36:533:38 | out : Intent [android.content.Intent.extras, ] : String | semmle.label | out : Intent [android.content.Intent.extras, ] : String | -| Test.java:533:36:533:38 | out : Intent [android.content.Intent.extras, ] : String | semmle.label | out : Intent [android.content.Intent.extras, ] : String | | Test.java:538:16:538:31 | (...)... : String | semmle.label | (...)... : String | | Test.java:538:24:538:31 | source(...) : Object | semmle.label | source(...) : Object | | Test.java:539:4:539:6 | out [post update] : Intent [android.content.Intent.extras, ] : String | semmle.label | out [post update] : Intent [android.content.Intent.extras, ] : String | -| Test.java:539:4:539:6 | out [post update] : Intent [android.content.Intent.extras, ] : String | semmle.label | out [post update] : Intent [android.content.Intent.extras, ] : String | | Test.java:539:17:539:18 | in : String | semmle.label | in : String | | Test.java:540:9:540:40 | getMapKey(...) | semmle.label | getMapKey(...) | | Test.java:540:19:540:39 | getIntent_extras(...) : Bundle [] : String | semmle.label | getIntent_extras(...) : Bundle [] : String | | Test.java:540:36:540:38 | out : Intent [android.content.Intent.extras, ] : String | semmle.label | out : Intent [android.content.Intent.extras, ] : String | -| Test.java:540:36:540:38 | out : Intent [android.content.Intent.extras, ] : String | semmle.label | out : Intent [android.content.Intent.extras, ] : String | | Test.java:545:16:545:31 | (...)... : String | semmle.label | (...)... : String | | Test.java:545:24:545:31 | source(...) : Object | semmle.label | source(...) : Object | | Test.java:546:4:546:6 | out [post update] : Intent [android.content.Intent.extras, ] : String | semmle.label | out [post update] : Intent [android.content.Intent.extras, ] : String | -| Test.java:546:4:546:6 | out [post update] : Intent [android.content.Intent.extras, ] : String | semmle.label | out [post update] : Intent [android.content.Intent.extras, ] : String | | Test.java:546:17:546:18 | in : String | semmle.label | in : String | | Test.java:547:9:547:40 | getMapKey(...) | semmle.label | getMapKey(...) | | Test.java:547:19:547:39 | getIntent_extras(...) : Bundle [] : String | semmle.label | getIntent_extras(...) : Bundle [] : String | | Test.java:547:36:547:38 | out : Intent [android.content.Intent.extras, ] : String | semmle.label | out : Intent [android.content.Intent.extras, ] : String | -| Test.java:547:36:547:38 | out : Intent [android.content.Intent.extras, ] : String | semmle.label | out : Intent [android.content.Intent.extras, ] : String | | Test.java:552:16:552:31 | (...)... : String | semmle.label | (...)... : String | | Test.java:552:24:552:31 | source(...) : Object | semmle.label | source(...) : Object | | Test.java:553:4:553:6 | out [post update] : Intent [android.content.Intent.extras, ] : String | semmle.label | out [post update] : Intent [android.content.Intent.extras, ] : String | -| Test.java:553:4:553:6 | out [post update] : Intent [android.content.Intent.extras, ] : String | semmle.label | out [post update] : Intent [android.content.Intent.extras, ] : String | | Test.java:553:17:553:18 | in : String | semmle.label | in : String | | Test.java:554:9:554:40 | getMapKey(...) | semmle.label | getMapKey(...) | | Test.java:554:19:554:39 | getIntent_extras(...) : Bundle [] : String | semmle.label | getIntent_extras(...) : Bundle [] : String | | Test.java:554:36:554:38 | out : Intent [android.content.Intent.extras, ] : String | semmle.label | out : Intent [android.content.Intent.extras, ] : String | -| Test.java:554:36:554:38 | out : Intent [android.content.Intent.extras, ] : String | semmle.label | out : Intent [android.content.Intent.extras, ] : String | | Test.java:559:16:559:31 | (...)... : String | semmle.label | (...)... : String | | Test.java:559:24:559:31 | source(...) : Object | semmle.label | source(...) : Object | | Test.java:560:4:560:6 | out [post update] : Intent [android.content.Intent.extras, ] : String | semmle.label | out [post update] : Intent [android.content.Intent.extras, ] : String | -| Test.java:560:4:560:6 | out [post update] : Intent [android.content.Intent.extras, ] : String | semmle.label | out [post update] : Intent [android.content.Intent.extras, ] : String | | Test.java:560:17:560:18 | in : String | semmle.label | in : String | | Test.java:561:9:561:40 | getMapKey(...) | semmle.label | getMapKey(...) | | Test.java:561:19:561:39 | getIntent_extras(...) : Bundle [] : String | semmle.label | getIntent_extras(...) : Bundle [] : String | | Test.java:561:36:561:38 | out : Intent [android.content.Intent.extras, ] : String | semmle.label | out : Intent [android.content.Intent.extras, ] : String | -| Test.java:561:36:561:38 | out : Intent [android.content.Intent.extras, ] : String | semmle.label | out : Intent [android.content.Intent.extras, ] : String | | Test.java:566:16:566:31 | (...)... : String | semmle.label | (...)... : String | | Test.java:566:24:566:31 | source(...) : Object | semmle.label | source(...) : Object | | Test.java:567:4:567:6 | out [post update] : Intent [android.content.Intent.extras, ] : String | semmle.label | out [post update] : Intent [android.content.Intent.extras, ] : String | -| Test.java:567:4:567:6 | out [post update] : Intent [android.content.Intent.extras, ] : String | semmle.label | out [post update] : Intent [android.content.Intent.extras, ] : String | | Test.java:567:17:567:18 | in : String | semmle.label | in : String | | Test.java:568:9:568:40 | getMapKey(...) | semmle.label | getMapKey(...) | | Test.java:568:19:568:39 | getIntent_extras(...) : Bundle [] : String | semmle.label | getIntent_extras(...) : Bundle [] : String | | Test.java:568:36:568:38 | out : Intent [android.content.Intent.extras, ] : String | semmle.label | out : Intent [android.content.Intent.extras, ] : String | -| Test.java:568:36:568:38 | out : Intent [android.content.Intent.extras, ] : String | semmle.label | out : Intent [android.content.Intent.extras, ] : String | | Test.java:573:16:573:31 | (...)... : String | semmle.label | (...)... : String | | Test.java:573:24:573:31 | source(...) : Object | semmle.label | source(...) : Object | | Test.java:574:4:574:6 | out [post update] : Intent [android.content.Intent.extras, ] : String | semmle.label | out [post update] : Intent [android.content.Intent.extras, ] : String | -| Test.java:574:4:574:6 | out [post update] : Intent [android.content.Intent.extras, ] : String | semmle.label | out [post update] : Intent [android.content.Intent.extras, ] : String | | Test.java:574:17:574:18 | in : String | semmle.label | in : String | | Test.java:575:9:575:40 | getMapKey(...) | semmle.label | getMapKey(...) | | Test.java:575:19:575:39 | getIntent_extras(...) : Bundle [] : String | semmle.label | getIntent_extras(...) : Bundle [] : String | | Test.java:575:36:575:38 | out : Intent [android.content.Intent.extras, ] : String | semmle.label | out : Intent [android.content.Intent.extras, ] : String | -| Test.java:575:36:575:38 | out : Intent [android.content.Intent.extras, ] : String | semmle.label | out : Intent [android.content.Intent.extras, ] : String | | Test.java:580:16:580:31 | (...)... : String | semmle.label | (...)... : String | | Test.java:580:24:580:31 | source(...) : Object | semmle.label | source(...) : Object | | Test.java:581:4:581:6 | out [post update] : Intent [android.content.Intent.extras, ] : String | semmle.label | out [post update] : Intent [android.content.Intent.extras, ] : String | -| Test.java:581:4:581:6 | out [post update] : Intent [android.content.Intent.extras, ] : String | semmle.label | out [post update] : Intent [android.content.Intent.extras, ] : String | | Test.java:581:17:581:18 | in : String | semmle.label | in : String | | Test.java:582:9:582:40 | getMapKey(...) | semmle.label | getMapKey(...) | | Test.java:582:19:582:39 | getIntent_extras(...) : Bundle [] : String | semmle.label | getIntent_extras(...) : Bundle [] : String | | Test.java:582:36:582:38 | out : Intent [android.content.Intent.extras, ] : String | semmle.label | out : Intent [android.content.Intent.extras, ] : String | -| Test.java:582:36:582:38 | out : Intent [android.content.Intent.extras, ] : String | semmle.label | out : Intent [android.content.Intent.extras, ] : String | | Test.java:587:16:587:31 | (...)... : String | semmle.label | (...)... : String | | Test.java:587:24:587:31 | source(...) : Object | semmle.label | source(...) : Object | | Test.java:588:4:588:6 | out [post update] : Intent [android.content.Intent.extras, ] : String | semmle.label | out [post update] : Intent [android.content.Intent.extras, ] : String | -| Test.java:588:4:588:6 | out [post update] : Intent [android.content.Intent.extras, ] : String | semmle.label | out [post update] : Intent [android.content.Intent.extras, ] : String | | Test.java:588:17:588:18 | in : String | semmle.label | in : String | | Test.java:589:9:589:40 | getMapKey(...) | semmle.label | getMapKey(...) | | Test.java:589:19:589:39 | getIntent_extras(...) : Bundle [] : String | semmle.label | getIntent_extras(...) : Bundle [] : String | | Test.java:589:36:589:38 | out : Intent [android.content.Intent.extras, ] : String | semmle.label | out : Intent [android.content.Intent.extras, ] : String | -| Test.java:589:36:589:38 | out : Intent [android.content.Intent.extras, ] : String | semmle.label | out : Intent [android.content.Intent.extras, ] : String | | Test.java:594:17:594:33 | (...)... : short[] | semmle.label | (...)... : short[] | | Test.java:594:26:594:33 | source(...) : Object | semmle.label | source(...) : Object | | Test.java:595:4:595:6 | out [post update] : Intent [android.content.Intent.extras, ] : short[] | semmle.label | out [post update] : Intent [android.content.Intent.extras, ] : short[] | -| Test.java:595:4:595:6 | out [post update] : Intent [android.content.Intent.extras, ] : short[] | semmle.label | out [post update] : Intent [android.content.Intent.extras, ] : short[] | | Test.java:595:31:595:32 | in : short[] | semmle.label | in : short[] | | Test.java:596:9:596:42 | getMapValue(...) | semmle.label | getMapValue(...) | | Test.java:596:21:596:41 | getIntent_extras(...) : Bundle [] : short[] | semmle.label | getIntent_extras(...) : Bundle [] : short[] | | Test.java:596:38:596:40 | out : Intent [android.content.Intent.extras, ] : short[] | semmle.label | out : Intent [android.content.Intent.extras, ] : short[] | -| Test.java:596:38:596:40 | out : Intent [android.content.Intent.extras, ] : short[] | semmle.label | out : Intent [android.content.Intent.extras, ] : short[] | | Test.java:601:15:601:29 | (...)... : Number | semmle.label | (...)... : Number | | Test.java:601:22:601:29 | source(...) : Object | semmle.label | source(...) : Object | | Test.java:602:4:602:6 | out [post update] : Intent [android.content.Intent.extras, ] : Number | semmle.label | out [post update] : Intent [android.content.Intent.extras, ] : Number | -| Test.java:602:4:602:6 | out [post update] : Intent [android.content.Intent.extras, ] : Number | semmle.label | out [post update] : Intent [android.content.Intent.extras, ] : Number | | Test.java:602:31:602:32 | in : Number | semmle.label | in : Number | | Test.java:603:9:603:42 | getMapValue(...) | semmle.label | getMapValue(...) | | Test.java:603:21:603:41 | getIntent_extras(...) : Bundle [] : Number | semmle.label | getIntent_extras(...) : Bundle [] : Number | | Test.java:603:38:603:40 | out : Intent [android.content.Intent.extras, ] : Number | semmle.label | out : Intent [android.content.Intent.extras, ] : Number | -| Test.java:603:38:603:40 | out : Intent [android.content.Intent.extras, ] : Number | semmle.label | out : Intent [android.content.Intent.extras, ] : Number | | Test.java:608:16:608:31 | (...)... : long[] | semmle.label | (...)... : long[] | | Test.java:608:24:608:31 | source(...) : Object | semmle.label | source(...) : Object | | Test.java:609:4:609:6 | out [post update] : Intent [android.content.Intent.extras, ] : long[] | semmle.label | out [post update] : Intent [android.content.Intent.extras, ] : long[] | -| Test.java:609:4:609:6 | out [post update] : Intent [android.content.Intent.extras, ] : long[] | semmle.label | out [post update] : Intent [android.content.Intent.extras, ] : long[] | | Test.java:609:31:609:32 | in : long[] | semmle.label | in : long[] | | Test.java:610:9:610:42 | getMapValue(...) | semmle.label | getMapValue(...) | | Test.java:610:21:610:41 | getIntent_extras(...) : Bundle [] : long[] | semmle.label | getIntent_extras(...) : Bundle [] : long[] | | Test.java:610:38:610:40 | out : Intent [android.content.Intent.extras, ] : long[] | semmle.label | out : Intent [android.content.Intent.extras, ] : long[] | -| Test.java:610:38:610:40 | out : Intent [android.content.Intent.extras, ] : long[] | semmle.label | out : Intent [android.content.Intent.extras, ] : long[] | | Test.java:615:14:615:27 | (...)... : Number | semmle.label | (...)... : Number | | Test.java:615:20:615:27 | source(...) : Object | semmle.label | source(...) : Object | | Test.java:616:4:616:6 | out [post update] : Intent [android.content.Intent.extras, ] : Number | semmle.label | out [post update] : Intent [android.content.Intent.extras, ] : Number | -| Test.java:616:4:616:6 | out [post update] : Intent [android.content.Intent.extras, ] : Number | semmle.label | out [post update] : Intent [android.content.Intent.extras, ] : Number | | Test.java:616:31:616:32 | in : Number | semmle.label | in : Number | | Test.java:617:9:617:42 | getMapValue(...) | semmle.label | getMapValue(...) | | Test.java:617:21:617:41 | getIntent_extras(...) : Bundle [] : Number | semmle.label | getIntent_extras(...) : Bundle [] : Number | | Test.java:617:38:617:40 | out : Intent [android.content.Intent.extras, ] : Number | semmle.label | out : Intent [android.content.Intent.extras, ] : Number | -| Test.java:617:38:617:40 | out : Intent [android.content.Intent.extras, ] : Number | semmle.label | out : Intent [android.content.Intent.extras, ] : Number | | Test.java:622:15:622:29 | (...)... : int[] | semmle.label | (...)... : int[] | | Test.java:622:22:622:29 | source(...) : Object | semmle.label | source(...) : Object | | Test.java:623:4:623:6 | out [post update] : Intent [android.content.Intent.extras, ] : int[] | semmle.label | out [post update] : Intent [android.content.Intent.extras, ] : int[] | -| Test.java:623:4:623:6 | out [post update] : Intent [android.content.Intent.extras, ] : int[] | semmle.label | out [post update] : Intent [android.content.Intent.extras, ] : int[] | | Test.java:623:31:623:32 | in : int[] | semmle.label | in : int[] | | Test.java:624:9:624:42 | getMapValue(...) | semmle.label | getMapValue(...) | | Test.java:624:21:624:41 | getIntent_extras(...) : Bundle [] : int[] | semmle.label | getIntent_extras(...) : Bundle [] : int[] | | Test.java:624:38:624:40 | out : Intent [android.content.Intent.extras, ] : int[] | semmle.label | out : Intent [android.content.Intent.extras, ] : int[] | -| Test.java:624:38:624:40 | out : Intent [android.content.Intent.extras, ] : int[] | semmle.label | out : Intent [android.content.Intent.extras, ] : int[] | | Test.java:629:13:629:25 | (...)... : Number | semmle.label | (...)... : Number | | Test.java:629:18:629:25 | source(...) : Object | semmle.label | source(...) : Object | | Test.java:630:4:630:6 | out [post update] : Intent [android.content.Intent.extras, ] : Number | semmle.label | out [post update] : Intent [android.content.Intent.extras, ] : Number | -| Test.java:630:4:630:6 | out [post update] : Intent [android.content.Intent.extras, ] : Number | semmle.label | out [post update] : Intent [android.content.Intent.extras, ] : Number | | Test.java:630:31:630:32 | in : Number | semmle.label | in : Number | | Test.java:631:9:631:42 | getMapValue(...) | semmle.label | getMapValue(...) | | Test.java:631:21:631:41 | getIntent_extras(...) : Bundle [] : Number | semmle.label | getIntent_extras(...) : Bundle [] : Number | | Test.java:631:38:631:40 | out : Intent [android.content.Intent.extras, ] : Number | semmle.label | out : Intent [android.content.Intent.extras, ] : Number | -| Test.java:631:38:631:40 | out : Intent [android.content.Intent.extras, ] : Number | semmle.label | out : Intent [android.content.Intent.extras, ] : Number | | Test.java:636:17:636:33 | (...)... : float[] | semmle.label | (...)... : float[] | | Test.java:636:26:636:33 | source(...) : Object | semmle.label | source(...) : Object | | Test.java:637:4:637:6 | out [post update] : Intent [android.content.Intent.extras, ] : float[] | semmle.label | out [post update] : Intent [android.content.Intent.extras, ] : float[] | -| Test.java:637:4:637:6 | out [post update] : Intent [android.content.Intent.extras, ] : float[] | semmle.label | out [post update] : Intent [android.content.Intent.extras, ] : float[] | | Test.java:637:31:637:32 | in : float[] | semmle.label | in : float[] | | Test.java:638:9:638:42 | getMapValue(...) | semmle.label | getMapValue(...) | | Test.java:638:21:638:41 | getIntent_extras(...) : Bundle [] : float[] | semmle.label | getIntent_extras(...) : Bundle [] : float[] | | Test.java:638:38:638:40 | out : Intent [android.content.Intent.extras, ] : float[] | semmle.label | out : Intent [android.content.Intent.extras, ] : float[] | -| Test.java:638:38:638:40 | out : Intent [android.content.Intent.extras, ] : float[] | semmle.label | out : Intent [android.content.Intent.extras, ] : float[] | | Test.java:643:15:643:29 | (...)... : Number | semmle.label | (...)... : Number | | Test.java:643:22:643:29 | source(...) : Object | semmle.label | source(...) : Object | | Test.java:644:4:644:6 | out [post update] : Intent [android.content.Intent.extras, ] : Number | semmle.label | out [post update] : Intent [android.content.Intent.extras, ] : Number | -| Test.java:644:4:644:6 | out [post update] : Intent [android.content.Intent.extras, ] : Number | semmle.label | out [post update] : Intent [android.content.Intent.extras, ] : Number | | Test.java:644:31:644:32 | in : Number | semmle.label | in : Number | | Test.java:645:9:645:42 | getMapValue(...) | semmle.label | getMapValue(...) | | Test.java:645:21:645:41 | getIntent_extras(...) : Bundle [] : Number | semmle.label | getIntent_extras(...) : Bundle [] : Number | | Test.java:645:38:645:40 | out : Intent [android.content.Intent.extras, ] : Number | semmle.label | out : Intent [android.content.Intent.extras, ] : Number | -| Test.java:645:38:645:40 | out : Intent [android.content.Intent.extras, ] : Number | semmle.label | out : Intent [android.content.Intent.extras, ] : Number | | Test.java:650:18:650:35 | (...)... : double[] | semmle.label | (...)... : double[] | | Test.java:650:28:650:35 | source(...) : Object | semmle.label | source(...) : Object | | Test.java:651:4:651:6 | out [post update] : Intent [android.content.Intent.extras, ] : double[] | semmle.label | out [post update] : Intent [android.content.Intent.extras, ] : double[] | -| Test.java:651:4:651:6 | out [post update] : Intent [android.content.Intent.extras, ] : double[] | semmle.label | out [post update] : Intent [android.content.Intent.extras, ] : double[] | | Test.java:651:31:651:32 | in : double[] | semmle.label | in : double[] | | Test.java:652:9:652:42 | getMapValue(...) | semmle.label | getMapValue(...) | | Test.java:652:21:652:41 | getIntent_extras(...) : Bundle [] : double[] | semmle.label | getIntent_extras(...) : Bundle [] : double[] | | Test.java:652:38:652:40 | out : Intent [android.content.Intent.extras, ] : double[] | semmle.label | out : Intent [android.content.Intent.extras, ] : double[] | -| Test.java:652:38:652:40 | out : Intent [android.content.Intent.extras, ] : double[] | semmle.label | out : Intent [android.content.Intent.extras, ] : double[] | | Test.java:657:16:657:31 | (...)... : Number | semmle.label | (...)... : Number | | Test.java:657:24:657:31 | source(...) : Object | semmle.label | source(...) : Object | | Test.java:658:4:658:6 | out [post update] : Intent [android.content.Intent.extras, ] : Number | semmle.label | out [post update] : Intent [android.content.Intent.extras, ] : Number | -| Test.java:658:4:658:6 | out [post update] : Intent [android.content.Intent.extras, ] : Number | semmle.label | out [post update] : Intent [android.content.Intent.extras, ] : Number | | Test.java:658:31:658:32 | in : Number | semmle.label | in : Number | | Test.java:659:9:659:42 | getMapValue(...) | semmle.label | getMapValue(...) | | Test.java:659:21:659:41 | getIntent_extras(...) : Bundle [] : Number | semmle.label | getIntent_extras(...) : Bundle [] : Number | | Test.java:659:38:659:40 | out : Intent [android.content.Intent.extras, ] : Number | semmle.label | out : Intent [android.content.Intent.extras, ] : Number | -| Test.java:659:38:659:40 | out : Intent [android.content.Intent.extras, ] : Number | semmle.label | out : Intent [android.content.Intent.extras, ] : Number | | Test.java:664:16:664:31 | (...)... : char[] | semmle.label | (...)... : char[] | | Test.java:664:24:664:31 | source(...) : Object | semmle.label | source(...) : Object | | Test.java:665:4:665:6 | out [post update] : Intent [android.content.Intent.extras, ] : char[] | semmle.label | out [post update] : Intent [android.content.Intent.extras, ] : char[] | -| Test.java:665:4:665:6 | out [post update] : Intent [android.content.Intent.extras, ] : char[] | semmle.label | out [post update] : Intent [android.content.Intent.extras, ] : char[] | | Test.java:665:31:665:32 | in : char[] | semmle.label | in : char[] | | Test.java:666:9:666:42 | getMapValue(...) | semmle.label | getMapValue(...) | | Test.java:666:21:666:41 | getIntent_extras(...) : Bundle [] : char[] | semmle.label | getIntent_extras(...) : Bundle [] : char[] | | Test.java:666:38:666:40 | out : Intent [android.content.Intent.extras, ] : char[] | semmle.label | out : Intent [android.content.Intent.extras, ] : char[] | -| Test.java:666:38:666:40 | out : Intent [android.content.Intent.extras, ] : char[] | semmle.label | out : Intent [android.content.Intent.extras, ] : char[] | | Test.java:671:14:671:27 | (...)... : Number | semmle.label | (...)... : Number | | Test.java:671:20:671:27 | source(...) : Object | semmle.label | source(...) : Object | | Test.java:672:4:672:6 | out [post update] : Intent [android.content.Intent.extras, ] : Number | semmle.label | out [post update] : Intent [android.content.Intent.extras, ] : Number | -| Test.java:672:4:672:6 | out [post update] : Intent [android.content.Intent.extras, ] : Number | semmle.label | out [post update] : Intent [android.content.Intent.extras, ] : Number | | Test.java:672:31:672:32 | in : Number | semmle.label | in : Number | | Test.java:673:9:673:42 | getMapValue(...) | semmle.label | getMapValue(...) | | Test.java:673:21:673:41 | getIntent_extras(...) : Bundle [] : Number | semmle.label | getIntent_extras(...) : Bundle [] : Number | | Test.java:673:38:673:40 | out : Intent [android.content.Intent.extras, ] : Number | semmle.label | out : Intent [android.content.Intent.extras, ] : Number | -| Test.java:673:38:673:40 | out : Intent [android.content.Intent.extras, ] : Number | semmle.label | out : Intent [android.content.Intent.extras, ] : Number | | Test.java:678:16:678:31 | (...)... : byte[] | semmle.label | (...)... : byte[] | | Test.java:678:24:678:31 | source(...) : Object | semmle.label | source(...) : Object | | Test.java:679:4:679:6 | out [post update] : Intent [android.content.Intent.extras, ] : byte[] | semmle.label | out [post update] : Intent [android.content.Intent.extras, ] : byte[] | -| Test.java:679:4:679:6 | out [post update] : Intent [android.content.Intent.extras, ] : byte[] | semmle.label | out [post update] : Intent [android.content.Intent.extras, ] : byte[] | | Test.java:679:31:679:32 | in : byte[] | semmle.label | in : byte[] | | Test.java:680:9:680:42 | getMapValue(...) | semmle.label | getMapValue(...) | | Test.java:680:21:680:41 | getIntent_extras(...) : Bundle [] : byte[] | semmle.label | getIntent_extras(...) : Bundle [] : byte[] | | Test.java:680:38:680:40 | out : Intent [android.content.Intent.extras, ] : byte[] | semmle.label | out : Intent [android.content.Intent.extras, ] : byte[] | -| Test.java:680:38:680:40 | out : Intent [android.content.Intent.extras, ] : byte[] | semmle.label | out : Intent [android.content.Intent.extras, ] : byte[] | | Test.java:685:14:685:27 | (...)... : Number | semmle.label | (...)... : Number | | Test.java:685:20:685:27 | source(...) : Object | semmle.label | source(...) : Object | | Test.java:686:4:686:6 | out [post update] : Intent [android.content.Intent.extras, ] : Number | semmle.label | out [post update] : Intent [android.content.Intent.extras, ] : Number | -| Test.java:686:4:686:6 | out [post update] : Intent [android.content.Intent.extras, ] : Number | semmle.label | out [post update] : Intent [android.content.Intent.extras, ] : Number | | Test.java:686:31:686:32 | in : Number | semmle.label | in : Number | | Test.java:687:9:687:42 | getMapValue(...) | semmle.label | getMapValue(...) | | Test.java:687:21:687:41 | getIntent_extras(...) : Bundle [] : Number | semmle.label | getIntent_extras(...) : Bundle [] : Number | | Test.java:687:38:687:40 | out : Intent [android.content.Intent.extras, ] : Number | semmle.label | out : Intent [android.content.Intent.extras, ] : Number | -| Test.java:687:38:687:40 | out : Intent [android.content.Intent.extras, ] : Number | semmle.label | out : Intent [android.content.Intent.extras, ] : Number | | Test.java:692:19:692:37 | (...)... : boolean[] | semmle.label | (...)... : boolean[] | | Test.java:692:30:692:37 | source(...) : Object | semmle.label | source(...) : Object | | Test.java:693:4:693:6 | out [post update] : Intent [android.content.Intent.extras, ] : boolean[] | semmle.label | out [post update] : Intent [android.content.Intent.extras, ] : boolean[] | -| Test.java:693:4:693:6 | out [post update] : Intent [android.content.Intent.extras, ] : boolean[] | semmle.label | out [post update] : Intent [android.content.Intent.extras, ] : boolean[] | | Test.java:693:31:693:32 | in : boolean[] | semmle.label | in : boolean[] | | Test.java:694:9:694:42 | getMapValue(...) | semmle.label | getMapValue(...) | | Test.java:694:21:694:41 | getIntent_extras(...) : Bundle [] : boolean[] | semmle.label | getIntent_extras(...) : Bundle [] : boolean[] | | Test.java:694:38:694:40 | out : Intent [android.content.Intent.extras, ] : boolean[] | semmle.label | out : Intent [android.content.Intent.extras, ] : boolean[] | -| Test.java:694:38:694:40 | out : Intent [android.content.Intent.extras, ] : boolean[] | semmle.label | out : Intent [android.content.Intent.extras, ] : boolean[] | | Test.java:699:17:699:33 | (...)... : Boolean | semmle.label | (...)... : Boolean | | Test.java:699:26:699:33 | source(...) : Object | semmle.label | source(...) : Object | | Test.java:700:4:700:6 | out [post update] : Intent [android.content.Intent.extras, ] : Boolean | semmle.label | out [post update] : Intent [android.content.Intent.extras, ] : Boolean | -| Test.java:700:4:700:6 | out [post update] : Intent [android.content.Intent.extras, ] : Boolean | semmle.label | out [post update] : Intent [android.content.Intent.extras, ] : Boolean | | Test.java:700:31:700:32 | in : Boolean | semmle.label | in : Boolean | | Test.java:701:9:701:42 | getMapValue(...) | semmle.label | getMapValue(...) | | Test.java:701:21:701:41 | getIntent_extras(...) : Bundle [] : Boolean | semmle.label | getIntent_extras(...) : Bundle [] : Boolean | | Test.java:701:38:701:40 | out : Intent [android.content.Intent.extras, ] : Boolean | semmle.label | out : Intent [android.content.Intent.extras, ] : Boolean | -| Test.java:701:38:701:40 | out : Intent [android.content.Intent.extras, ] : Boolean | semmle.label | out : Intent [android.content.Intent.extras, ] : Boolean | | Test.java:706:18:706:35 | (...)... : String[] | semmle.label | (...)... : String[] | | Test.java:706:28:706:35 | source(...) : Object | semmle.label | source(...) : Object | | Test.java:707:4:707:6 | out [post update] : Intent [android.content.Intent.extras, ] : String[] | semmle.label | out [post update] : Intent [android.content.Intent.extras, ] : String[] | -| Test.java:707:4:707:6 | out [post update] : Intent [android.content.Intent.extras, ] : String[] | semmle.label | out [post update] : Intent [android.content.Intent.extras, ] : String[] | | Test.java:707:31:707:32 | in : String[] | semmle.label | in : String[] | | Test.java:708:9:708:42 | getMapValue(...) | semmle.label | getMapValue(...) | | Test.java:708:21:708:41 | getIntent_extras(...) : Bundle [] : String[] | semmle.label | getIntent_extras(...) : Bundle [] : String[] | | Test.java:708:38:708:40 | out : Intent [android.content.Intent.extras, ] : String[] | semmle.label | out : Intent [android.content.Intent.extras, ] : String[] | -| Test.java:708:38:708:40 | out : Intent [android.content.Intent.extras, ] : String[] | semmle.label | out : Intent [android.content.Intent.extras, ] : String[] | | Test.java:713:16:713:31 | (...)... : String | semmle.label | (...)... : String | | Test.java:713:24:713:31 | source(...) : Object | semmle.label | source(...) : Object | | Test.java:714:4:714:6 | out [post update] : Intent [android.content.Intent.extras, ] : String | semmle.label | out [post update] : Intent [android.content.Intent.extras, ] : String | -| Test.java:714:4:714:6 | out [post update] : Intent [android.content.Intent.extras, ] : String | semmle.label | out [post update] : Intent [android.content.Intent.extras, ] : String | | Test.java:714:31:714:32 | in : String | semmle.label | in : String | | Test.java:715:9:715:42 | getMapValue(...) | semmle.label | getMapValue(...) | | Test.java:715:21:715:41 | getIntent_extras(...) : Bundle [] : String | semmle.label | getIntent_extras(...) : Bundle [] : String | | Test.java:715:38:715:40 | out : Intent [android.content.Intent.extras, ] : String | semmle.label | out : Intent [android.content.Intent.extras, ] : String | -| Test.java:715:38:715:40 | out : Intent [android.content.Intent.extras, ] : String | semmle.label | out : Intent [android.content.Intent.extras, ] : String | | Test.java:720:22:720:43 | (...)... : Serializable | semmle.label | (...)... : Serializable | | Test.java:720:36:720:43 | source(...) : Object | semmle.label | source(...) : Object | | Test.java:721:4:721:6 | out [post update] : Intent [android.content.Intent.extras, ] : Serializable | semmle.label | out [post update] : Intent [android.content.Intent.extras, ] : Serializable | -| Test.java:721:4:721:6 | out [post update] : Intent [android.content.Intent.extras, ] : Serializable | semmle.label | out [post update] : Intent [android.content.Intent.extras, ] : Serializable | | Test.java:721:31:721:32 | in : Serializable | semmle.label | in : Serializable | | Test.java:722:9:722:42 | getMapValue(...) | semmle.label | getMapValue(...) | | Test.java:722:21:722:41 | getIntent_extras(...) : Bundle [] : Serializable | semmle.label | getIntent_extras(...) : Bundle [] : Serializable | | Test.java:722:38:722:40 | out : Intent [android.content.Intent.extras, ] : Serializable | semmle.label | out : Intent [android.content.Intent.extras, ] : Serializable | -| Test.java:722:38:722:40 | out : Intent [android.content.Intent.extras, ] : Serializable | semmle.label | out : Intent [android.content.Intent.extras, ] : Serializable | | Test.java:727:22:727:43 | (...)... : Parcelable[] | semmle.label | (...)... : Parcelable[] | | Test.java:727:36:727:43 | source(...) : Object | semmle.label | source(...) : Object | | Test.java:728:4:728:6 | out [post update] : Intent [android.content.Intent.extras, ] : Parcelable[] | semmle.label | out [post update] : Intent [android.content.Intent.extras, ] : Parcelable[] | -| Test.java:728:4:728:6 | out [post update] : Intent [android.content.Intent.extras, ] : Parcelable[] | semmle.label | out [post update] : Intent [android.content.Intent.extras, ] : Parcelable[] | | Test.java:728:31:728:32 | in : Parcelable[] | semmle.label | in : Parcelable[] | | Test.java:729:9:729:42 | getMapValue(...) | semmle.label | getMapValue(...) | | Test.java:729:21:729:41 | getIntent_extras(...) : Bundle [] : Parcelable[] | semmle.label | getIntent_extras(...) : Bundle [] : Parcelable[] | | Test.java:729:38:729:40 | out : Intent [android.content.Intent.extras, ] : Parcelable[] | semmle.label | out : Intent [android.content.Intent.extras, ] : Parcelable[] | -| Test.java:729:38:729:40 | out : Intent [android.content.Intent.extras, ] : Parcelable[] | semmle.label | out : Intent [android.content.Intent.extras, ] : Parcelable[] | | Test.java:734:20:734:39 | (...)... : Parcelable | semmle.label | (...)... : Parcelable | | Test.java:734:32:734:39 | source(...) : Object | semmle.label | source(...) : Object | | Test.java:735:4:735:6 | out [post update] : Intent [android.content.Intent.extras, ] : Parcelable | semmle.label | out [post update] : Intent [android.content.Intent.extras, ] : Parcelable | -| Test.java:735:4:735:6 | out [post update] : Intent [android.content.Intent.extras, ] : Parcelable | semmle.label | out [post update] : Intent [android.content.Intent.extras, ] : Parcelable | | Test.java:735:31:735:32 | in : Parcelable | semmle.label | in : Parcelable | | Test.java:736:9:736:42 | getMapValue(...) | semmle.label | getMapValue(...) | | Test.java:736:21:736:41 | getIntent_extras(...) : Bundle [] : Parcelable | semmle.label | getIntent_extras(...) : Bundle [] : Parcelable | | Test.java:736:38:736:40 | out : Intent [android.content.Intent.extras, ] : Parcelable | semmle.label | out : Intent [android.content.Intent.extras, ] : Parcelable | -| Test.java:736:38:736:40 | out : Intent [android.content.Intent.extras, ] : Parcelable | semmle.label | out : Intent [android.content.Intent.extras, ] : Parcelable | | Test.java:741:24:741:47 | (...)... : CharSequence[] | semmle.label | (...)... : CharSequence[] | | Test.java:741:40:741:47 | source(...) : Object | semmle.label | source(...) : Object | | Test.java:742:4:742:6 | out [post update] : Intent [android.content.Intent.extras, ] : CharSequence[] | semmle.label | out [post update] : Intent [android.content.Intent.extras, ] : CharSequence[] | -| Test.java:742:4:742:6 | out [post update] : Intent [android.content.Intent.extras, ] : CharSequence[] | semmle.label | out [post update] : Intent [android.content.Intent.extras, ] : CharSequence[] | | Test.java:742:31:742:32 | in : CharSequence[] | semmle.label | in : CharSequence[] | | Test.java:743:9:743:42 | getMapValue(...) | semmle.label | getMapValue(...) | | Test.java:743:21:743:41 | getIntent_extras(...) : Bundle [] : CharSequence[] | semmle.label | getIntent_extras(...) : Bundle [] : CharSequence[] | | Test.java:743:38:743:40 | out : Intent [android.content.Intent.extras, ] : CharSequence[] | semmle.label | out : Intent [android.content.Intent.extras, ] : CharSequence[] | -| Test.java:743:38:743:40 | out : Intent [android.content.Intent.extras, ] : CharSequence[] | semmle.label | out : Intent [android.content.Intent.extras, ] : CharSequence[] | | Test.java:748:22:748:43 | (...)... : CharSequence | semmle.label | (...)... : CharSequence | | Test.java:748:36:748:43 | source(...) : Object | semmle.label | source(...) : Object | | Test.java:749:4:749:6 | out [post update] : Intent [android.content.Intent.extras, ] : CharSequence | semmle.label | out [post update] : Intent [android.content.Intent.extras, ] : CharSequence | -| Test.java:749:4:749:6 | out [post update] : Intent [android.content.Intent.extras, ] : CharSequence | semmle.label | out [post update] : Intent [android.content.Intent.extras, ] : CharSequence | | Test.java:749:31:749:32 | in : CharSequence | semmle.label | in : CharSequence | | Test.java:750:9:750:42 | getMapValue(...) | semmle.label | getMapValue(...) | | Test.java:750:21:750:41 | getIntent_extras(...) : Bundle [] : CharSequence | semmle.label | getIntent_extras(...) : Bundle [] : CharSequence | | Test.java:750:38:750:40 | out : Intent [android.content.Intent.extras, ] : CharSequence | semmle.label | out : Intent [android.content.Intent.extras, ] : CharSequence | -| Test.java:750:38:750:40 | out : Intent [android.content.Intent.extras, ] : CharSequence | semmle.label | out : Intent [android.content.Intent.extras, ] : CharSequence | | Test.java:755:16:755:31 | (...)... : Bundle | semmle.label | (...)... : Bundle | | Test.java:755:24:755:31 | source(...) : Object | semmle.label | source(...) : Object | | Test.java:756:4:756:6 | out [post update] : Intent [android.content.Intent.extras, ] : Bundle | semmle.label | out [post update] : Intent [android.content.Intent.extras, ] : Bundle | -| Test.java:756:4:756:6 | out [post update] : Intent [android.content.Intent.extras, ] : Bundle | semmle.label | out [post update] : Intent [android.content.Intent.extras, ] : Bundle | | Test.java:756:31:756:32 | in : Bundle | semmle.label | in : Bundle | | Test.java:757:9:757:42 | getMapValue(...) | semmle.label | getMapValue(...) | | Test.java:757:21:757:41 | getIntent_extras(...) : Bundle [] : Bundle | semmle.label | getIntent_extras(...) : Bundle [] : Bundle | | Test.java:757:38:757:40 | out : Intent [android.content.Intent.extras, ] : Bundle | semmle.label | out : Intent [android.content.Intent.extras, ] : Bundle | -| Test.java:757:38:757:40 | out : Intent [android.content.Intent.extras, ] : Bundle | semmle.label | out : Intent [android.content.Intent.extras, ] : Bundle | | Test.java:762:16:762:31 | (...)... : Intent | semmle.label | (...)... : Intent | | Test.java:762:24:762:31 | source(...) : Object | semmle.label | source(...) : Object | | Test.java:763:10:763:11 | in : Intent | semmle.label | in : Intent | @@ -3386,22 +2623,18 @@ nodes | Test.java:769:24:769:52 | newBundleWithMapKey(...) : Bundle [] : String | semmle.label | newBundleWithMapKey(...) : Bundle [] : String | | Test.java:769:44:769:51 | source(...) : String | semmle.label | source(...) : String | | Test.java:770:4:770:6 | out [post update] : Intent [android.content.Intent.extras, ] : String | semmle.label | out [post update] : Intent [android.content.Intent.extras, ] : String | -| Test.java:770:4:770:6 | out [post update] : Intent [android.content.Intent.extras, ] : String | semmle.label | out [post update] : Intent [android.content.Intent.extras, ] : String | | Test.java:770:18:770:19 | in : Bundle [] : String | semmle.label | in : Bundle [] : String | | Test.java:771:9:771:40 | getMapKey(...) | semmle.label | getMapKey(...) | | Test.java:771:19:771:39 | getIntent_extras(...) : Bundle [] : String | semmle.label | getIntent_extras(...) : Bundle [] : String | | Test.java:771:36:771:38 | out : Intent [android.content.Intent.extras, ] : String | semmle.label | out : Intent [android.content.Intent.extras, ] : String | -| Test.java:771:36:771:38 | out : Intent [android.content.Intent.extras, ] : String | semmle.label | out : Intent [android.content.Intent.extras, ] : String | | Test.java:776:16:776:54 | (...)... : Bundle [] : Object | semmle.label | (...)... : Bundle [] : Object | | Test.java:776:24:776:54 | newBundleWithMapValue(...) : Bundle [] : Object | semmle.label | newBundleWithMapValue(...) : Bundle [] : Object | | Test.java:776:46:776:53 | source(...) : Object | semmle.label | source(...) : Object | | Test.java:777:4:777:6 | out [post update] : Intent [android.content.Intent.extras, ] : Object | semmle.label | out [post update] : Intent [android.content.Intent.extras, ] : Object | -| Test.java:777:4:777:6 | out [post update] : Intent [android.content.Intent.extras, ] : Object | semmle.label | out [post update] : Intent [android.content.Intent.extras, ] : Object | | Test.java:777:18:777:19 | in : Bundle [] : Object | semmle.label | in : Bundle [] : Object | | Test.java:778:9:778:42 | getMapValue(...) | semmle.label | getMapValue(...) | | Test.java:778:21:778:41 | getIntent_extras(...) : Bundle [] : Object | semmle.label | getIntent_extras(...) : Bundle [] : Object | | Test.java:778:38:778:40 | out : Intent [android.content.Intent.extras, ] : Object | semmle.label | out : Intent [android.content.Intent.extras, ] : Object | -| Test.java:778:38:778:40 | out : Intent [android.content.Intent.extras, ] : Object | semmle.label | out : Intent [android.content.Intent.extras, ] : Object | | Test.java:783:16:783:31 | (...)... : Intent | semmle.label | (...)... : Intent | | Test.java:783:24:783:31 | source(...) : Object | semmle.label | source(...) : Object | | Test.java:784:10:784:11 | in : Intent | semmle.label | in : Intent | @@ -3412,23 +2645,19 @@ nodes | Test.java:790:45:790:73 | newBundleWithMapKey(...) : Bundle [] : String | semmle.label | newBundleWithMapKey(...) : Bundle [] : String | | Test.java:790:65:790:72 | source(...) : String | semmle.label | source(...) : String | | Test.java:791:4:791:6 | out [post update] : Intent [android.content.Intent.extras, ] : String | semmle.label | out [post update] : Intent [android.content.Intent.extras, ] : String | -| Test.java:791:4:791:6 | out [post update] : Intent [android.content.Intent.extras, ] : String | semmle.label | out [post update] : Intent [android.content.Intent.extras, ] : String | | Test.java:791:18:791:19 | in : Intent [android.content.Intent.extras, ] : String | semmle.label | in : Intent [android.content.Intent.extras, ] : String | | Test.java:792:9:792:40 | getMapKey(...) | semmle.label | getMapKey(...) | | Test.java:792:19:792:39 | getIntent_extras(...) : Bundle [] : String | semmle.label | getIntent_extras(...) : Bundle [] : String | | Test.java:792:36:792:38 | out : Intent [android.content.Intent.extras, ] : String | semmle.label | out : Intent [android.content.Intent.extras, ] : String | -| Test.java:792:36:792:38 | out : Intent [android.content.Intent.extras, ] : String | semmle.label | out : Intent [android.content.Intent.extras, ] : String | | Test.java:797:16:797:76 | (...)... : Intent [android.content.Intent.extras, ] : Object | semmle.label | (...)... : Intent [android.content.Intent.extras, ] : Object | | Test.java:797:24:797:76 | newWithIntent_extras(...) : Intent [android.content.Intent.extras, ] : Object | semmle.label | newWithIntent_extras(...) : Intent [android.content.Intent.extras, ] : Object | | Test.java:797:45:797:75 | newBundleWithMapValue(...) : Bundle [] : Object | semmle.label | newBundleWithMapValue(...) : Bundle [] : Object | | Test.java:797:67:797:74 | source(...) : Object | semmle.label | source(...) : Object | | Test.java:798:4:798:6 | out [post update] : Intent [android.content.Intent.extras, ] : Object | semmle.label | out [post update] : Intent [android.content.Intent.extras, ] : Object | -| Test.java:798:4:798:6 | out [post update] : Intent [android.content.Intent.extras, ] : Object | semmle.label | out [post update] : Intent [android.content.Intent.extras, ] : Object | | Test.java:798:18:798:19 | in : Intent [android.content.Intent.extras, ] : Object | semmle.label | in : Intent [android.content.Intent.extras, ] : Object | | Test.java:799:9:799:42 | getMapValue(...) | semmle.label | getMapValue(...) | | Test.java:799:21:799:41 | getIntent_extras(...) : Bundle [] : Object | semmle.label | getIntent_extras(...) : Bundle [] : Object | | Test.java:799:38:799:40 | out : Intent [android.content.Intent.extras, ] : Object | semmle.label | out : Intent [android.content.Intent.extras, ] : Object | -| Test.java:799:38:799:40 | out : Intent [android.content.Intent.extras, ] : Object | semmle.label | out : Intent [android.content.Intent.extras, ] : Object | | Test.java:804:16:804:31 | (...)... : Intent | semmle.label | (...)... : Intent | | Test.java:804:24:804:31 | source(...) : Object | semmle.label | source(...) : Object | | Test.java:805:10:805:11 | in : Intent | semmle.label | in : Intent | @@ -3437,12 +2666,10 @@ nodes | Test.java:811:16:811:31 | (...)... : String | semmle.label | (...)... : String | | Test.java:811:24:811:31 | source(...) : Object | semmle.label | source(...) : Object | | Test.java:812:4:812:6 | out [post update] : Intent [android.content.Intent.extras, ] : String | semmle.label | out [post update] : Intent [android.content.Intent.extras, ] : String | -| Test.java:812:4:812:6 | out [post update] : Intent [android.content.Intent.extras, ] : String | semmle.label | out [post update] : Intent [android.content.Intent.extras, ] : String | | Test.java:812:33:812:34 | in : String | semmle.label | in : String | | Test.java:813:9:813:40 | getMapKey(...) | semmle.label | getMapKey(...) | | Test.java:813:19:813:39 | getIntent_extras(...) : Bundle [] : String | semmle.label | getIntent_extras(...) : Bundle [] : String | | Test.java:813:36:813:38 | out : Intent [android.content.Intent.extras, ] : String | semmle.label | out : Intent [android.content.Intent.extras, ] : String | -| Test.java:813:36:813:38 | out : Intent [android.content.Intent.extras, ] : String | semmle.label | out : Intent [android.content.Intent.extras, ] : String | | Test.java:818:16:818:31 | (...)... : Intent | semmle.label | (...)... : Intent | | Test.java:818:24:818:31 | source(...) : Object | semmle.label | source(...) : Object | | Test.java:819:10:819:11 | in : Intent | semmle.label | in : Intent | @@ -3451,21 +2678,17 @@ nodes | Test.java:825:16:825:31 | (...)... : String | semmle.label | (...)... : String | | Test.java:825:24:825:31 | source(...) : Object | semmle.label | source(...) : Object | | Test.java:826:4:826:6 | out [post update] : Intent [android.content.Intent.extras, ] : String | semmle.label | out [post update] : Intent [android.content.Intent.extras, ] : String | -| Test.java:826:4:826:6 | out [post update] : Intent [android.content.Intent.extras, ] : String | semmle.label | out [post update] : Intent [android.content.Intent.extras, ] : String | | Test.java:826:36:826:37 | in : String | semmle.label | in : String | | Test.java:827:9:827:40 | getMapKey(...) | semmle.label | getMapKey(...) | | Test.java:827:19:827:39 | getIntent_extras(...) : Bundle [] : String | semmle.label | getIntent_extras(...) : Bundle [] : String | | Test.java:827:36:827:38 | out : Intent [android.content.Intent.extras, ] : String | semmle.label | out : Intent [android.content.Intent.extras, ] : String | -| Test.java:827:36:827:38 | out : Intent [android.content.Intent.extras, ] : String | semmle.label | out : Intent [android.content.Intent.extras, ] : String | | Test.java:832:19:832:37 | (...)... : ArrayList | semmle.label | (...)... : ArrayList | | Test.java:832:30:832:37 | source(...) : Object | semmle.label | source(...) : Object | | Test.java:833:4:833:6 | out [post update] : Intent [android.content.Intent.extras, ] : ArrayList | semmle.label | out [post update] : Intent [android.content.Intent.extras, ] : ArrayList | -| Test.java:833:4:833:6 | out [post update] : Intent [android.content.Intent.extras, ] : ArrayList | semmle.label | out [post update] : Intent [android.content.Intent.extras, ] : ArrayList | | Test.java:833:42:833:43 | in : ArrayList | semmle.label | in : ArrayList | | Test.java:834:9:834:42 | getMapValue(...) | semmle.label | getMapValue(...) | | Test.java:834:21:834:41 | getIntent_extras(...) : Bundle [] : ArrayList | semmle.label | getIntent_extras(...) : Bundle [] : ArrayList | | Test.java:834:38:834:40 | out : Intent [android.content.Intent.extras, ] : ArrayList | semmle.label | out : Intent [android.content.Intent.extras, ] : ArrayList | -| Test.java:834:38:834:40 | out : Intent [android.content.Intent.extras, ] : ArrayList | semmle.label | out : Intent [android.content.Intent.extras, ] : ArrayList | | Test.java:839:16:839:31 | (...)... : Intent | semmle.label | (...)... : Intent | | Test.java:839:24:839:31 | source(...) : Object | semmle.label | source(...) : Object | | Test.java:840:10:840:11 | in : Intent | semmle.label | in : Intent | @@ -3474,21 +2697,17 @@ nodes | Test.java:846:16:846:31 | (...)... : String | semmle.label | (...)... : String | | Test.java:846:24:846:31 | source(...) : Object | semmle.label | source(...) : Object | | Test.java:847:4:847:6 | out [post update] : Intent [android.content.Intent.extras, ] : String | semmle.label | out [post update] : Intent [android.content.Intent.extras, ] : String | -| Test.java:847:4:847:6 | out [post update] : Intent [android.content.Intent.extras, ] : String | semmle.label | out [post update] : Intent [android.content.Intent.extras, ] : String | | Test.java:847:32:847:33 | in : String | semmle.label | in : String | | Test.java:848:9:848:40 | getMapKey(...) | semmle.label | getMapKey(...) | | Test.java:848:19:848:39 | getIntent_extras(...) : Bundle [] : String | semmle.label | getIntent_extras(...) : Bundle [] : String | | Test.java:848:36:848:38 | out : Intent [android.content.Intent.extras, ] : String | semmle.label | out : Intent [android.content.Intent.extras, ] : String | -| Test.java:848:36:848:38 | out : Intent [android.content.Intent.extras, ] : String | semmle.label | out : Intent [android.content.Intent.extras, ] : String | | Test.java:853:19:853:37 | (...)... : ArrayList | semmle.label | (...)... : ArrayList | | Test.java:853:30:853:37 | source(...) : Object | semmle.label | source(...) : Object | | Test.java:854:4:854:6 | out [post update] : Intent [android.content.Intent.extras, ] : ArrayList | semmle.label | out [post update] : Intent [android.content.Intent.extras, ] : ArrayList | -| Test.java:854:4:854:6 | out [post update] : Intent [android.content.Intent.extras, ] : ArrayList | semmle.label | out [post update] : Intent [android.content.Intent.extras, ] : ArrayList | | Test.java:854:38:854:39 | in : ArrayList | semmle.label | in : ArrayList | | Test.java:855:9:855:42 | getMapValue(...) | semmle.label | getMapValue(...) | | Test.java:855:21:855:41 | getIntent_extras(...) : Bundle [] : ArrayList | semmle.label | getIntent_extras(...) : Bundle [] : ArrayList | | Test.java:855:38:855:40 | out : Intent [android.content.Intent.extras, ] : ArrayList | semmle.label | out : Intent [android.content.Intent.extras, ] : ArrayList | -| Test.java:855:38:855:40 | out : Intent [android.content.Intent.extras, ] : ArrayList | semmle.label | out : Intent [android.content.Intent.extras, ] : ArrayList | | Test.java:860:16:860:31 | (...)... : Intent | semmle.label | (...)... : Intent | | Test.java:860:24:860:31 | source(...) : Object | semmle.label | source(...) : Object | | Test.java:861:10:861:11 | in : Intent | semmle.label | in : Intent | @@ -3498,22 +2717,18 @@ nodes | Test.java:867:24:867:52 | newBundleWithMapKey(...) : Bundle [] : String | semmle.label | newBundleWithMapKey(...) : Bundle [] : String | | Test.java:867:44:867:51 | source(...) : String | semmle.label | source(...) : String | | Test.java:868:4:868:6 | out [post update] : Intent [android.content.Intent.extras, ] : String | semmle.label | out [post update] : Intent [android.content.Intent.extras, ] : String | -| Test.java:868:4:868:6 | out [post update] : Intent [android.content.Intent.extras, ] : String | semmle.label | out [post update] : Intent [android.content.Intent.extras, ] : String | | Test.java:868:22:868:23 | in : Bundle [] : String | semmle.label | in : Bundle [] : String | | Test.java:869:9:869:40 | getMapKey(...) | semmle.label | getMapKey(...) | | Test.java:869:19:869:39 | getIntent_extras(...) : Bundle [] : String | semmle.label | getIntent_extras(...) : Bundle [] : String | | Test.java:869:36:869:38 | out : Intent [android.content.Intent.extras, ] : String | semmle.label | out : Intent [android.content.Intent.extras, ] : String | -| Test.java:869:36:869:38 | out : Intent [android.content.Intent.extras, ] : String | semmle.label | out : Intent [android.content.Intent.extras, ] : String | | Test.java:874:16:874:54 | (...)... : Bundle [] : Object | semmle.label | (...)... : Bundle [] : Object | | Test.java:874:24:874:54 | newBundleWithMapValue(...) : Bundle [] : Object | semmle.label | newBundleWithMapValue(...) : Bundle [] : Object | | Test.java:874:46:874:53 | source(...) : Object | semmle.label | source(...) : Object | | Test.java:875:4:875:6 | out [post update] : Intent [android.content.Intent.extras, ] : Object | semmle.label | out [post update] : Intent [android.content.Intent.extras, ] : Object | -| Test.java:875:4:875:6 | out [post update] : Intent [android.content.Intent.extras, ] : Object | semmle.label | out [post update] : Intent [android.content.Intent.extras, ] : Object | | Test.java:875:22:875:23 | in : Bundle [] : Object | semmle.label | in : Bundle [] : Object | | Test.java:876:9:876:42 | getMapValue(...) | semmle.label | getMapValue(...) | | Test.java:876:21:876:41 | getIntent_extras(...) : Bundle [] : Object | semmle.label | getIntent_extras(...) : Bundle [] : Object | | Test.java:876:38:876:40 | out : Intent [android.content.Intent.extras, ] : Object | semmle.label | out : Intent [android.content.Intent.extras, ] : Object | -| Test.java:876:38:876:40 | out : Intent [android.content.Intent.extras, ] : Object | semmle.label | out : Intent [android.content.Intent.extras, ] : Object | | Test.java:881:16:881:31 | (...)... : Intent | semmle.label | (...)... : Intent | | Test.java:881:24:881:31 | source(...) : Object | semmle.label | source(...) : Object | | Test.java:882:10:882:11 | in : Intent | semmle.label | in : Intent | @@ -3524,23 +2739,19 @@ nodes | Test.java:888:45:888:73 | newBundleWithMapKey(...) : Bundle [] : String | semmle.label | newBundleWithMapKey(...) : Bundle [] : String | | Test.java:888:65:888:72 | source(...) : String | semmle.label | source(...) : String | | Test.java:889:4:889:6 | out [post update] : Intent [android.content.Intent.extras, ] : String | semmle.label | out [post update] : Intent [android.content.Intent.extras, ] : String | -| Test.java:889:4:889:6 | out [post update] : Intent [android.content.Intent.extras, ] : String | semmle.label | out [post update] : Intent [android.content.Intent.extras, ] : String | | Test.java:889:22:889:23 | in : Intent [android.content.Intent.extras, ] : String | semmle.label | in : Intent [android.content.Intent.extras, ] : String | | Test.java:890:9:890:40 | getMapKey(...) | semmle.label | getMapKey(...) | | Test.java:890:19:890:39 | getIntent_extras(...) : Bundle [] : String | semmle.label | getIntent_extras(...) : Bundle [] : String | | Test.java:890:36:890:38 | out : Intent [android.content.Intent.extras, ] : String | semmle.label | out : Intent [android.content.Intent.extras, ] : String | -| Test.java:890:36:890:38 | out : Intent [android.content.Intent.extras, ] : String | semmle.label | out : Intent [android.content.Intent.extras, ] : String | | Test.java:895:16:895:76 | (...)... : Intent [android.content.Intent.extras, ] : Object | semmle.label | (...)... : Intent [android.content.Intent.extras, ] : Object | | Test.java:895:24:895:76 | newWithIntent_extras(...) : Intent [android.content.Intent.extras, ] : Object | semmle.label | newWithIntent_extras(...) : Intent [android.content.Intent.extras, ] : Object | | Test.java:895:45:895:75 | newBundleWithMapValue(...) : Bundle [] : Object | semmle.label | newBundleWithMapValue(...) : Bundle [] : Object | | Test.java:895:67:895:74 | source(...) : Object | semmle.label | source(...) : Object | | Test.java:896:4:896:6 | out [post update] : Intent [android.content.Intent.extras, ] : Object | semmle.label | out [post update] : Intent [android.content.Intent.extras, ] : Object | -| Test.java:896:4:896:6 | out [post update] : Intent [android.content.Intent.extras, ] : Object | semmle.label | out [post update] : Intent [android.content.Intent.extras, ] : Object | | Test.java:896:22:896:23 | in : Intent [android.content.Intent.extras, ] : Object | semmle.label | in : Intent [android.content.Intent.extras, ] : Object | | Test.java:897:9:897:42 | getMapValue(...) | semmle.label | getMapValue(...) | | Test.java:897:21:897:41 | getIntent_extras(...) : Bundle [] : Object | semmle.label | getIntent_extras(...) : Bundle [] : Object | | Test.java:897:38:897:40 | out : Intent [android.content.Intent.extras, ] : Object | semmle.label | out : Intent [android.content.Intent.extras, ] : Object | -| Test.java:897:38:897:40 | out : Intent [android.content.Intent.extras, ] : Object | semmle.label | out : Intent [android.content.Intent.extras, ] : Object | | Test.java:902:16:902:31 | (...)... : Intent | semmle.label | (...)... : Intent | | Test.java:902:24:902:31 | source(...) : Object | semmle.label | source(...) : Object | | Test.java:903:10:903:11 | in : Intent | semmle.label | in : Intent | @@ -4250,474 +3461,254 @@ nodes | Test.java:1759:19:1759:20 | in : String | semmle.label | in : String | | Test.java:1760:9:1760:11 | out | semmle.label | out | | TestStartActivityToGetIntent.java:18:13:18:18 | intent [post update] : Intent [android.content.Intent.extras, ] : String | semmle.label | intent [post update] : Intent [android.content.Intent.extras, ] : String | -| TestStartActivityToGetIntent.java:18:13:18:18 | intent [post update] : Intent [android.content.Intent.extras, ] : String | semmle.label | intent [post update] : Intent [android.content.Intent.extras, ] : String | -| TestStartActivityToGetIntent.java:18:13:18:18 | intent [post update] : Intent [android.content.Intent.extras, ] : String | semmle.label | intent [post update] : Intent [android.content.Intent.extras, ] : String | | TestStartActivityToGetIntent.java:18:37:18:64 | (...)... : String | semmle.label | (...)... : String | | TestStartActivityToGetIntent.java:18:46:18:64 | source(...) : Object | semmle.label | source(...) : Object | | TestStartActivityToGetIntent.java:19:31:19:36 | intent : Intent [android.content.Intent.extras, ] : String | semmle.label | intent : Intent [android.content.Intent.extras, ] : String | -| TestStartActivityToGetIntent.java:19:31:19:36 | intent : Intent [android.content.Intent.extras, ] : String | semmle.label | intent : Intent [android.content.Intent.extras, ] : String | -| TestStartActivityToGetIntent.java:19:31:19:36 | intent : Intent [android.content.Intent.extras, ] : String | semmle.label | intent : Intent [android.content.Intent.extras, ] : String | -| TestStartActivityToGetIntent.java:23:13:23:18 | intent [post update] : Intent [android.content.Intent.extras, ] : String | semmle.label | intent [post update] : Intent [android.content.Intent.extras, ] : String | -| TestStartActivityToGetIntent.java:23:13:23:18 | intent [post update] : Intent [android.content.Intent.extras, ] : String | semmle.label | intent [post update] : Intent [android.content.Intent.extras, ] : String | | TestStartActivityToGetIntent.java:23:13:23:18 | intent [post update] : Intent [android.content.Intent.extras, ] : String | semmle.label | intent [post update] : Intent [android.content.Intent.extras, ] : String | | TestStartActivityToGetIntent.java:23:37:23:69 | (...)... : String | semmle.label | (...)... : String | | TestStartActivityToGetIntent.java:23:46:23:69 | source(...) : Object | semmle.label | source(...) : Object | | TestStartActivityToGetIntent.java:24:32:24:52 | {...} : Intent[] [[], android.content.Intent.extras, ] : String | semmle.label | {...} : Intent[] [[], android.content.Intent.extras, ] : String | -| TestStartActivityToGetIntent.java:24:32:24:52 | {...} : Intent[] [[], android.content.Intent.extras, ] : String | semmle.label | {...} : Intent[] [[], android.content.Intent.extras, ] : String | -| TestStartActivityToGetIntent.java:24:32:24:52 | {...} : Intent[] [[], android.content.Intent.extras, ] : String | semmle.label | {...} : Intent[] [[], android.content.Intent.extras, ] : String | -| TestStartActivityToGetIntent.java:24:46:24:51 | intent : Intent [android.content.Intent.extras, ] : String | semmle.label | intent : Intent [android.content.Intent.extras, ] : String | -| TestStartActivityToGetIntent.java:24:46:24:51 | intent : Intent [android.content.Intent.extras, ] : String | semmle.label | intent : Intent [android.content.Intent.extras, ] : String | | TestStartActivityToGetIntent.java:24:46:24:51 | intent : Intent [android.content.Intent.extras, ] : String | semmle.label | intent : Intent [android.content.Intent.extras, ] : String | | TestStartActivityToGetIntent.java:25:33:25:39 | intents : Intent[] [[], android.content.Intent.extras, ] : String | semmle.label | intents : Intent[] [[], android.content.Intent.extras, ] : String | -| TestStartActivityToGetIntent.java:25:33:25:39 | intents : Intent[] [[], android.content.Intent.extras, ] : String | semmle.label | intents : Intent[] [[], android.content.Intent.extras, ] : String | -| TestStartActivityToGetIntent.java:25:33:25:39 | intents : Intent[] [[], android.content.Intent.extras, ] : String | semmle.label | intents : Intent[] [[], android.content.Intent.extras, ] : String | -| TestStartActivityToGetIntent.java:29:13:29:18 | intent [post update] : Intent [android.content.Intent.extras, ] : String | semmle.label | intent [post update] : Intent [android.content.Intent.extras, ] : String | -| TestStartActivityToGetIntent.java:29:13:29:18 | intent [post update] : Intent [android.content.Intent.extras, ] : String | semmle.label | intent [post update] : Intent [android.content.Intent.extras, ] : String | | TestStartActivityToGetIntent.java:29:13:29:18 | intent [post update] : Intent [android.content.Intent.extras, ] : String | semmle.label | intent [post update] : Intent [android.content.Intent.extras, ] : String | | TestStartActivityToGetIntent.java:29:37:29:71 | (...)... : String | semmle.label | (...)... : String | | TestStartActivityToGetIntent.java:29:46:29:71 | source(...) : Object | semmle.label | source(...) : Object | | TestStartActivityToGetIntent.java:30:32:30:52 | {...} : Intent[] [[], android.content.Intent.extras, ] : String | semmle.label | {...} : Intent[] [[], android.content.Intent.extras, ] : String | -| TestStartActivityToGetIntent.java:30:32:30:52 | {...} : Intent[] [[], android.content.Intent.extras, ] : String | semmle.label | {...} : Intent[] [[], android.content.Intent.extras, ] : String | -| TestStartActivityToGetIntent.java:30:32:30:52 | {...} : Intent[] [[], android.content.Intent.extras, ] : String | semmle.label | {...} : Intent[] [[], android.content.Intent.extras, ] : String | -| TestStartActivityToGetIntent.java:30:46:30:51 | intent : Intent [android.content.Intent.extras, ] : String | semmle.label | intent : Intent [android.content.Intent.extras, ] : String | -| TestStartActivityToGetIntent.java:30:46:30:51 | intent : Intent [android.content.Intent.extras, ] : String | semmle.label | intent : Intent [android.content.Intent.extras, ] : String | | TestStartActivityToGetIntent.java:30:46:30:51 | intent : Intent [android.content.Intent.extras, ] : String | semmle.label | intent : Intent [android.content.Intent.extras, ] : String | | TestStartActivityToGetIntent.java:31:33:31:39 | intents : Intent[] [[], android.content.Intent.extras, ] : String | semmle.label | intents : Intent[] [[], android.content.Intent.extras, ] : String | -| TestStartActivityToGetIntent.java:31:33:31:39 | intents : Intent[] [[], android.content.Intent.extras, ] : String | semmle.label | intents : Intent[] [[], android.content.Intent.extras, ] : String | -| TestStartActivityToGetIntent.java:31:33:31:39 | intents : Intent[] [[], android.content.Intent.extras, ] : String | semmle.label | intents : Intent[] [[], android.content.Intent.extras, ] : String | -| TestStartActivityToGetIntent.java:35:13:35:18 | intent [post update] : Intent [android.content.Intent.extras, ] : String | semmle.label | intent [post update] : Intent [android.content.Intent.extras, ] : String | -| TestStartActivityToGetIntent.java:35:13:35:18 | intent [post update] : Intent [android.content.Intent.extras, ] : String | semmle.label | intent [post update] : Intent [android.content.Intent.extras, ] : String | | TestStartActivityToGetIntent.java:35:13:35:18 | intent [post update] : Intent [android.content.Intent.extras, ] : String | semmle.label | intent [post update] : Intent [android.content.Intent.extras, ] : String | | TestStartActivityToGetIntent.java:35:37:35:64 | (...)... : String | semmle.label | (...)... : String | | TestStartActivityToGetIntent.java:35:46:35:64 | source(...) : Object | semmle.label | source(...) : Object | | TestStartActivityToGetIntent.java:36:31:36:36 | intent : Intent [android.content.Intent.extras, ] : String | semmle.label | intent : Intent [android.content.Intent.extras, ] : String | -| TestStartActivityToGetIntent.java:36:31:36:36 | intent : Intent [android.content.Intent.extras, ] : String | semmle.label | intent : Intent [android.content.Intent.extras, ] : String | -| TestStartActivityToGetIntent.java:36:31:36:36 | intent : Intent [android.content.Intent.extras, ] : String | semmle.label | intent : Intent [android.content.Intent.extras, ] : String | -| TestStartActivityToGetIntent.java:40:13:40:18 | intent [post update] : Intent [android.content.Intent.extras, ] : String | semmle.label | intent [post update] : Intent [android.content.Intent.extras, ] : String | -| TestStartActivityToGetIntent.java:40:13:40:18 | intent [post update] : Intent [android.content.Intent.extras, ] : String | semmle.label | intent [post update] : Intent [android.content.Intent.extras, ] : String | | TestStartActivityToGetIntent.java:40:13:40:18 | intent [post update] : Intent [android.content.Intent.extras, ] : String | semmle.label | intent [post update] : Intent [android.content.Intent.extras, ] : String | | TestStartActivityToGetIntent.java:40:37:40:69 | (...)... : String | semmle.label | (...)... : String | | TestStartActivityToGetIntent.java:40:46:40:69 | source(...) : Object | semmle.label | source(...) : Object | | TestStartActivityToGetIntent.java:41:32:41:52 | {...} : Intent[] [[], android.content.Intent.extras, ] : String | semmle.label | {...} : Intent[] [[], android.content.Intent.extras, ] : String | -| TestStartActivityToGetIntent.java:41:32:41:52 | {...} : Intent[] [[], android.content.Intent.extras, ] : String | semmle.label | {...} : Intent[] [[], android.content.Intent.extras, ] : String | -| TestStartActivityToGetIntent.java:41:32:41:52 | {...} : Intent[] [[], android.content.Intent.extras, ] : String | semmle.label | {...} : Intent[] [[], android.content.Intent.extras, ] : String | -| TestStartActivityToGetIntent.java:41:46:41:51 | intent : Intent [android.content.Intent.extras, ] : String | semmle.label | intent : Intent [android.content.Intent.extras, ] : String | -| TestStartActivityToGetIntent.java:41:46:41:51 | intent : Intent [android.content.Intent.extras, ] : String | semmle.label | intent : Intent [android.content.Intent.extras, ] : String | | TestStartActivityToGetIntent.java:41:46:41:51 | intent : Intent [android.content.Intent.extras, ] : String | semmle.label | intent : Intent [android.content.Intent.extras, ] : String | | TestStartActivityToGetIntent.java:42:33:42:39 | intents : Intent[] [[], android.content.Intent.extras, ] : String | semmle.label | intents : Intent[] [[], android.content.Intent.extras, ] : String | -| TestStartActivityToGetIntent.java:42:33:42:39 | intents : Intent[] [[], android.content.Intent.extras, ] : String | semmle.label | intents : Intent[] [[], android.content.Intent.extras, ] : String | -| TestStartActivityToGetIntent.java:42:33:42:39 | intents : Intent[] [[], android.content.Intent.extras, ] : String | semmle.label | intents : Intent[] [[], android.content.Intent.extras, ] : String | -| TestStartActivityToGetIntent.java:52:13:52:18 | intent [post update] : Intent [android.content.Intent.extras, ] : String | semmle.label | intent [post update] : Intent [android.content.Intent.extras, ] : String | -| TestStartActivityToGetIntent.java:52:13:52:18 | intent [post update] : Intent [android.content.Intent.extras, ] : String | semmle.label | intent [post update] : Intent [android.content.Intent.extras, ] : String | | TestStartActivityToGetIntent.java:52:13:52:18 | intent [post update] : Intent [android.content.Intent.extras, ] : String | semmle.label | intent [post update] : Intent [android.content.Intent.extras, ] : String | | TestStartActivityToGetIntent.java:52:37:52:71 | (...)... : String | semmle.label | (...)... : String | | TestStartActivityToGetIntent.java:52:46:52:71 | source(...) : Object | semmle.label | source(...) : Object | | TestStartActivityToGetIntent.java:53:40:53:45 | intent : Intent [android.content.Intent.extras, ] : String | semmle.label | intent : Intent [android.content.Intent.extras, ] : String | -| TestStartActivityToGetIntent.java:53:40:53:45 | intent : Intent [android.content.Intent.extras, ] : String | semmle.label | intent : Intent [android.content.Intent.extras, ] : String | -| TestStartActivityToGetIntent.java:53:40:53:45 | intent : Intent [android.content.Intent.extras, ] : String | semmle.label | intent : Intent [android.content.Intent.extras, ] : String | -| TestStartActivityToGetIntent.java:57:13:57:18 | intent [post update] : Intent [android.content.Intent.extras, ] : String | semmle.label | intent [post update] : Intent [android.content.Intent.extras, ] : String | -| TestStartActivityToGetIntent.java:57:13:57:18 | intent [post update] : Intent [android.content.Intent.extras, ] : String | semmle.label | intent [post update] : Intent [android.content.Intent.extras, ] : String | | TestStartActivityToGetIntent.java:57:13:57:18 | intent [post update] : Intent [android.content.Intent.extras, ] : String | semmle.label | intent [post update] : Intent [android.content.Intent.extras, ] : String | | TestStartActivityToGetIntent.java:57:37:57:70 | (...)... : String | semmle.label | (...)... : String | | TestStartActivityToGetIntent.java:57:46:57:70 | source(...) : Object | semmle.label | source(...) : Object | | TestStartActivityToGetIntent.java:58:39:58:44 | intent : Intent [android.content.Intent.extras, ] : String | semmle.label | intent : Intent [android.content.Intent.extras, ] : String | -| TestStartActivityToGetIntent.java:58:39:58:44 | intent : Intent [android.content.Intent.extras, ] : String | semmle.label | intent : Intent [android.content.Intent.extras, ] : String | -| TestStartActivityToGetIntent.java:58:39:58:44 | intent : Intent [android.content.Intent.extras, ] : String | semmle.label | intent : Intent [android.content.Intent.extras, ] : String | -| TestStartActivityToGetIntent.java:62:13:62:18 | intent [post update] : Intent [android.content.Intent.extras, ] : String | semmle.label | intent [post update] : Intent [android.content.Intent.extras, ] : String | -| TestStartActivityToGetIntent.java:62:13:62:18 | intent [post update] : Intent [android.content.Intent.extras, ] : String | semmle.label | intent [post update] : Intent [android.content.Intent.extras, ] : String | | TestStartActivityToGetIntent.java:62:13:62:18 | intent [post update] : Intent [android.content.Intent.extras, ] : String | semmle.label | intent [post update] : Intent [android.content.Intent.extras, ] : String | | TestStartActivityToGetIntent.java:62:37:62:69 | (...)... : String | semmle.label | (...)... : String | | TestStartActivityToGetIntent.java:62:46:62:69 | source(...) : Object | semmle.label | source(...) : Object | | TestStartActivityToGetIntent.java:63:43:63:48 | intent : Intent [android.content.Intent.extras, ] : String | semmle.label | intent : Intent [android.content.Intent.extras, ] : String | -| TestStartActivityToGetIntent.java:63:43:63:48 | intent : Intent [android.content.Intent.extras, ] : String | semmle.label | intent : Intent [android.content.Intent.extras, ] : String | -| TestStartActivityToGetIntent.java:63:43:63:48 | intent : Intent [android.content.Intent.extras, ] : String | semmle.label | intent : Intent [android.content.Intent.extras, ] : String | -| TestStartActivityToGetIntent.java:67:13:67:18 | intent [post update] : Intent [android.content.Intent.extras, ] : String | semmle.label | intent [post update] : Intent [android.content.Intent.extras, ] : String | -| TestStartActivityToGetIntent.java:67:13:67:18 | intent [post update] : Intent [android.content.Intent.extras, ] : String | semmle.label | intent [post update] : Intent [android.content.Intent.extras, ] : String | | TestStartActivityToGetIntent.java:67:13:67:18 | intent [post update] : Intent [android.content.Intent.extras, ] : String | semmle.label | intent [post update] : Intent [android.content.Intent.extras, ] : String | | TestStartActivityToGetIntent.java:67:37:67:71 | (...)... : String | semmle.label | (...)... : String | | TestStartActivityToGetIntent.java:67:46:67:71 | source(...) : Object | semmle.label | source(...) : Object | | TestStartActivityToGetIntent.java:68:46:68:51 | intent : Intent [android.content.Intent.extras, ] : String | semmle.label | intent : Intent [android.content.Intent.extras, ] : String | -| TestStartActivityToGetIntent.java:68:46:68:51 | intent : Intent [android.content.Intent.extras, ] : String | semmle.label | intent : Intent [android.content.Intent.extras, ] : String | -| TestStartActivityToGetIntent.java:68:46:68:51 | intent : Intent [android.content.Intent.extras, ] : String | semmle.label | intent : Intent [android.content.Intent.extras, ] : String | -| TestStartActivityToGetIntent.java:72:13:72:18 | intent [post update] : Intent [android.content.Intent.extras, ] : String | semmle.label | intent [post update] : Intent [android.content.Intent.extras, ] : String | -| TestStartActivityToGetIntent.java:72:13:72:18 | intent [post update] : Intent [android.content.Intent.extras, ] : String | semmle.label | intent [post update] : Intent [android.content.Intent.extras, ] : String | | TestStartActivityToGetIntent.java:72:13:72:18 | intent [post update] : Intent [android.content.Intent.extras, ] : String | semmle.label | intent [post update] : Intent [android.content.Intent.extras, ] : String | | TestStartActivityToGetIntent.java:72:37:72:70 | (...)... : String | semmle.label | (...)... : String | | TestStartActivityToGetIntent.java:72:46:72:70 | source(...) : Object | semmle.label | source(...) : Object | | TestStartActivityToGetIntent.java:73:49:73:54 | intent : Intent [android.content.Intent.extras, ] : String | semmle.label | intent : Intent [android.content.Intent.extras, ] : String | -| TestStartActivityToGetIntent.java:73:49:73:54 | intent : Intent [android.content.Intent.extras, ] : String | semmle.label | intent : Intent [android.content.Intent.extras, ] : String | -| TestStartActivityToGetIntent.java:73:49:73:54 | intent : Intent [android.content.Intent.extras, ] : String | semmle.label | intent : Intent [android.content.Intent.extras, ] : String | -| TestStartActivityToGetIntent.java:79:13:79:18 | intent [post update] : Intent [android.content.Intent.extras, ] : String | semmle.label | intent [post update] : Intent [android.content.Intent.extras, ] : String | -| TestStartActivityToGetIntent.java:79:13:79:18 | intent [post update] : Intent [android.content.Intent.extras, ] : String | semmle.label | intent [post update] : Intent [android.content.Intent.extras, ] : String | | TestStartActivityToGetIntent.java:79:13:79:18 | intent [post update] : Intent [android.content.Intent.extras, ] : String | semmle.label | intent [post update] : Intent [android.content.Intent.extras, ] : String | | TestStartActivityToGetIntent.java:79:37:79:60 | (...)... : String | semmle.label | (...)... : String | | TestStartActivityToGetIntent.java:79:46:79:60 | source(...) : Object | semmle.label | source(...) : Object | | TestStartActivityToGetIntent.java:80:31:80:36 | intent : Intent [android.content.Intent.extras, ] : String | semmle.label | intent : Intent [android.content.Intent.extras, ] : String | -| TestStartActivityToGetIntent.java:80:31:80:36 | intent : Intent [android.content.Intent.extras, ] : String | semmle.label | intent : Intent [android.content.Intent.extras, ] : String | -| TestStartActivityToGetIntent.java:80:31:80:36 | intent : Intent [android.content.Intent.extras, ] : String | semmle.label | intent : Intent [android.content.Intent.extras, ] : String | -| TestStartActivityToGetIntent.java:95:18:95:28 | getIntent(...) : Intent [android.content.Intent.extras, ] : String | semmle.label | getIntent(...) : Intent [android.content.Intent.extras, ] : String | -| TestStartActivityToGetIntent.java:95:18:95:28 | getIntent(...) : Intent [android.content.Intent.extras, ] : String | semmle.label | getIntent(...) : Intent [android.content.Intent.extras, ] : String | | TestStartActivityToGetIntent.java:95:18:95:28 | getIntent(...) : Intent [android.content.Intent.extras, ] : String | semmle.label | getIntent(...) : Intent [android.content.Intent.extras, ] : String | | TestStartActivityToGetIntent.java:95:18:95:51 | getStringExtra(...) | semmle.label | getStringExtra(...) | | TestStartActivityToGetIntent.java:102:18:102:28 | getIntent(...) : Intent [android.content.Intent.extras, ] : String | semmle.label | getIntent(...) : Intent [android.content.Intent.extras, ] : String | -| TestStartActivityToGetIntent.java:102:18:102:28 | getIntent(...) : Intent [android.content.Intent.extras, ] : String | semmle.label | getIntent(...) : Intent [android.content.Intent.extras, ] : String | -| TestStartActivityToGetIntent.java:102:18:102:28 | getIntent(...) : Intent [android.content.Intent.extras, ] : String | semmle.label | getIntent(...) : Intent [android.content.Intent.extras, ] : String | | TestStartActivityToGetIntent.java:102:18:102:51 | getStringExtra(...) | semmle.label | getStringExtra(...) | | TestStartBroadcastReceiverToIntent.java:18:13:18:18 | intent [post update] : Intent [android.content.Intent.extras, ] : String | semmle.label | intent [post update] : Intent [android.content.Intent.extras, ] : String | -| TestStartBroadcastReceiverToIntent.java:18:13:18:18 | intent [post update] : Intent [android.content.Intent.extras, ] : String | semmle.label | intent [post update] : Intent [android.content.Intent.extras, ] : String | -| TestStartBroadcastReceiverToIntent.java:18:13:18:18 | intent [post update] : Intent [android.content.Intent.extras, ] : String | semmle.label | intent [post update] : Intent [android.content.Intent.extras, ] : String | | TestStartBroadcastReceiverToIntent.java:18:37:18:59 | (...)... : String | semmle.label | (...)... : String | | TestStartBroadcastReceiverToIntent.java:18:46:18:59 | source(...) : Object | semmle.label | source(...) : Object | | TestStartBroadcastReceiverToIntent.java:19:31:19:36 | intent : Intent [android.content.Intent.extras, ] : String | semmle.label | intent : Intent [android.content.Intent.extras, ] : String | -| TestStartBroadcastReceiverToIntent.java:19:31:19:36 | intent : Intent [android.content.Intent.extras, ] : String | semmle.label | intent : Intent [android.content.Intent.extras, ] : String | -| TestStartBroadcastReceiverToIntent.java:19:31:19:36 | intent : Intent [android.content.Intent.extras, ] : String | semmle.label | intent : Intent [android.content.Intent.extras, ] : String | -| TestStartBroadcastReceiverToIntent.java:23:13:23:18 | intent [post update] : Intent [android.content.Intent.extras, ] : String | semmle.label | intent [post update] : Intent [android.content.Intent.extras, ] : String | -| TestStartBroadcastReceiverToIntent.java:23:13:23:18 | intent [post update] : Intent [android.content.Intent.extras, ] : String | semmle.label | intent [post update] : Intent [android.content.Intent.extras, ] : String | | TestStartBroadcastReceiverToIntent.java:23:13:23:18 | intent [post update] : Intent [android.content.Intent.extras, ] : String | semmle.label | intent [post update] : Intent [android.content.Intent.extras, ] : String | | TestStartBroadcastReceiverToIntent.java:23:37:23:67 | (...)... : String | semmle.label | (...)... : String | | TestStartBroadcastReceiverToIntent.java:23:46:23:67 | source(...) : Object | semmle.label | source(...) : Object | | TestStartBroadcastReceiverToIntent.java:24:37:24:42 | intent : Intent [android.content.Intent.extras, ] : String | semmle.label | intent : Intent [android.content.Intent.extras, ] : String | -| TestStartBroadcastReceiverToIntent.java:24:37:24:42 | intent : Intent [android.content.Intent.extras, ] : String | semmle.label | intent : Intent [android.content.Intent.extras, ] : String | -| TestStartBroadcastReceiverToIntent.java:24:37:24:42 | intent : Intent [android.content.Intent.extras, ] : String | semmle.label | intent : Intent [android.content.Intent.extras, ] : String | -| TestStartBroadcastReceiverToIntent.java:28:13:28:18 | intent [post update] : Intent [android.content.Intent.extras, ] : String | semmle.label | intent [post update] : Intent [android.content.Intent.extras, ] : String | -| TestStartBroadcastReceiverToIntent.java:28:13:28:18 | intent [post update] : Intent [android.content.Intent.extras, ] : String | semmle.label | intent [post update] : Intent [android.content.Intent.extras, ] : String | | TestStartBroadcastReceiverToIntent.java:28:13:28:18 | intent [post update] : Intent [android.content.Intent.extras, ] : String | semmle.label | intent [post update] : Intent [android.content.Intent.extras, ] : String | | TestStartBroadcastReceiverToIntent.java:28:37:28:69 | (...)... : String | semmle.label | (...)... : String | | TestStartBroadcastReceiverToIntent.java:28:46:28:69 | source(...) : Object | semmle.label | source(...) : Object | | TestStartBroadcastReceiverToIntent.java:29:54:29:59 | intent : Intent [android.content.Intent.extras, ] : String | semmle.label | intent : Intent [android.content.Intent.extras, ] : String | -| TestStartBroadcastReceiverToIntent.java:29:54:29:59 | intent : Intent [android.content.Intent.extras, ] : String | semmle.label | intent : Intent [android.content.Intent.extras, ] : String | -| TestStartBroadcastReceiverToIntent.java:29:54:29:59 | intent : Intent [android.content.Intent.extras, ] : String | semmle.label | intent : Intent [android.content.Intent.extras, ] : String | -| TestStartBroadcastReceiverToIntent.java:33:13:33:18 | intent [post update] : Intent [android.content.Intent.extras, ] : String | semmle.label | intent [post update] : Intent [android.content.Intent.extras, ] : String | -| TestStartBroadcastReceiverToIntent.java:33:13:33:18 | intent [post update] : Intent [android.content.Intent.extras, ] : String | semmle.label | intent [post update] : Intent [android.content.Intent.extras, ] : String | | TestStartBroadcastReceiverToIntent.java:33:13:33:18 | intent [post update] : Intent [android.content.Intent.extras, ] : String | semmle.label | intent [post update] : Intent [android.content.Intent.extras, ] : String | | TestStartBroadcastReceiverToIntent.java:33:37:33:67 | (...)... : String | semmle.label | (...)... : String | | TestStartBroadcastReceiverToIntent.java:33:46:33:67 | source(...) : Object | semmle.label | source(...) : Object | | TestStartBroadcastReceiverToIntent.java:34:38:34:43 | intent : Intent [android.content.Intent.extras, ] : String | semmle.label | intent : Intent [android.content.Intent.extras, ] : String | -| TestStartBroadcastReceiverToIntent.java:34:38:34:43 | intent : Intent [android.content.Intent.extras, ] : String | semmle.label | intent : Intent [android.content.Intent.extras, ] : String | -| TestStartBroadcastReceiverToIntent.java:34:38:34:43 | intent : Intent [android.content.Intent.extras, ] : String | semmle.label | intent : Intent [android.content.Intent.extras, ] : String | -| TestStartBroadcastReceiverToIntent.java:38:13:38:18 | intent [post update] : Intent [android.content.Intent.extras, ] : String | semmle.label | intent [post update] : Intent [android.content.Intent.extras, ] : String | -| TestStartBroadcastReceiverToIntent.java:38:13:38:18 | intent [post update] : Intent [android.content.Intent.extras, ] : String | semmle.label | intent [post update] : Intent [android.content.Intent.extras, ] : String | | TestStartBroadcastReceiverToIntent.java:38:13:38:18 | intent [post update] : Intent [android.content.Intent.extras, ] : String | semmle.label | intent [post update] : Intent [android.content.Intent.extras, ] : String | | TestStartBroadcastReceiverToIntent.java:38:37:38:75 | (...)... : String | semmle.label | (...)... : String | | TestStartBroadcastReceiverToIntent.java:38:46:38:75 | source(...) : Object | semmle.label | source(...) : Object | | TestStartBroadcastReceiverToIntent.java:39:44:39:49 | intent : Intent [android.content.Intent.extras, ] : String | semmle.label | intent : Intent [android.content.Intent.extras, ] : String | -| TestStartBroadcastReceiverToIntent.java:39:44:39:49 | intent : Intent [android.content.Intent.extras, ] : String | semmle.label | intent : Intent [android.content.Intent.extras, ] : String | -| TestStartBroadcastReceiverToIntent.java:39:44:39:49 | intent : Intent [android.content.Intent.extras, ] : String | semmle.label | intent : Intent [android.content.Intent.extras, ] : String | -| TestStartBroadcastReceiverToIntent.java:43:13:43:18 | intent [post update] : Intent [android.content.Intent.extras, ] : String | semmle.label | intent [post update] : Intent [android.content.Intent.extras, ] : String | -| TestStartBroadcastReceiverToIntent.java:43:13:43:18 | intent [post update] : Intent [android.content.Intent.extras, ] : String | semmle.label | intent [post update] : Intent [android.content.Intent.extras, ] : String | | TestStartBroadcastReceiverToIntent.java:43:13:43:18 | intent [post update] : Intent [android.content.Intent.extras, ] : String | semmle.label | intent [post update] : Intent [android.content.Intent.extras, ] : String | | TestStartBroadcastReceiverToIntent.java:43:37:43:66 | (...)... : String | semmle.label | (...)... : String | | TestStartBroadcastReceiverToIntent.java:43:46:43:66 | source(...) : Object | semmle.label | source(...) : Object | | TestStartBroadcastReceiverToIntent.java:44:37:44:42 | intent : Intent [android.content.Intent.extras, ] : String | semmle.label | intent : Intent [android.content.Intent.extras, ] : String | -| TestStartBroadcastReceiverToIntent.java:44:37:44:42 | intent : Intent [android.content.Intent.extras, ] : String | semmle.label | intent : Intent [android.content.Intent.extras, ] : String | -| TestStartBroadcastReceiverToIntent.java:44:37:44:42 | intent : Intent [android.content.Intent.extras, ] : String | semmle.label | intent : Intent [android.content.Intent.extras, ] : String | -| TestStartBroadcastReceiverToIntent.java:48:13:48:18 | intent [post update] : Intent [android.content.Intent.extras, ] : String | semmle.label | intent [post update] : Intent [android.content.Intent.extras, ] : String | -| TestStartBroadcastReceiverToIntent.java:48:13:48:18 | intent [post update] : Intent [android.content.Intent.extras, ] : String | semmle.label | intent [post update] : Intent [android.content.Intent.extras, ] : String | | TestStartBroadcastReceiverToIntent.java:48:13:48:18 | intent [post update] : Intent [android.content.Intent.extras, ] : String | semmle.label | intent [post update] : Intent [android.content.Intent.extras, ] : String | | TestStartBroadcastReceiverToIntent.java:48:37:48:74 | (...)... : String | semmle.label | (...)... : String | | TestStartBroadcastReceiverToIntent.java:48:46:48:74 | source(...) : Object | semmle.label | source(...) : Object | | TestStartBroadcastReceiverToIntent.java:49:43:49:48 | intent : Intent [android.content.Intent.extras, ] : String | semmle.label | intent : Intent [android.content.Intent.extras, ] : String | -| TestStartBroadcastReceiverToIntent.java:49:43:49:48 | intent : Intent [android.content.Intent.extras, ] : String | semmle.label | intent : Intent [android.content.Intent.extras, ] : String | -| TestStartBroadcastReceiverToIntent.java:49:43:49:48 | intent : Intent [android.content.Intent.extras, ] : String | semmle.label | intent : Intent [android.content.Intent.extras, ] : String | -| TestStartBroadcastReceiverToIntent.java:53:13:53:18 | intent [post update] : Intent [android.content.Intent.extras, ] : String | semmle.label | intent [post update] : Intent [android.content.Intent.extras, ] : String | -| TestStartBroadcastReceiverToIntent.java:53:13:53:18 | intent [post update] : Intent [android.content.Intent.extras, ] : String | semmle.label | intent [post update] : Intent [android.content.Intent.extras, ] : String | | TestStartBroadcastReceiverToIntent.java:53:13:53:18 | intent [post update] : Intent [android.content.Intent.extras, ] : String | semmle.label | intent [post update] : Intent [android.content.Intent.extras, ] : String | | TestStartBroadcastReceiverToIntent.java:53:37:53:74 | (...)... : String | semmle.label | (...)... : String | | TestStartBroadcastReceiverToIntent.java:53:46:53:74 | source(...) : Object | semmle.label | source(...) : Object | | TestStartBroadcastReceiverToIntent.java:54:44:54:49 | intent : Intent [android.content.Intent.extras, ] : String | semmle.label | intent : Intent [android.content.Intent.extras, ] : String | -| TestStartBroadcastReceiverToIntent.java:54:44:54:49 | intent : Intent [android.content.Intent.extras, ] : String | semmle.label | intent : Intent [android.content.Intent.extras, ] : String | -| TestStartBroadcastReceiverToIntent.java:54:44:54:49 | intent : Intent [android.content.Intent.extras, ] : String | semmle.label | intent : Intent [android.content.Intent.extras, ] : String | -| TestStartBroadcastReceiverToIntent.java:58:13:58:18 | intent [post update] : Intent [android.content.Intent.extras, ] : String | semmle.label | intent [post update] : Intent [android.content.Intent.extras, ] : String | -| TestStartBroadcastReceiverToIntent.java:58:13:58:18 | intent [post update] : Intent [android.content.Intent.extras, ] : String | semmle.label | intent [post update] : Intent [android.content.Intent.extras, ] : String | | TestStartBroadcastReceiverToIntent.java:58:13:58:18 | intent [post update] : Intent [android.content.Intent.extras, ] : String | semmle.label | intent [post update] : Intent [android.content.Intent.extras, ] : String | | TestStartBroadcastReceiverToIntent.java:58:37:58:82 | (...)... : String | semmle.label | (...)... : String | | TestStartBroadcastReceiverToIntent.java:58:46:58:82 | source(...) : Object | semmle.label | source(...) : Object | | TestStartBroadcastReceiverToIntent.java:59:50:59:55 | intent : Intent [android.content.Intent.extras, ] : String | semmle.label | intent : Intent [android.content.Intent.extras, ] : String | -| TestStartBroadcastReceiverToIntent.java:59:50:59:55 | intent : Intent [android.content.Intent.extras, ] : String | semmle.label | intent : Intent [android.content.Intent.extras, ] : String | -| TestStartBroadcastReceiverToIntent.java:59:50:59:55 | intent : Intent [android.content.Intent.extras, ] : String | semmle.label | intent : Intent [android.content.Intent.extras, ] : String | -| TestStartBroadcastReceiverToIntent.java:65:13:65:18 | intent [post update] : Intent [android.content.Intent.extras, ] : String | semmle.label | intent [post update] : Intent [android.content.Intent.extras, ] : String | -| TestStartBroadcastReceiverToIntent.java:65:13:65:18 | intent [post update] : Intent [android.content.Intent.extras, ] : String | semmle.label | intent [post update] : Intent [android.content.Intent.extras, ] : String | | TestStartBroadcastReceiverToIntent.java:65:13:65:18 | intent [post update] : Intent [android.content.Intent.extras, ] : String | semmle.label | intent [post update] : Intent [android.content.Intent.extras, ] : String | | TestStartBroadcastReceiverToIntent.java:65:37:65:60 | (...)... : String | semmle.label | (...)... : String | | TestStartBroadcastReceiverToIntent.java:65:46:65:60 | source(...) : Object | semmle.label | source(...) : Object | | TestStartBroadcastReceiverToIntent.java:66:31:66:36 | intent : Intent [android.content.Intent.extras, ] : String | semmle.label | intent : Intent [android.content.Intent.extras, ] : String | -| TestStartBroadcastReceiverToIntent.java:66:31:66:36 | intent : Intent [android.content.Intent.extras, ] : String | semmle.label | intent : Intent [android.content.Intent.extras, ] : String | -| TestStartBroadcastReceiverToIntent.java:66:31:66:36 | intent : Intent [android.content.Intent.extras, ] : String | semmle.label | intent : Intent [android.content.Intent.extras, ] : String | | TestStartBroadcastReceiverToIntent.java:81:48:81:60 | intent : Intent [android.content.Intent.extras, ] : String | semmle.label | intent : Intent [android.content.Intent.extras, ] : String | -| TestStartBroadcastReceiverToIntent.java:81:48:81:60 | intent : Intent [android.content.Intent.extras, ] : String | semmle.label | intent : Intent [android.content.Intent.extras, ] : String | -| TestStartBroadcastReceiverToIntent.java:81:48:81:60 | intent : Intent [android.content.Intent.extras, ] : String | semmle.label | intent : Intent [android.content.Intent.extras, ] : String | -| TestStartBroadcastReceiverToIntent.java:82:18:82:23 | intent : Intent [android.content.Intent.extras, ] : String | semmle.label | intent : Intent [android.content.Intent.extras, ] : String | -| TestStartBroadcastReceiverToIntent.java:82:18:82:23 | intent : Intent [android.content.Intent.extras, ] : String | semmle.label | intent : Intent [android.content.Intent.extras, ] : String | | TestStartBroadcastReceiverToIntent.java:82:18:82:23 | intent : Intent [android.content.Intent.extras, ] : String | semmle.label | intent : Intent [android.content.Intent.extras, ] : String | | TestStartBroadcastReceiverToIntent.java:82:18:82:46 | getStringExtra(...) | semmle.label | getStringExtra(...) | | TestStartServiceToIntent.java:19:13:19:18 | intent [post update] : Intent [android.content.Intent.extras, ] : String | semmle.label | intent [post update] : Intent [android.content.Intent.extras, ] : String | -| TestStartServiceToIntent.java:19:13:19:18 | intent [post update] : Intent [android.content.Intent.extras, ] : String | semmle.label | intent [post update] : Intent [android.content.Intent.extras, ] : String | -| TestStartServiceToIntent.java:19:13:19:18 | intent [post update] : Intent [android.content.Intent.extras, ] : String | semmle.label | intent [post update] : Intent [android.content.Intent.extras, ] : String | | TestStartServiceToIntent.java:19:37:19:59 | (...)... : String | semmle.label | (...)... : String | | TestStartServiceToIntent.java:19:46:19:59 | source(...) : Object | semmle.label | source(...) : Object | | TestStartServiceToIntent.java:20:29:20:34 | intent : Intent [android.content.Intent.extras, ] : String | semmle.label | intent : Intent [android.content.Intent.extras, ] : String | -| TestStartServiceToIntent.java:20:29:20:34 | intent : Intent [android.content.Intent.extras, ] : String | semmle.label | intent : Intent [android.content.Intent.extras, ] : String | -| TestStartServiceToIntent.java:20:29:20:34 | intent : Intent [android.content.Intent.extras, ] : String | semmle.label | intent : Intent [android.content.Intent.extras, ] : String | -| TestStartServiceToIntent.java:24:13:24:18 | intent [post update] : Intent [android.content.Intent.extras, ] : String | semmle.label | intent [post update] : Intent [android.content.Intent.extras, ] : String | -| TestStartServiceToIntent.java:24:13:24:18 | intent [post update] : Intent [android.content.Intent.extras, ] : String | semmle.label | intent [post update] : Intent [android.content.Intent.extras, ] : String | | TestStartServiceToIntent.java:24:13:24:18 | intent [post update] : Intent [android.content.Intent.extras, ] : String | semmle.label | intent [post update] : Intent [android.content.Intent.extras, ] : String | | TestStartServiceToIntent.java:24:37:24:67 | (...)... : String | semmle.label | (...)... : String | | TestStartServiceToIntent.java:24:46:24:67 | source(...) : Object | semmle.label | source(...) : Object | | TestStartServiceToIntent.java:25:35:25:40 | intent : Intent [android.content.Intent.extras, ] : String | semmle.label | intent : Intent [android.content.Intent.extras, ] : String | -| TestStartServiceToIntent.java:25:35:25:40 | intent : Intent [android.content.Intent.extras, ] : String | semmle.label | intent : Intent [android.content.Intent.extras, ] : String | -| TestStartServiceToIntent.java:25:35:25:40 | intent : Intent [android.content.Intent.extras, ] : String | semmle.label | intent : Intent [android.content.Intent.extras, ] : String | -| TestStartServiceToIntent.java:29:13:29:18 | intent [post update] : Intent [android.content.Intent.extras, ] : String | semmle.label | intent [post update] : Intent [android.content.Intent.extras, ] : String | -| TestStartServiceToIntent.java:29:13:29:18 | intent [post update] : Intent [android.content.Intent.extras, ] : String | semmle.label | intent [post update] : Intent [android.content.Intent.extras, ] : String | | TestStartServiceToIntent.java:29:13:29:18 | intent [post update] : Intent [android.content.Intent.extras, ] : String | semmle.label | intent [post update] : Intent [android.content.Intent.extras, ] : String | | TestStartServiceToIntent.java:29:37:29:68 | (...)... : String | semmle.label | (...)... : String | | TestStartServiceToIntent.java:29:46:29:68 | source(...) : Object | semmle.label | source(...) : Object | | TestStartServiceToIntent.java:30:37:30:42 | intent : Intent [android.content.Intent.extras, ] : String | semmle.label | intent : Intent [android.content.Intent.extras, ] : String | -| TestStartServiceToIntent.java:30:37:30:42 | intent : Intent [android.content.Intent.extras, ] : String | semmle.label | intent : Intent [android.content.Intent.extras, ] : String | -| TestStartServiceToIntent.java:30:37:30:42 | intent : Intent [android.content.Intent.extras, ] : String | semmle.label | intent : Intent [android.content.Intent.extras, ] : String | -| TestStartServiceToIntent.java:34:13:34:18 | intent [post update] : Intent [android.content.Intent.extras, ] : String | semmle.label | intent [post update] : Intent [android.content.Intent.extras, ] : String | -| TestStartServiceToIntent.java:34:13:34:18 | intent [post update] : Intent [android.content.Intent.extras, ] : String | semmle.label | intent [post update] : Intent [android.content.Intent.extras, ] : String | | TestStartServiceToIntent.java:34:13:34:18 | intent [post update] : Intent [android.content.Intent.extras, ] : String | semmle.label | intent [post update] : Intent [android.content.Intent.extras, ] : String | | TestStartServiceToIntent.java:34:37:34:60 | (...)... : String | semmle.label | (...)... : String | | TestStartServiceToIntent.java:34:46:34:60 | source(...) : Object | semmle.label | source(...) : Object | | TestStartServiceToIntent.java:35:30:35:35 | intent : Intent [android.content.Intent.extras, ] : String | semmle.label | intent : Intent [android.content.Intent.extras, ] : String | -| TestStartServiceToIntent.java:35:30:35:35 | intent : Intent [android.content.Intent.extras, ] : String | semmle.label | intent : Intent [android.content.Intent.extras, ] : String | -| TestStartServiceToIntent.java:35:30:35:35 | intent : Intent [android.content.Intent.extras, ] : String | semmle.label | intent : Intent [android.content.Intent.extras, ] : String | -| TestStartServiceToIntent.java:39:13:39:18 | intent [post update] : Intent [android.content.Intent.extras, ] : String | semmle.label | intent [post update] : Intent [android.content.Intent.extras, ] : String | -| TestStartServiceToIntent.java:39:13:39:18 | intent [post update] : Intent [android.content.Intent.extras, ] : String | semmle.label | intent [post update] : Intent [android.content.Intent.extras, ] : String | | TestStartServiceToIntent.java:39:13:39:18 | intent [post update] : Intent [android.content.Intent.extras, ] : String | semmle.label | intent [post update] : Intent [android.content.Intent.extras, ] : String | | TestStartServiceToIntent.java:39:37:39:71 | (...)... : String | semmle.label | (...)... : String | | TestStartServiceToIntent.java:39:46:39:71 | source(...) : Object | semmle.label | source(...) : Object | | TestStartServiceToIntent.java:40:40:40:45 | intent : Intent [android.content.Intent.extras, ] : String | semmle.label | intent : Intent [android.content.Intent.extras, ] : String | -| TestStartServiceToIntent.java:40:40:40:45 | intent : Intent [android.content.Intent.extras, ] : String | semmle.label | intent : Intent [android.content.Intent.extras, ] : String | -| TestStartServiceToIntent.java:40:40:40:45 | intent : Intent [android.content.Intent.extras, ] : String | semmle.label | intent : Intent [android.content.Intent.extras, ] : String | -| TestStartServiceToIntent.java:46:13:46:18 | intent [post update] : Intent [android.content.Intent.extras, ] : String | semmle.label | intent [post update] : Intent [android.content.Intent.extras, ] : String | -| TestStartServiceToIntent.java:46:13:46:18 | intent [post update] : Intent [android.content.Intent.extras, ] : String | semmle.label | intent [post update] : Intent [android.content.Intent.extras, ] : String | | TestStartServiceToIntent.java:46:13:46:18 | intent [post update] : Intent [android.content.Intent.extras, ] : String | semmle.label | intent [post update] : Intent [android.content.Intent.extras, ] : String | | TestStartServiceToIntent.java:46:37:46:60 | (...)... : String | semmle.label | (...)... : String | | TestStartServiceToIntent.java:46:46:46:60 | source(...) : Object | semmle.label | source(...) : Object | | TestStartServiceToIntent.java:47:30:47:35 | intent : Intent [android.content.Intent.extras, ] : String | semmle.label | intent : Intent [android.content.Intent.extras, ] : String | -| TestStartServiceToIntent.java:47:30:47:35 | intent : Intent [android.content.Intent.extras, ] : String | semmle.label | intent : Intent [android.content.Intent.extras, ] : String | -| TestStartServiceToIntent.java:47:30:47:35 | intent : Intent [android.content.Intent.extras, ] : String | semmle.label | intent : Intent [android.content.Intent.extras, ] : String | | TestStartServiceToIntent.java:62:29:62:41 | intent : Intent [android.content.Intent.extras, ] : String | semmle.label | intent : Intent [android.content.Intent.extras, ] : String | -| TestStartServiceToIntent.java:62:29:62:41 | intent : Intent [android.content.Intent.extras, ] : String | semmle.label | intent : Intent [android.content.Intent.extras, ] : String | -| TestStartServiceToIntent.java:62:29:62:41 | intent : Intent [android.content.Intent.extras, ] : String | semmle.label | intent : Intent [android.content.Intent.extras, ] : String | -| TestStartServiceToIntent.java:63:18:63:23 | intent : Intent [android.content.Intent.extras, ] : String | semmle.label | intent : Intent [android.content.Intent.extras, ] : String | -| TestStartServiceToIntent.java:63:18:63:23 | intent : Intent [android.content.Intent.extras, ] : String | semmle.label | intent : Intent [android.content.Intent.extras, ] : String | | TestStartServiceToIntent.java:63:18:63:23 | intent : Intent [android.content.Intent.extras, ] : String | semmle.label | intent : Intent [android.content.Intent.extras, ] : String | | TestStartServiceToIntent.java:63:18:63:46 | getStringExtra(...) | semmle.label | getStringExtra(...) | | TestStartServiceToIntent.java:67:35:67:47 | intent : Intent [android.content.Intent.extras, ] : String | semmle.label | intent : Intent [android.content.Intent.extras, ] : String | -| TestStartServiceToIntent.java:67:35:67:47 | intent : Intent [android.content.Intent.extras, ] : String | semmle.label | intent : Intent [android.content.Intent.extras, ] : String | -| TestStartServiceToIntent.java:67:35:67:47 | intent : Intent [android.content.Intent.extras, ] : String | semmle.label | intent : Intent [android.content.Intent.extras, ] : String | -| TestStartServiceToIntent.java:68:18:68:23 | intent : Intent [android.content.Intent.extras, ] : String | semmle.label | intent : Intent [android.content.Intent.extras, ] : String | -| TestStartServiceToIntent.java:68:18:68:23 | intent : Intent [android.content.Intent.extras, ] : String | semmle.label | intent : Intent [android.content.Intent.extras, ] : String | | TestStartServiceToIntent.java:68:18:68:23 | intent : Intent [android.content.Intent.extras, ] : String | semmle.label | intent : Intent [android.content.Intent.extras, ] : String | | TestStartServiceToIntent.java:68:18:68:46 | getStringExtra(...) | semmle.label | getStringExtra(...) | | TestStartServiceToIntent.java:73:31:73:43 | intent : Intent [android.content.Intent.extras, ] : String | semmle.label | intent : Intent [android.content.Intent.extras, ] : String | -| TestStartServiceToIntent.java:73:31:73:43 | intent : Intent [android.content.Intent.extras, ] : String | semmle.label | intent : Intent [android.content.Intent.extras, ] : String | -| TestStartServiceToIntent.java:73:31:73:43 | intent : Intent [android.content.Intent.extras, ] : String | semmle.label | intent : Intent [android.content.Intent.extras, ] : String | -| TestStartServiceToIntent.java:74:18:74:23 | intent : Intent [android.content.Intent.extras, ] : String | semmle.label | intent : Intent [android.content.Intent.extras, ] : String | -| TestStartServiceToIntent.java:74:18:74:23 | intent : Intent [android.content.Intent.extras, ] : String | semmle.label | intent : Intent [android.content.Intent.extras, ] : String | | TestStartServiceToIntent.java:74:18:74:23 | intent : Intent [android.content.Intent.extras, ] : String | semmle.label | intent : Intent [android.content.Intent.extras, ] : String | | TestStartServiceToIntent.java:74:18:74:46 | getStringExtra(...) | semmle.label | getStringExtra(...) | | TestStartServiceToIntent.java:79:33:79:45 | intent : Intent [android.content.Intent.extras, ] : String | semmle.label | intent : Intent [android.content.Intent.extras, ] : String | -| TestStartServiceToIntent.java:79:33:79:45 | intent : Intent [android.content.Intent.extras, ] : String | semmle.label | intent : Intent [android.content.Intent.extras, ] : String | -| TestStartServiceToIntent.java:79:33:79:45 | intent : Intent [android.content.Intent.extras, ] : String | semmle.label | intent : Intent [android.content.Intent.extras, ] : String | -| TestStartServiceToIntent.java:80:18:80:23 | intent : Intent [android.content.Intent.extras, ] : String | semmle.label | intent : Intent [android.content.Intent.extras, ] : String | -| TestStartServiceToIntent.java:80:18:80:23 | intent : Intent [android.content.Intent.extras, ] : String | semmle.label | intent : Intent [android.content.Intent.extras, ] : String | | TestStartServiceToIntent.java:80:18:80:23 | intent : Intent [android.content.Intent.extras, ] : String | semmle.label | intent : Intent [android.content.Intent.extras, ] : String | | TestStartServiceToIntent.java:80:18:80:46 | getStringExtra(...) | semmle.label | getStringExtra(...) | | TestStartServiceToIntent.java:85:30:85:42 | intent : Intent [android.content.Intent.extras, ] : String | semmle.label | intent : Intent [android.content.Intent.extras, ] : String | -| TestStartServiceToIntent.java:85:30:85:42 | intent : Intent [android.content.Intent.extras, ] : String | semmle.label | intent : Intent [android.content.Intent.extras, ] : String | -| TestStartServiceToIntent.java:85:30:85:42 | intent : Intent [android.content.Intent.extras, ] : String | semmle.label | intent : Intent [android.content.Intent.extras, ] : String | -| TestStartServiceToIntent.java:86:18:86:23 | intent : Intent [android.content.Intent.extras, ] : String | semmle.label | intent : Intent [android.content.Intent.extras, ] : String | -| TestStartServiceToIntent.java:86:18:86:23 | intent : Intent [android.content.Intent.extras, ] : String | semmle.label | intent : Intent [android.content.Intent.extras, ] : String | | TestStartServiceToIntent.java:86:18:86:23 | intent : Intent [android.content.Intent.extras, ] : String | semmle.label | intent : Intent [android.content.Intent.extras, ] : String | | TestStartServiceToIntent.java:86:18:86:46 | getStringExtra(...) | semmle.label | getStringExtra(...) | | TestStartServiceToIntent.java:90:35:90:47 | intent : Intent [android.content.Intent.extras, ] : String | semmle.label | intent : Intent [android.content.Intent.extras, ] : String | -| TestStartServiceToIntent.java:90:35:90:47 | intent : Intent [android.content.Intent.extras, ] : String | semmle.label | intent : Intent [android.content.Intent.extras, ] : String | -| TestStartServiceToIntent.java:90:35:90:47 | intent : Intent [android.content.Intent.extras, ] : String | semmle.label | intent : Intent [android.content.Intent.extras, ] : String | -| TestStartServiceToIntent.java:91:18:91:23 | intent : Intent [android.content.Intent.extras, ] : String | semmle.label | intent : Intent [android.content.Intent.extras, ] : String | -| TestStartServiceToIntent.java:91:18:91:23 | intent : Intent [android.content.Intent.extras, ] : String | semmle.label | intent : Intent [android.content.Intent.extras, ] : String | | TestStartServiceToIntent.java:91:18:91:23 | intent : Intent [android.content.Intent.extras, ] : String | semmle.label | intent : Intent [android.content.Intent.extras, ] : String | | TestStartServiceToIntent.java:91:18:91:46 | getStringExtra(...) | semmle.label | getStringExtra(...) | subpaths | Test.java:41:65:41:72 | source(...) : String | Test.java:28:29:28:36 | k : String | Test.java:28:89:28:89 | b : Bundle [] : String | Test.java:41:45:41:73 | newBundleWithMapKey(...) : Bundle [] : String | | Test.java:43:19:43:39 | getIntent_extras(...) : Bundle [] : String | Test.java:24:19:24:30 | b : Bundle [] : String | Test.java:24:42:24:69 | next(...) : String | Test.java:43:9:43:40 | getMapKey(...) | | Test.java:43:36:43:38 | out : Intent [android.content.Intent.extras, ] : String | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : String | Test.java:23:45:23:57 | getExtras(...) : Bundle [] : String | Test.java:43:19:43:39 | getIntent_extras(...) : Bundle [] : String | -| Test.java:43:36:43:38 | out : Intent [android.content.Intent.extras, ] : String | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : String | Test.java:23:45:23:57 | getExtras(...) : Bundle [] : String | Test.java:43:19:43:39 | getIntent_extras(...) : Bundle [] : String | -| Test.java:50:38:50:40 | out : Intent [android.content.Intent.extras, ] : Object | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : Object | Test.java:23:45:23:57 | getExtras(...) : Bundle [] : Object | Test.java:50:21:50:41 | getIntent_extras(...) : Bundle [] : Object | | Test.java:50:38:50:40 | out : Intent [android.content.Intent.extras, ] : Object | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : Object | Test.java:23:45:23:57 | getExtras(...) : Bundle [] : Object | Test.java:50:21:50:41 | getIntent_extras(...) : Bundle [] : Object | | Test.java:57:17:57:19 | out : Intent [android.content.Intent.data] : Uri | Test.java:32:14:32:26 | intent : Intent [android.content.Intent.data] : Uri | Test.java:32:38:32:53 | getData(...) : Uri | Test.java:57:9:57:20 | getData(...) | | Test.java:64:17:64:19 | out : Intent [android.content.Intent.data] : Uri | Test.java:32:14:32:26 | intent : Intent [android.content.Intent.data] : Uri | Test.java:32:38:32:53 | getData(...) : Uri | Test.java:64:9:64:20 | getData(...) | | Test.java:85:38:85:40 | out : Intent [android.content.Intent.extras, ] : CharSequence | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : CharSequence | Test.java:23:45:23:57 | getExtras(...) : Bundle [] : CharSequence | Test.java:85:21:85:41 | getIntent_extras(...) : Bundle [] : CharSequence | -| Test.java:85:38:85:40 | out : Intent [android.content.Intent.extras, ] : CharSequence | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : CharSequence | Test.java:23:45:23:57 | getExtras(...) : Bundle [] : CharSequence | Test.java:85:21:85:41 | getIntent_extras(...) : Bundle [] : CharSequence | | Test.java:92:38:92:40 | out : Intent [android.content.Intent.extras, ] : IntentSender | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : IntentSender | Test.java:23:45:23:57 | getExtras(...) : Bundle [] : IntentSender | Test.java:92:21:92:41 | getIntent_extras(...) : Bundle [] : IntentSender | -| Test.java:92:38:92:40 | out : Intent [android.content.Intent.extras, ] : IntentSender | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : IntentSender | Test.java:23:45:23:57 | getExtras(...) : Bundle [] : IntentSender | Test.java:92:21:92:41 | getIntent_extras(...) : Bundle [] : IntentSender | -| Test.java:99:38:99:40 | out : Intent [android.content.Intent.extras, ] : Intent | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : Intent | Test.java:23:45:23:57 | getExtras(...) : Bundle [] : Intent | Test.java:99:21:99:41 | getIntent_extras(...) : Bundle [] : Intent | | Test.java:99:38:99:40 | out : Intent [android.content.Intent.extras, ] : Intent | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : Intent | Test.java:23:45:23:57 | getExtras(...) : Bundle [] : Intent | Test.java:99:21:99:41 | getIntent_extras(...) : Bundle [] : Intent | | Test.java:146:43:146:50 | source(...) : Uri | Test.java:27:28:27:35 | data : Uri | Test.java:27:47:27:71 | new Intent(...) : Intent [android.content.Intent.data] : Uri | Test.java:146:24:146:51 | newWithIntent_data(...) : Intent [android.content.Intent.data] : Uri | | Test.java:153:43:153:50 | source(...) : Uri | Test.java:27:28:27:35 | data : Uri | Test.java:27:47:27:71 | new Intent(...) : Intent [android.content.Intent.data] : Uri | Test.java:153:24:153:51 | newWithIntent_data(...) : Intent [android.content.Intent.data] : Uri | | Test.java:246:19:246:39 | getIntent_extras(...) : Bundle [] : String | Test.java:24:19:24:30 | b : Bundle [] : String | Test.java:24:42:24:69 | next(...) : String | Test.java:246:9:246:40 | getMapKey(...) | | Test.java:246:36:246:38 | out : Intent [android.content.Intent.extras, ] : String | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : String | Test.java:23:45:23:57 | getExtras(...) : Bundle [] : String | Test.java:246:19:246:39 | getIntent_extras(...) : Bundle [] : String | -| Test.java:246:36:246:38 | out : Intent [android.content.Intent.extras, ] : String | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : String | Test.java:23:45:23:57 | getExtras(...) : Bundle [] : String | Test.java:246:19:246:39 | getIntent_extras(...) : Bundle [] : String | -| Test.java:253:38:253:40 | out : Intent [android.content.Intent.extras, ] : ArrayList | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : ArrayList | Test.java:23:45:23:57 | getExtras(...) : Bundle [] : ArrayList | Test.java:253:21:253:41 | getIntent_extras(...) : Bundle [] : ArrayList | | Test.java:253:38:253:40 | out : Intent [android.content.Intent.extras, ] : ArrayList | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : ArrayList | Test.java:23:45:23:57 | getExtras(...) : Bundle [] : ArrayList | Test.java:253:21:253:41 | getIntent_extras(...) : Bundle [] : ArrayList | | Test.java:428:19:428:39 | getIntent_extras(...) : Bundle [] : String | Test.java:24:19:24:30 | b : Bundle [] : String | Test.java:24:42:24:69 | next(...) : String | Test.java:428:9:428:40 | getMapKey(...) | | Test.java:428:36:428:38 | out : Intent [android.content.Intent.extras, ] : String | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : String | Test.java:23:45:23:57 | getExtras(...) : Bundle [] : String | Test.java:428:19:428:39 | getIntent_extras(...) : Bundle [] : String | -| Test.java:428:36:428:38 | out : Intent [android.content.Intent.extras, ] : String | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : String | Test.java:23:45:23:57 | getExtras(...) : Bundle [] : String | Test.java:428:19:428:39 | getIntent_extras(...) : Bundle [] : String | | Test.java:435:19:435:39 | getIntent_extras(...) : Bundle [] : String | Test.java:24:19:24:30 | b : Bundle [] : String | Test.java:24:42:24:69 | next(...) : String | Test.java:435:9:435:40 | getMapKey(...) | | Test.java:435:36:435:38 | out : Intent [android.content.Intent.extras, ] : String | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : String | Test.java:23:45:23:57 | getExtras(...) : Bundle [] : String | Test.java:435:19:435:39 | getIntent_extras(...) : Bundle [] : String | -| Test.java:435:36:435:38 | out : Intent [android.content.Intent.extras, ] : String | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : String | Test.java:23:45:23:57 | getExtras(...) : Bundle [] : String | Test.java:435:19:435:39 | getIntent_extras(...) : Bundle [] : String | | Test.java:442:19:442:39 | getIntent_extras(...) : Bundle [] : String | Test.java:24:19:24:30 | b : Bundle [] : String | Test.java:24:42:24:69 | next(...) : String | Test.java:442:9:442:40 | getMapKey(...) | | Test.java:442:36:442:38 | out : Intent [android.content.Intent.extras, ] : String | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : String | Test.java:23:45:23:57 | getExtras(...) : Bundle [] : String | Test.java:442:19:442:39 | getIntent_extras(...) : Bundle [] : String | -| Test.java:442:36:442:38 | out : Intent [android.content.Intent.extras, ] : String | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : String | Test.java:23:45:23:57 | getExtras(...) : Bundle [] : String | Test.java:442:19:442:39 | getIntent_extras(...) : Bundle [] : String | | Test.java:449:19:449:39 | getIntent_extras(...) : Bundle [] : String | Test.java:24:19:24:30 | b : Bundle [] : String | Test.java:24:42:24:69 | next(...) : String | Test.java:449:9:449:40 | getMapKey(...) | | Test.java:449:36:449:38 | out : Intent [android.content.Intent.extras, ] : String | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : String | Test.java:23:45:23:57 | getExtras(...) : Bundle [] : String | Test.java:449:19:449:39 | getIntent_extras(...) : Bundle [] : String | -| Test.java:449:36:449:38 | out : Intent [android.content.Intent.extras, ] : String | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : String | Test.java:23:45:23:57 | getExtras(...) : Bundle [] : String | Test.java:449:19:449:39 | getIntent_extras(...) : Bundle [] : String | | Test.java:456:19:456:39 | getIntent_extras(...) : Bundle [] : String | Test.java:24:19:24:30 | b : Bundle [] : String | Test.java:24:42:24:69 | next(...) : String | Test.java:456:9:456:40 | getMapKey(...) | | Test.java:456:36:456:38 | out : Intent [android.content.Intent.extras, ] : String | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : String | Test.java:23:45:23:57 | getExtras(...) : Bundle [] : String | Test.java:456:19:456:39 | getIntent_extras(...) : Bundle [] : String | -| Test.java:456:36:456:38 | out : Intent [android.content.Intent.extras, ] : String | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : String | Test.java:23:45:23:57 | getExtras(...) : Bundle [] : String | Test.java:456:19:456:39 | getIntent_extras(...) : Bundle [] : String | | Test.java:463:19:463:39 | getIntent_extras(...) : Bundle [] : String | Test.java:24:19:24:30 | b : Bundle [] : String | Test.java:24:42:24:69 | next(...) : String | Test.java:463:9:463:40 | getMapKey(...) | | Test.java:463:36:463:38 | out : Intent [android.content.Intent.extras, ] : String | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : String | Test.java:23:45:23:57 | getExtras(...) : Bundle [] : String | Test.java:463:19:463:39 | getIntent_extras(...) : Bundle [] : String | -| Test.java:463:36:463:38 | out : Intent [android.content.Intent.extras, ] : String | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : String | Test.java:23:45:23:57 | getExtras(...) : Bundle [] : String | Test.java:463:19:463:39 | getIntent_extras(...) : Bundle [] : String | | Test.java:470:19:470:39 | getIntent_extras(...) : Bundle [] : String | Test.java:24:19:24:30 | b : Bundle [] : String | Test.java:24:42:24:69 | next(...) : String | Test.java:470:9:470:40 | getMapKey(...) | | Test.java:470:36:470:38 | out : Intent [android.content.Intent.extras, ] : String | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : String | Test.java:23:45:23:57 | getExtras(...) : Bundle [] : String | Test.java:470:19:470:39 | getIntent_extras(...) : Bundle [] : String | -| Test.java:470:36:470:38 | out : Intent [android.content.Intent.extras, ] : String | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : String | Test.java:23:45:23:57 | getExtras(...) : Bundle [] : String | Test.java:470:19:470:39 | getIntent_extras(...) : Bundle [] : String | | Test.java:477:19:477:39 | getIntent_extras(...) : Bundle [] : String | Test.java:24:19:24:30 | b : Bundle [] : String | Test.java:24:42:24:69 | next(...) : String | Test.java:477:9:477:40 | getMapKey(...) | | Test.java:477:36:477:38 | out : Intent [android.content.Intent.extras, ] : String | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : String | Test.java:23:45:23:57 | getExtras(...) : Bundle [] : String | Test.java:477:19:477:39 | getIntent_extras(...) : Bundle [] : String | -| Test.java:477:36:477:38 | out : Intent [android.content.Intent.extras, ] : String | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : String | Test.java:23:45:23:57 | getExtras(...) : Bundle [] : String | Test.java:477:19:477:39 | getIntent_extras(...) : Bundle [] : String | | Test.java:484:19:484:39 | getIntent_extras(...) : Bundle [] : String | Test.java:24:19:24:30 | b : Bundle [] : String | Test.java:24:42:24:69 | next(...) : String | Test.java:484:9:484:40 | getMapKey(...) | | Test.java:484:36:484:38 | out : Intent [android.content.Intent.extras, ] : String | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : String | Test.java:23:45:23:57 | getExtras(...) : Bundle [] : String | Test.java:484:19:484:39 | getIntent_extras(...) : Bundle [] : String | -| Test.java:484:36:484:38 | out : Intent [android.content.Intent.extras, ] : String | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : String | Test.java:23:45:23:57 | getExtras(...) : Bundle [] : String | Test.java:484:19:484:39 | getIntent_extras(...) : Bundle [] : String | | Test.java:491:19:491:39 | getIntent_extras(...) : Bundle [] : String | Test.java:24:19:24:30 | b : Bundle [] : String | Test.java:24:42:24:69 | next(...) : String | Test.java:491:9:491:40 | getMapKey(...) | | Test.java:491:36:491:38 | out : Intent [android.content.Intent.extras, ] : String | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : String | Test.java:23:45:23:57 | getExtras(...) : Bundle [] : String | Test.java:491:19:491:39 | getIntent_extras(...) : Bundle [] : String | -| Test.java:491:36:491:38 | out : Intent [android.content.Intent.extras, ] : String | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : String | Test.java:23:45:23:57 | getExtras(...) : Bundle [] : String | Test.java:491:19:491:39 | getIntent_extras(...) : Bundle [] : String | | Test.java:498:19:498:39 | getIntent_extras(...) : Bundle [] : String | Test.java:24:19:24:30 | b : Bundle [] : String | Test.java:24:42:24:69 | next(...) : String | Test.java:498:9:498:40 | getMapKey(...) | | Test.java:498:36:498:38 | out : Intent [android.content.Intent.extras, ] : String | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : String | Test.java:23:45:23:57 | getExtras(...) : Bundle [] : String | Test.java:498:19:498:39 | getIntent_extras(...) : Bundle [] : String | -| Test.java:498:36:498:38 | out : Intent [android.content.Intent.extras, ] : String | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : String | Test.java:23:45:23:57 | getExtras(...) : Bundle [] : String | Test.java:498:19:498:39 | getIntent_extras(...) : Bundle [] : String | | Test.java:505:19:505:39 | getIntent_extras(...) : Bundle [] : String | Test.java:24:19:24:30 | b : Bundle [] : String | Test.java:24:42:24:69 | next(...) : String | Test.java:505:9:505:40 | getMapKey(...) | | Test.java:505:36:505:38 | out : Intent [android.content.Intent.extras, ] : String | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : String | Test.java:23:45:23:57 | getExtras(...) : Bundle [] : String | Test.java:505:19:505:39 | getIntent_extras(...) : Bundle [] : String | -| Test.java:505:36:505:38 | out : Intent [android.content.Intent.extras, ] : String | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : String | Test.java:23:45:23:57 | getExtras(...) : Bundle [] : String | Test.java:505:19:505:39 | getIntent_extras(...) : Bundle [] : String | | Test.java:512:19:512:39 | getIntent_extras(...) : Bundle [] : String | Test.java:24:19:24:30 | b : Bundle [] : String | Test.java:24:42:24:69 | next(...) : String | Test.java:512:9:512:40 | getMapKey(...) | | Test.java:512:36:512:38 | out : Intent [android.content.Intent.extras, ] : String | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : String | Test.java:23:45:23:57 | getExtras(...) : Bundle [] : String | Test.java:512:19:512:39 | getIntent_extras(...) : Bundle [] : String | -| Test.java:512:36:512:38 | out : Intent [android.content.Intent.extras, ] : String | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : String | Test.java:23:45:23:57 | getExtras(...) : Bundle [] : String | Test.java:512:19:512:39 | getIntent_extras(...) : Bundle [] : String | | Test.java:519:19:519:39 | getIntent_extras(...) : Bundle [] : String | Test.java:24:19:24:30 | b : Bundle [] : String | Test.java:24:42:24:69 | next(...) : String | Test.java:519:9:519:40 | getMapKey(...) | | Test.java:519:36:519:38 | out : Intent [android.content.Intent.extras, ] : String | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : String | Test.java:23:45:23:57 | getExtras(...) : Bundle [] : String | Test.java:519:19:519:39 | getIntent_extras(...) : Bundle [] : String | -| Test.java:519:36:519:38 | out : Intent [android.content.Intent.extras, ] : String | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : String | Test.java:23:45:23:57 | getExtras(...) : Bundle [] : String | Test.java:519:19:519:39 | getIntent_extras(...) : Bundle [] : String | | Test.java:526:19:526:39 | getIntent_extras(...) : Bundle [] : String | Test.java:24:19:24:30 | b : Bundle [] : String | Test.java:24:42:24:69 | next(...) : String | Test.java:526:9:526:40 | getMapKey(...) | | Test.java:526:36:526:38 | out : Intent [android.content.Intent.extras, ] : String | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : String | Test.java:23:45:23:57 | getExtras(...) : Bundle [] : String | Test.java:526:19:526:39 | getIntent_extras(...) : Bundle [] : String | -| Test.java:526:36:526:38 | out : Intent [android.content.Intent.extras, ] : String | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : String | Test.java:23:45:23:57 | getExtras(...) : Bundle [] : String | Test.java:526:19:526:39 | getIntent_extras(...) : Bundle [] : String | | Test.java:533:19:533:39 | getIntent_extras(...) : Bundle [] : String | Test.java:24:19:24:30 | b : Bundle [] : String | Test.java:24:42:24:69 | next(...) : String | Test.java:533:9:533:40 | getMapKey(...) | | Test.java:533:36:533:38 | out : Intent [android.content.Intent.extras, ] : String | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : String | Test.java:23:45:23:57 | getExtras(...) : Bundle [] : String | Test.java:533:19:533:39 | getIntent_extras(...) : Bundle [] : String | -| Test.java:533:36:533:38 | out : Intent [android.content.Intent.extras, ] : String | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : String | Test.java:23:45:23:57 | getExtras(...) : Bundle [] : String | Test.java:533:19:533:39 | getIntent_extras(...) : Bundle [] : String | | Test.java:540:19:540:39 | getIntent_extras(...) : Bundle [] : String | Test.java:24:19:24:30 | b : Bundle [] : String | Test.java:24:42:24:69 | next(...) : String | Test.java:540:9:540:40 | getMapKey(...) | | Test.java:540:36:540:38 | out : Intent [android.content.Intent.extras, ] : String | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : String | Test.java:23:45:23:57 | getExtras(...) : Bundle [] : String | Test.java:540:19:540:39 | getIntent_extras(...) : Bundle [] : String | -| Test.java:540:36:540:38 | out : Intent [android.content.Intent.extras, ] : String | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : String | Test.java:23:45:23:57 | getExtras(...) : Bundle [] : String | Test.java:540:19:540:39 | getIntent_extras(...) : Bundle [] : String | | Test.java:547:19:547:39 | getIntent_extras(...) : Bundle [] : String | Test.java:24:19:24:30 | b : Bundle [] : String | Test.java:24:42:24:69 | next(...) : String | Test.java:547:9:547:40 | getMapKey(...) | | Test.java:547:36:547:38 | out : Intent [android.content.Intent.extras, ] : String | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : String | Test.java:23:45:23:57 | getExtras(...) : Bundle [] : String | Test.java:547:19:547:39 | getIntent_extras(...) : Bundle [] : String | -| Test.java:547:36:547:38 | out : Intent [android.content.Intent.extras, ] : String | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : String | Test.java:23:45:23:57 | getExtras(...) : Bundle [] : String | Test.java:547:19:547:39 | getIntent_extras(...) : Bundle [] : String | | Test.java:554:19:554:39 | getIntent_extras(...) : Bundle [] : String | Test.java:24:19:24:30 | b : Bundle [] : String | Test.java:24:42:24:69 | next(...) : String | Test.java:554:9:554:40 | getMapKey(...) | | Test.java:554:36:554:38 | out : Intent [android.content.Intent.extras, ] : String | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : String | Test.java:23:45:23:57 | getExtras(...) : Bundle [] : String | Test.java:554:19:554:39 | getIntent_extras(...) : Bundle [] : String | -| Test.java:554:36:554:38 | out : Intent [android.content.Intent.extras, ] : String | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : String | Test.java:23:45:23:57 | getExtras(...) : Bundle [] : String | Test.java:554:19:554:39 | getIntent_extras(...) : Bundle [] : String | | Test.java:561:19:561:39 | getIntent_extras(...) : Bundle [] : String | Test.java:24:19:24:30 | b : Bundle [] : String | Test.java:24:42:24:69 | next(...) : String | Test.java:561:9:561:40 | getMapKey(...) | | Test.java:561:36:561:38 | out : Intent [android.content.Intent.extras, ] : String | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : String | Test.java:23:45:23:57 | getExtras(...) : Bundle [] : String | Test.java:561:19:561:39 | getIntent_extras(...) : Bundle [] : String | -| Test.java:561:36:561:38 | out : Intent [android.content.Intent.extras, ] : String | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : String | Test.java:23:45:23:57 | getExtras(...) : Bundle [] : String | Test.java:561:19:561:39 | getIntent_extras(...) : Bundle [] : String | | Test.java:568:19:568:39 | getIntent_extras(...) : Bundle [] : String | Test.java:24:19:24:30 | b : Bundle [] : String | Test.java:24:42:24:69 | next(...) : String | Test.java:568:9:568:40 | getMapKey(...) | | Test.java:568:36:568:38 | out : Intent [android.content.Intent.extras, ] : String | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : String | Test.java:23:45:23:57 | getExtras(...) : Bundle [] : String | Test.java:568:19:568:39 | getIntent_extras(...) : Bundle [] : String | -| Test.java:568:36:568:38 | out : Intent [android.content.Intent.extras, ] : String | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : String | Test.java:23:45:23:57 | getExtras(...) : Bundle [] : String | Test.java:568:19:568:39 | getIntent_extras(...) : Bundle [] : String | | Test.java:575:19:575:39 | getIntent_extras(...) : Bundle [] : String | Test.java:24:19:24:30 | b : Bundle [] : String | Test.java:24:42:24:69 | next(...) : String | Test.java:575:9:575:40 | getMapKey(...) | | Test.java:575:36:575:38 | out : Intent [android.content.Intent.extras, ] : String | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : String | Test.java:23:45:23:57 | getExtras(...) : Bundle [] : String | Test.java:575:19:575:39 | getIntent_extras(...) : Bundle [] : String | -| Test.java:575:36:575:38 | out : Intent [android.content.Intent.extras, ] : String | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : String | Test.java:23:45:23:57 | getExtras(...) : Bundle [] : String | Test.java:575:19:575:39 | getIntent_extras(...) : Bundle [] : String | | Test.java:582:19:582:39 | getIntent_extras(...) : Bundle [] : String | Test.java:24:19:24:30 | b : Bundle [] : String | Test.java:24:42:24:69 | next(...) : String | Test.java:582:9:582:40 | getMapKey(...) | | Test.java:582:36:582:38 | out : Intent [android.content.Intent.extras, ] : String | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : String | Test.java:23:45:23:57 | getExtras(...) : Bundle [] : String | Test.java:582:19:582:39 | getIntent_extras(...) : Bundle [] : String | -| Test.java:582:36:582:38 | out : Intent [android.content.Intent.extras, ] : String | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : String | Test.java:23:45:23:57 | getExtras(...) : Bundle [] : String | Test.java:582:19:582:39 | getIntent_extras(...) : Bundle [] : String | | Test.java:589:19:589:39 | getIntent_extras(...) : Bundle [] : String | Test.java:24:19:24:30 | b : Bundle [] : String | Test.java:24:42:24:69 | next(...) : String | Test.java:589:9:589:40 | getMapKey(...) | | Test.java:589:36:589:38 | out : Intent [android.content.Intent.extras, ] : String | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : String | Test.java:23:45:23:57 | getExtras(...) : Bundle [] : String | Test.java:589:19:589:39 | getIntent_extras(...) : Bundle [] : String | -| Test.java:589:36:589:38 | out : Intent [android.content.Intent.extras, ] : String | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : String | Test.java:23:45:23:57 | getExtras(...) : Bundle [] : String | Test.java:589:19:589:39 | getIntent_extras(...) : Bundle [] : String | -| Test.java:596:38:596:40 | out : Intent [android.content.Intent.extras, ] : short[] | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : short[] | Test.java:23:45:23:57 | getExtras(...) : Bundle [] : short[] | Test.java:596:21:596:41 | getIntent_extras(...) : Bundle [] : short[] | | Test.java:596:38:596:40 | out : Intent [android.content.Intent.extras, ] : short[] | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : short[] | Test.java:23:45:23:57 | getExtras(...) : Bundle [] : short[] | Test.java:596:21:596:41 | getIntent_extras(...) : Bundle [] : short[] | | Test.java:603:38:603:40 | out : Intent [android.content.Intent.extras, ] : Number | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : Number | Test.java:23:45:23:57 | getExtras(...) : Bundle [] : Number | Test.java:603:21:603:41 | getIntent_extras(...) : Bundle [] : Number | -| Test.java:603:38:603:40 | out : Intent [android.content.Intent.extras, ] : Number | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : Number | Test.java:23:45:23:57 | getExtras(...) : Bundle [] : Number | Test.java:603:21:603:41 | getIntent_extras(...) : Bundle [] : Number | -| Test.java:610:38:610:40 | out : Intent [android.content.Intent.extras, ] : long[] | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : long[] | Test.java:23:45:23:57 | getExtras(...) : Bundle [] : long[] | Test.java:610:21:610:41 | getIntent_extras(...) : Bundle [] : long[] | | Test.java:610:38:610:40 | out : Intent [android.content.Intent.extras, ] : long[] | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : long[] | Test.java:23:45:23:57 | getExtras(...) : Bundle [] : long[] | Test.java:610:21:610:41 | getIntent_extras(...) : Bundle [] : long[] | | Test.java:617:38:617:40 | out : Intent [android.content.Intent.extras, ] : Number | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : Number | Test.java:23:45:23:57 | getExtras(...) : Bundle [] : Number | Test.java:617:21:617:41 | getIntent_extras(...) : Bundle [] : Number | -| Test.java:617:38:617:40 | out : Intent [android.content.Intent.extras, ] : Number | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : Number | Test.java:23:45:23:57 | getExtras(...) : Bundle [] : Number | Test.java:617:21:617:41 | getIntent_extras(...) : Bundle [] : Number | -| Test.java:624:38:624:40 | out : Intent [android.content.Intent.extras, ] : int[] | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : int[] | Test.java:23:45:23:57 | getExtras(...) : Bundle [] : int[] | Test.java:624:21:624:41 | getIntent_extras(...) : Bundle [] : int[] | | Test.java:624:38:624:40 | out : Intent [android.content.Intent.extras, ] : int[] | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : int[] | Test.java:23:45:23:57 | getExtras(...) : Bundle [] : int[] | Test.java:624:21:624:41 | getIntent_extras(...) : Bundle [] : int[] | | Test.java:631:38:631:40 | out : Intent [android.content.Intent.extras, ] : Number | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : Number | Test.java:23:45:23:57 | getExtras(...) : Bundle [] : Number | Test.java:631:21:631:41 | getIntent_extras(...) : Bundle [] : Number | -| Test.java:631:38:631:40 | out : Intent [android.content.Intent.extras, ] : Number | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : Number | Test.java:23:45:23:57 | getExtras(...) : Bundle [] : Number | Test.java:631:21:631:41 | getIntent_extras(...) : Bundle [] : Number | -| Test.java:638:38:638:40 | out : Intent [android.content.Intent.extras, ] : float[] | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : float[] | Test.java:23:45:23:57 | getExtras(...) : Bundle [] : float[] | Test.java:638:21:638:41 | getIntent_extras(...) : Bundle [] : float[] | | Test.java:638:38:638:40 | out : Intent [android.content.Intent.extras, ] : float[] | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : float[] | Test.java:23:45:23:57 | getExtras(...) : Bundle [] : float[] | Test.java:638:21:638:41 | getIntent_extras(...) : Bundle [] : float[] | | Test.java:645:38:645:40 | out : Intent [android.content.Intent.extras, ] : Number | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : Number | Test.java:23:45:23:57 | getExtras(...) : Bundle [] : Number | Test.java:645:21:645:41 | getIntent_extras(...) : Bundle [] : Number | -| Test.java:645:38:645:40 | out : Intent [android.content.Intent.extras, ] : Number | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : Number | Test.java:23:45:23:57 | getExtras(...) : Bundle [] : Number | Test.java:645:21:645:41 | getIntent_extras(...) : Bundle [] : Number | -| Test.java:652:38:652:40 | out : Intent [android.content.Intent.extras, ] : double[] | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : double[] | Test.java:23:45:23:57 | getExtras(...) : Bundle [] : double[] | Test.java:652:21:652:41 | getIntent_extras(...) : Bundle [] : double[] | | Test.java:652:38:652:40 | out : Intent [android.content.Intent.extras, ] : double[] | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : double[] | Test.java:23:45:23:57 | getExtras(...) : Bundle [] : double[] | Test.java:652:21:652:41 | getIntent_extras(...) : Bundle [] : double[] | | Test.java:659:38:659:40 | out : Intent [android.content.Intent.extras, ] : Number | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : Number | Test.java:23:45:23:57 | getExtras(...) : Bundle [] : Number | Test.java:659:21:659:41 | getIntent_extras(...) : Bundle [] : Number | -| Test.java:659:38:659:40 | out : Intent [android.content.Intent.extras, ] : Number | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : Number | Test.java:23:45:23:57 | getExtras(...) : Bundle [] : Number | Test.java:659:21:659:41 | getIntent_extras(...) : Bundle [] : Number | -| Test.java:666:38:666:40 | out : Intent [android.content.Intent.extras, ] : char[] | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : char[] | Test.java:23:45:23:57 | getExtras(...) : Bundle [] : char[] | Test.java:666:21:666:41 | getIntent_extras(...) : Bundle [] : char[] | | Test.java:666:38:666:40 | out : Intent [android.content.Intent.extras, ] : char[] | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : char[] | Test.java:23:45:23:57 | getExtras(...) : Bundle [] : char[] | Test.java:666:21:666:41 | getIntent_extras(...) : Bundle [] : char[] | | Test.java:673:38:673:40 | out : Intent [android.content.Intent.extras, ] : Number | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : Number | Test.java:23:45:23:57 | getExtras(...) : Bundle [] : Number | Test.java:673:21:673:41 | getIntent_extras(...) : Bundle [] : Number | -| Test.java:673:38:673:40 | out : Intent [android.content.Intent.extras, ] : Number | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : Number | Test.java:23:45:23:57 | getExtras(...) : Bundle [] : Number | Test.java:673:21:673:41 | getIntent_extras(...) : Bundle [] : Number | -| Test.java:680:38:680:40 | out : Intent [android.content.Intent.extras, ] : byte[] | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : byte[] | Test.java:23:45:23:57 | getExtras(...) : Bundle [] : byte[] | Test.java:680:21:680:41 | getIntent_extras(...) : Bundle [] : byte[] | | Test.java:680:38:680:40 | out : Intent [android.content.Intent.extras, ] : byte[] | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : byte[] | Test.java:23:45:23:57 | getExtras(...) : Bundle [] : byte[] | Test.java:680:21:680:41 | getIntent_extras(...) : Bundle [] : byte[] | | Test.java:687:38:687:40 | out : Intent [android.content.Intent.extras, ] : Number | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : Number | Test.java:23:45:23:57 | getExtras(...) : Bundle [] : Number | Test.java:687:21:687:41 | getIntent_extras(...) : Bundle [] : Number | -| Test.java:687:38:687:40 | out : Intent [android.content.Intent.extras, ] : Number | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : Number | Test.java:23:45:23:57 | getExtras(...) : Bundle [] : Number | Test.java:687:21:687:41 | getIntent_extras(...) : Bundle [] : Number | -| Test.java:694:38:694:40 | out : Intent [android.content.Intent.extras, ] : boolean[] | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : boolean[] | Test.java:23:45:23:57 | getExtras(...) : Bundle [] : boolean[] | Test.java:694:21:694:41 | getIntent_extras(...) : Bundle [] : boolean[] | | Test.java:694:38:694:40 | out : Intent [android.content.Intent.extras, ] : boolean[] | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : boolean[] | Test.java:23:45:23:57 | getExtras(...) : Bundle [] : boolean[] | Test.java:694:21:694:41 | getIntent_extras(...) : Bundle [] : boolean[] | | Test.java:701:38:701:40 | out : Intent [android.content.Intent.extras, ] : Boolean | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : Boolean | Test.java:23:45:23:57 | getExtras(...) : Bundle [] : Boolean | Test.java:701:21:701:41 | getIntent_extras(...) : Bundle [] : Boolean | -| Test.java:701:38:701:40 | out : Intent [android.content.Intent.extras, ] : Boolean | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : Boolean | Test.java:23:45:23:57 | getExtras(...) : Bundle [] : Boolean | Test.java:701:21:701:41 | getIntent_extras(...) : Bundle [] : Boolean | -| Test.java:708:38:708:40 | out : Intent [android.content.Intent.extras, ] : String[] | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : String[] | Test.java:23:45:23:57 | getExtras(...) : Bundle [] : String[] | Test.java:708:21:708:41 | getIntent_extras(...) : Bundle [] : String[] | | Test.java:708:38:708:40 | out : Intent [android.content.Intent.extras, ] : String[] | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : String[] | Test.java:23:45:23:57 | getExtras(...) : Bundle [] : String[] | Test.java:708:21:708:41 | getIntent_extras(...) : Bundle [] : String[] | | Test.java:715:38:715:40 | out : Intent [android.content.Intent.extras, ] : String | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : String | Test.java:23:45:23:57 | getExtras(...) : Bundle [] : String | Test.java:715:21:715:41 | getIntent_extras(...) : Bundle [] : String | -| Test.java:715:38:715:40 | out : Intent [android.content.Intent.extras, ] : String | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : String | Test.java:23:45:23:57 | getExtras(...) : Bundle [] : String | Test.java:715:21:715:41 | getIntent_extras(...) : Bundle [] : String | -| Test.java:722:38:722:40 | out : Intent [android.content.Intent.extras, ] : Serializable | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : Serializable | Test.java:23:45:23:57 | getExtras(...) : Bundle [] : Serializable | Test.java:722:21:722:41 | getIntent_extras(...) : Bundle [] : Serializable | | Test.java:722:38:722:40 | out : Intent [android.content.Intent.extras, ] : Serializable | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : Serializable | Test.java:23:45:23:57 | getExtras(...) : Bundle [] : Serializable | Test.java:722:21:722:41 | getIntent_extras(...) : Bundle [] : Serializable | | Test.java:729:38:729:40 | out : Intent [android.content.Intent.extras, ] : Parcelable[] | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : Parcelable[] | Test.java:23:45:23:57 | getExtras(...) : Bundle [] : Parcelable[] | Test.java:729:21:729:41 | getIntent_extras(...) : Bundle [] : Parcelable[] | -| Test.java:729:38:729:40 | out : Intent [android.content.Intent.extras, ] : Parcelable[] | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : Parcelable[] | Test.java:23:45:23:57 | getExtras(...) : Bundle [] : Parcelable[] | Test.java:729:21:729:41 | getIntent_extras(...) : Bundle [] : Parcelable[] | -| Test.java:736:38:736:40 | out : Intent [android.content.Intent.extras, ] : Parcelable | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : Parcelable | Test.java:23:45:23:57 | getExtras(...) : Bundle [] : Parcelable | Test.java:736:21:736:41 | getIntent_extras(...) : Bundle [] : Parcelable | | Test.java:736:38:736:40 | out : Intent [android.content.Intent.extras, ] : Parcelable | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : Parcelable | Test.java:23:45:23:57 | getExtras(...) : Bundle [] : Parcelable | Test.java:736:21:736:41 | getIntent_extras(...) : Bundle [] : Parcelable | | Test.java:743:38:743:40 | out : Intent [android.content.Intent.extras, ] : CharSequence[] | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : CharSequence[] | Test.java:23:45:23:57 | getExtras(...) : Bundle [] : CharSequence[] | Test.java:743:21:743:41 | getIntent_extras(...) : Bundle [] : CharSequence[] | -| Test.java:743:38:743:40 | out : Intent [android.content.Intent.extras, ] : CharSequence[] | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : CharSequence[] | Test.java:23:45:23:57 | getExtras(...) : Bundle [] : CharSequence[] | Test.java:743:21:743:41 | getIntent_extras(...) : Bundle [] : CharSequence[] | | Test.java:750:38:750:40 | out : Intent [android.content.Intent.extras, ] : CharSequence | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : CharSequence | Test.java:23:45:23:57 | getExtras(...) : Bundle [] : CharSequence | Test.java:750:21:750:41 | getIntent_extras(...) : Bundle [] : CharSequence | -| Test.java:750:38:750:40 | out : Intent [android.content.Intent.extras, ] : CharSequence | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : CharSequence | Test.java:23:45:23:57 | getExtras(...) : Bundle [] : CharSequence | Test.java:750:21:750:41 | getIntent_extras(...) : Bundle [] : CharSequence | -| Test.java:757:38:757:40 | out : Intent [android.content.Intent.extras, ] : Bundle | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : Bundle | Test.java:23:45:23:57 | getExtras(...) : Bundle [] : Bundle | Test.java:757:21:757:41 | getIntent_extras(...) : Bundle [] : Bundle | | Test.java:757:38:757:40 | out : Intent [android.content.Intent.extras, ] : Bundle | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : Bundle | Test.java:23:45:23:57 | getExtras(...) : Bundle [] : Bundle | Test.java:757:21:757:41 | getIntent_extras(...) : Bundle [] : Bundle | | Test.java:769:44:769:51 | source(...) : String | Test.java:28:29:28:36 | k : String | Test.java:28:89:28:89 | b : Bundle [] : String | Test.java:769:24:769:52 | newBundleWithMapKey(...) : Bundle [] : String | | Test.java:771:19:771:39 | getIntent_extras(...) : Bundle [] : String | Test.java:24:19:24:30 | b : Bundle [] : String | Test.java:24:42:24:69 | next(...) : String | Test.java:771:9:771:40 | getMapKey(...) | | Test.java:771:36:771:38 | out : Intent [android.content.Intent.extras, ] : String | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : String | Test.java:23:45:23:57 | getExtras(...) : Bundle [] : String | Test.java:771:19:771:39 | getIntent_extras(...) : Bundle [] : String | -| Test.java:771:36:771:38 | out : Intent [android.content.Intent.extras, ] : String | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : String | Test.java:23:45:23:57 | getExtras(...) : Bundle [] : String | Test.java:771:19:771:39 | getIntent_extras(...) : Bundle [] : String | -| Test.java:778:38:778:40 | out : Intent [android.content.Intent.extras, ] : Object | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : Object | Test.java:23:45:23:57 | getExtras(...) : Bundle [] : Object | Test.java:778:21:778:41 | getIntent_extras(...) : Bundle [] : Object | | Test.java:778:38:778:40 | out : Intent [android.content.Intent.extras, ] : Object | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : Object | Test.java:23:45:23:57 | getExtras(...) : Bundle [] : Object | Test.java:778:21:778:41 | getIntent_extras(...) : Bundle [] : Object | | Test.java:790:65:790:72 | source(...) : String | Test.java:28:29:28:36 | k : String | Test.java:28:89:28:89 | b : Bundle [] : String | Test.java:790:45:790:73 | newBundleWithMapKey(...) : Bundle [] : String | | Test.java:792:19:792:39 | getIntent_extras(...) : Bundle [] : String | Test.java:24:19:24:30 | b : Bundle [] : String | Test.java:24:42:24:69 | next(...) : String | Test.java:792:9:792:40 | getMapKey(...) | | Test.java:792:36:792:38 | out : Intent [android.content.Intent.extras, ] : String | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : String | Test.java:23:45:23:57 | getExtras(...) : Bundle [] : String | Test.java:792:19:792:39 | getIntent_extras(...) : Bundle [] : String | -| Test.java:792:36:792:38 | out : Intent [android.content.Intent.extras, ] : String | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : String | Test.java:23:45:23:57 | getExtras(...) : Bundle [] : String | Test.java:792:19:792:39 | getIntent_extras(...) : Bundle [] : String | -| Test.java:799:38:799:40 | out : Intent [android.content.Intent.extras, ] : Object | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : Object | Test.java:23:45:23:57 | getExtras(...) : Bundle [] : Object | Test.java:799:21:799:41 | getIntent_extras(...) : Bundle [] : Object | | Test.java:799:38:799:40 | out : Intent [android.content.Intent.extras, ] : Object | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : Object | Test.java:23:45:23:57 | getExtras(...) : Bundle [] : Object | Test.java:799:21:799:41 | getIntent_extras(...) : Bundle [] : Object | | Test.java:813:19:813:39 | getIntent_extras(...) : Bundle [] : String | Test.java:24:19:24:30 | b : Bundle [] : String | Test.java:24:42:24:69 | next(...) : String | Test.java:813:9:813:40 | getMapKey(...) | | Test.java:813:36:813:38 | out : Intent [android.content.Intent.extras, ] : String | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : String | Test.java:23:45:23:57 | getExtras(...) : Bundle [] : String | Test.java:813:19:813:39 | getIntent_extras(...) : Bundle [] : String | -| Test.java:813:36:813:38 | out : Intent [android.content.Intent.extras, ] : String | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : String | Test.java:23:45:23:57 | getExtras(...) : Bundle [] : String | Test.java:813:19:813:39 | getIntent_extras(...) : Bundle [] : String | | Test.java:827:19:827:39 | getIntent_extras(...) : Bundle [] : String | Test.java:24:19:24:30 | b : Bundle [] : String | Test.java:24:42:24:69 | next(...) : String | Test.java:827:9:827:40 | getMapKey(...) | | Test.java:827:36:827:38 | out : Intent [android.content.Intent.extras, ] : String | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : String | Test.java:23:45:23:57 | getExtras(...) : Bundle [] : String | Test.java:827:19:827:39 | getIntent_extras(...) : Bundle [] : String | -| Test.java:827:36:827:38 | out : Intent [android.content.Intent.extras, ] : String | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : String | Test.java:23:45:23:57 | getExtras(...) : Bundle [] : String | Test.java:827:19:827:39 | getIntent_extras(...) : Bundle [] : String | -| Test.java:834:38:834:40 | out : Intent [android.content.Intent.extras, ] : ArrayList | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : ArrayList | Test.java:23:45:23:57 | getExtras(...) : Bundle [] : ArrayList | Test.java:834:21:834:41 | getIntent_extras(...) : Bundle [] : ArrayList | | Test.java:834:38:834:40 | out : Intent [android.content.Intent.extras, ] : ArrayList | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : ArrayList | Test.java:23:45:23:57 | getExtras(...) : Bundle [] : ArrayList | Test.java:834:21:834:41 | getIntent_extras(...) : Bundle [] : ArrayList | | Test.java:848:19:848:39 | getIntent_extras(...) : Bundle [] : String | Test.java:24:19:24:30 | b : Bundle [] : String | Test.java:24:42:24:69 | next(...) : String | Test.java:848:9:848:40 | getMapKey(...) | | Test.java:848:36:848:38 | out : Intent [android.content.Intent.extras, ] : String | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : String | Test.java:23:45:23:57 | getExtras(...) : Bundle [] : String | Test.java:848:19:848:39 | getIntent_extras(...) : Bundle [] : String | -| Test.java:848:36:848:38 | out : Intent [android.content.Intent.extras, ] : String | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : String | Test.java:23:45:23:57 | getExtras(...) : Bundle [] : String | Test.java:848:19:848:39 | getIntent_extras(...) : Bundle [] : String | -| Test.java:855:38:855:40 | out : Intent [android.content.Intent.extras, ] : ArrayList | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : ArrayList | Test.java:23:45:23:57 | getExtras(...) : Bundle [] : ArrayList | Test.java:855:21:855:41 | getIntent_extras(...) : Bundle [] : ArrayList | | Test.java:855:38:855:40 | out : Intent [android.content.Intent.extras, ] : ArrayList | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : ArrayList | Test.java:23:45:23:57 | getExtras(...) : Bundle [] : ArrayList | Test.java:855:21:855:41 | getIntent_extras(...) : Bundle [] : ArrayList | | Test.java:867:44:867:51 | source(...) : String | Test.java:28:29:28:36 | k : String | Test.java:28:89:28:89 | b : Bundle [] : String | Test.java:867:24:867:52 | newBundleWithMapKey(...) : Bundle [] : String | | Test.java:869:19:869:39 | getIntent_extras(...) : Bundle [] : String | Test.java:24:19:24:30 | b : Bundle [] : String | Test.java:24:42:24:69 | next(...) : String | Test.java:869:9:869:40 | getMapKey(...) | | Test.java:869:36:869:38 | out : Intent [android.content.Intent.extras, ] : String | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : String | Test.java:23:45:23:57 | getExtras(...) : Bundle [] : String | Test.java:869:19:869:39 | getIntent_extras(...) : Bundle [] : String | -| Test.java:869:36:869:38 | out : Intent [android.content.Intent.extras, ] : String | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : String | Test.java:23:45:23:57 | getExtras(...) : Bundle [] : String | Test.java:869:19:869:39 | getIntent_extras(...) : Bundle [] : String | -| Test.java:876:38:876:40 | out : Intent [android.content.Intent.extras, ] : Object | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : Object | Test.java:23:45:23:57 | getExtras(...) : Bundle [] : Object | Test.java:876:21:876:41 | getIntent_extras(...) : Bundle [] : Object | | Test.java:876:38:876:40 | out : Intent [android.content.Intent.extras, ] : Object | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : Object | Test.java:23:45:23:57 | getExtras(...) : Bundle [] : Object | Test.java:876:21:876:41 | getIntent_extras(...) : Bundle [] : Object | | Test.java:888:65:888:72 | source(...) : String | Test.java:28:29:28:36 | k : String | Test.java:28:89:28:89 | b : Bundle [] : String | Test.java:888:45:888:73 | newBundleWithMapKey(...) : Bundle [] : String | | Test.java:890:19:890:39 | getIntent_extras(...) : Bundle [] : String | Test.java:24:19:24:30 | b : Bundle [] : String | Test.java:24:42:24:69 | next(...) : String | Test.java:890:9:890:40 | getMapKey(...) | | Test.java:890:36:890:38 | out : Intent [android.content.Intent.extras, ] : String | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : String | Test.java:23:45:23:57 | getExtras(...) : Bundle [] : String | Test.java:890:19:890:39 | getIntent_extras(...) : Bundle [] : String | -| Test.java:890:36:890:38 | out : Intent [android.content.Intent.extras, ] : String | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : String | Test.java:23:45:23:57 | getExtras(...) : Bundle [] : String | Test.java:890:19:890:39 | getIntent_extras(...) : Bundle [] : String | -| Test.java:897:38:897:40 | out : Intent [android.content.Intent.extras, ] : Object | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : Object | Test.java:23:45:23:57 | getExtras(...) : Bundle [] : Object | Test.java:897:21:897:41 | getIntent_extras(...) : Bundle [] : Object | | Test.java:897:38:897:40 | out : Intent [android.content.Intent.extras, ] : Object | Test.java:23:26:23:33 | i : Intent [android.content.Intent.extras, ] : Object | Test.java:23:45:23:57 | getExtras(...) : Bundle [] : Object | Test.java:897:21:897:41 | getIntent_extras(...) : Bundle [] : Object | | Test.java:1064:52:1064:59 | source(...) : String | Test.java:28:29:28:36 | k : String | Test.java:28:89:28:89 | b : Bundle [] : String | Test.java:1064:32:1064:60 | newBundleWithMapKey(...) : Bundle [] : String | | Test.java:1066:20:1066:22 | out : Set [] : String | Test.java:22:19:22:32 | it : Set [] : String | Test.java:22:44:22:63 | next(...) : String | Test.java:1066:9:1066:23 | getElement(...) | diff --git a/java/ql/test/library-tests/frameworks/android/notification/test.expected b/java/ql/test/library-tests/frameworks/android/notification/test.expected index 65015ad867d..6d9b052cf1b 100644 --- a/java/ql/test/library-tests/frameworks/android/notification/test.expected +++ b/java/ql/test/library-tests/frameworks/android/notification/test.expected @@ -223,10 +223,7 @@ edges | Test.java:79:46:79:53 | source(...) : Object | Test.java:26:30:26:43 | element : Object | provenance | | | Test.java:79:46:79:53 | source(...) : Object | Test.java:79:25:79:54 | newWithMapKeyDefault(...) : Bundle [] : String | provenance | MaD:105 | | Test.java:80:4:80:6 | out [post update] : Builder [android.content.Intent.extras, ] : String | Test.java:81:26:81:28 | out : Builder [android.content.Intent.extras, ] : String | provenance | | -| Test.java:80:4:80:6 | out [post update] : Builder [android.content.Intent.extras, ] : String | Test.java:81:26:81:28 | out : Builder [android.content.Intent.extras, ] : String | provenance | | | Test.java:80:18:80:19 | in : Bundle [] : String | Test.java:80:4:80:6 | out [post update] : Builder [android.content.Intent.extras, ] : String | provenance | MaD:4 | -| Test.java:80:18:80:19 | in : Bundle [] : String | Test.java:80:4:80:6 | out [post update] : Builder [android.content.Intent.extras, ] : String | provenance | MaD:4 | -| Test.java:81:26:81:28 | out : Builder [android.content.Intent.extras, ] : String | Test.java:81:26:81:40 | getExtras(...) : Bundle [] : String | provenance | MaD:11 | | Test.java:81:26:81:28 | out : Builder [android.content.Intent.extras, ] : String | Test.java:81:26:81:40 | getExtras(...) : Bundle [] : String | provenance | MaD:11 | | Test.java:81:26:81:40 | getExtras(...) : Bundle [] : String | Test.java:81:9:81:41 | getMapKeyDefault(...) | provenance | MaD:194 | | Test.java:88:16:88:56 | (...)... : Bundle [] : String | Test.java:89:18:89:19 | in : Bundle [] : String | provenance | | @@ -234,10 +231,7 @@ edges | Test.java:88:48:88:55 | source(...) : Object | Test.java:32:32:32:45 | element : Object | provenance | | | Test.java:88:48:88:55 | source(...) : Object | Test.java:88:25:88:56 | newWithMapValueDefault(...) : Bundle [] : String | provenance | MaD:106 | | Test.java:89:4:89:6 | out [post update] : Builder [android.content.Intent.extras, ] : String | Test.java:90:28:90:30 | out : Builder [android.content.Intent.extras, ] : String | provenance | | -| Test.java:89:4:89:6 | out [post update] : Builder [android.content.Intent.extras, ] : String | Test.java:90:28:90:30 | out : Builder [android.content.Intent.extras, ] : String | provenance | | | Test.java:89:18:89:19 | in : Bundle [] : String | Test.java:89:4:89:6 | out [post update] : Builder [android.content.Intent.extras, ] : String | provenance | MaD:5 | -| Test.java:89:18:89:19 | in : Bundle [] : String | Test.java:89:4:89:6 | out [post update] : Builder [android.content.Intent.extras, ] : String | provenance | MaD:5 | -| Test.java:90:28:90:30 | out : Builder [android.content.Intent.extras, ] : String | Test.java:90:28:90:42 | getExtras(...) : Bundle [] : String | provenance | MaD:11 | | Test.java:90:28:90:30 | out : Builder [android.content.Intent.extras, ] : String | Test.java:90:28:90:42 | getExtras(...) : Bundle [] : String | provenance | MaD:11 | | Test.java:90:28:90:42 | getExtras(...) : Bundle [] : String | Test.java:22:28:22:43 | container : Bundle [] : String | provenance | | | Test.java:90:28:90:42 | getExtras(...) : Bundle [] : String | Test.java:90:9:90:43 | getMapValueDefault(...) | provenance | MaD:104 | @@ -254,15 +248,9 @@ edges | Test.java:112:48:112:55 | source(...) : Object | Test.java:32:32:32:45 | element : Object | provenance | | | Test.java:112:48:112:55 | source(...) : Object | Test.java:112:25:112:56 | newWithMapValueDefault(...) : Bundle [] : String | provenance | MaD:106 | | Test.java:113:4:113:10 | builder [post update] : Builder [android.content.Intent.extras, ] : String | Test.java:114:10:114:16 | builder : Builder [android.content.Intent.extras, ] : String | provenance | | -| Test.java:113:4:113:10 | builder [post update] : Builder [android.content.Intent.extras, ] : String | Test.java:114:10:114:16 | builder : Builder [android.content.Intent.extras, ] : String | provenance | | -| Test.java:113:22:113:23 | in : Bundle [] : String | Test.java:113:4:113:10 | builder [post update] : Builder [android.content.Intent.extras, ] : String | provenance | MaD:5 | | Test.java:113:22:113:23 | in : Bundle [] : String | Test.java:113:4:113:10 | builder [post update] : Builder [android.content.Intent.extras, ] : String | provenance | MaD:5 | | Test.java:114:10:114:16 | builder : Builder [android.content.Intent.extras, ] : String | Test.java:114:10:114:24 | build(...) : Action [android.content.Intent.extras, ] : String | provenance | MaD:8 | -| Test.java:114:10:114:16 | builder : Builder [android.content.Intent.extras, ] : String | Test.java:114:10:114:24 | build(...) : Action [android.content.Intent.extras, ] : String | provenance | MaD:8 | -| Test.java:114:10:114:16 | builder : Builder [android.content.Intent.extras, ] : String | Test.java:114:10:114:24 | build(...) : Action [android.content.Intent.extras, ] : String | provenance | MaD:8 | | Test.java:114:10:114:24 | build(...) : Action [android.content.Intent.extras, ] : String | Test.java:115:28:115:30 | out : Action [android.content.Intent.extras, ] : String | provenance | | -| Test.java:114:10:114:24 | build(...) : Action [android.content.Intent.extras, ] : String | Test.java:115:28:115:30 | out : Action [android.content.Intent.extras, ] : String | provenance | | -| Test.java:115:28:115:30 | out : Action [android.content.Intent.extras, ] : String | Test.java:115:28:115:42 | getExtras(...) : Bundle [] : String | provenance | MaD:17 | | Test.java:115:28:115:30 | out : Action [android.content.Intent.extras, ] : String | Test.java:115:28:115:42 | getExtras(...) : Bundle [] : String | provenance | MaD:17 | | Test.java:115:28:115:42 | getExtras(...) : Bundle [] : String | Test.java:22:28:22:43 | container : Bundle [] : String | provenance | | | Test.java:115:28:115:42 | getExtras(...) : Bundle [] : String | Test.java:115:9:115:43 | getMapValueDefault(...) | provenance | MaD:104 | @@ -319,10 +307,7 @@ edges | Test.java:206:46:206:53 | source(...) : Object | Test.java:26:30:26:43 | element : Object | provenance | | | Test.java:206:46:206:53 | source(...) : Object | Test.java:206:25:206:54 | newWithMapKeyDefault(...) : Bundle [] : String | provenance | MaD:105 | | Test.java:207:4:207:6 | out [post update] : Builder [android.content.Intent.extras, ] : String | Test.java:208:26:208:28 | out : Builder [android.content.Intent.extras, ] : String | provenance | | -| Test.java:207:4:207:6 | out [post update] : Builder [android.content.Intent.extras, ] : String | Test.java:208:26:208:28 | out : Builder [android.content.Intent.extras, ] : String | provenance | | | Test.java:207:18:207:19 | in : Bundle [] : String | Test.java:207:4:207:6 | out [post update] : Builder [android.content.Intent.extras, ] : String | provenance | MaD:32 | -| Test.java:207:18:207:19 | in : Bundle [] : String | Test.java:207:4:207:6 | out [post update] : Builder [android.content.Intent.extras, ] : String | provenance | MaD:32 | -| Test.java:208:26:208:28 | out : Builder [android.content.Intent.extras, ] : String | Test.java:208:26:208:40 | getExtras(...) : Bundle [] : String | provenance | MaD:39 | | Test.java:208:26:208:28 | out : Builder [android.content.Intent.extras, ] : String | Test.java:208:26:208:40 | getExtras(...) : Bundle [] : String | provenance | MaD:39 | | Test.java:208:26:208:40 | getExtras(...) : Bundle [] : String | Test.java:208:9:208:41 | getMapKeyDefault(...) | provenance | MaD:194 | | Test.java:214:16:214:56 | (...)... : Bundle [] : String | Test.java:215:18:215:19 | in : Bundle [] : String | provenance | | @@ -330,10 +315,7 @@ edges | Test.java:214:48:214:55 | source(...) : Object | Test.java:32:32:32:45 | element : Object | provenance | | | Test.java:214:48:214:55 | source(...) : Object | Test.java:214:25:214:56 | newWithMapValueDefault(...) : Bundle [] : String | provenance | MaD:106 | | Test.java:215:4:215:6 | out [post update] : Builder [android.content.Intent.extras, ] : String | Test.java:216:28:216:30 | out : Builder [android.content.Intent.extras, ] : String | provenance | | -| Test.java:215:4:215:6 | out [post update] : Builder [android.content.Intent.extras, ] : String | Test.java:216:28:216:30 | out : Builder [android.content.Intent.extras, ] : String | provenance | | | Test.java:215:18:215:19 | in : Bundle [] : String | Test.java:215:4:215:6 | out [post update] : Builder [android.content.Intent.extras, ] : String | provenance | MaD:33 | -| Test.java:215:18:215:19 | in : Bundle [] : String | Test.java:215:4:215:6 | out [post update] : Builder [android.content.Intent.extras, ] : String | provenance | MaD:33 | -| Test.java:216:28:216:30 | out : Builder [android.content.Intent.extras, ] : String | Test.java:216:28:216:42 | getExtras(...) : Bundle [] : String | provenance | MaD:39 | | Test.java:216:28:216:30 | out : Builder [android.content.Intent.extras, ] : String | Test.java:216:28:216:42 | getExtras(...) : Bundle [] : String | provenance | MaD:39 | | Test.java:216:28:216:42 | getExtras(...) : Bundle [] : String | Test.java:22:28:22:43 | container : Bundle [] : String | provenance | | | Test.java:216:28:216:42 | getExtras(...) : Bundle [] : String | Test.java:216:9:216:43 | getMapValueDefault(...) | provenance | MaD:104 | @@ -354,15 +336,9 @@ edges | Test.java:244:48:244:55 | source(...) : Object | Test.java:32:32:32:45 | element : Object | provenance | | | Test.java:244:48:244:55 | source(...) : Object | Test.java:244:25:244:56 | newWithMapValueDefault(...) : Bundle [] : String | provenance | MaD:106 | | Test.java:245:4:245:10 | builder [post update] : Builder [android.content.Intent.extras, ] : String | Test.java:246:10:246:16 | builder : Builder [android.content.Intent.extras, ] : String | provenance | | -| Test.java:245:4:245:10 | builder [post update] : Builder [android.content.Intent.extras, ] : String | Test.java:246:10:246:16 | builder : Builder [android.content.Intent.extras, ] : String | provenance | | -| Test.java:245:22:245:23 | in : Bundle [] : String | Test.java:245:4:245:10 | builder [post update] : Builder [android.content.Intent.extras, ] : String | provenance | MaD:33 | | Test.java:245:22:245:23 | in : Bundle [] : String | Test.java:245:4:245:10 | builder [post update] : Builder [android.content.Intent.extras, ] : String | provenance | MaD:33 | | Test.java:246:10:246:16 | builder : Builder [android.content.Intent.extras, ] : String | Test.java:246:10:246:24 | build(...) : Notification [extras, ] : String | provenance | MaD:36 | -| Test.java:246:10:246:16 | builder : Builder [android.content.Intent.extras, ] : String | Test.java:246:10:246:24 | build(...) : Notification [extras, ] : String | provenance | MaD:36 | -| Test.java:246:10:246:16 | builder : Builder [android.content.Intent.extras, ] : String | Test.java:246:10:246:24 | build(...) : Notification [extras, ] : String | provenance | MaD:36 | | Test.java:246:10:246:24 | build(...) : Notification [extras, ] : String | Test.java:247:28:247:30 | out : Notification [extras, ] : String | provenance | | -| Test.java:246:10:246:24 | build(...) : Notification [extras, ] : String | Test.java:247:28:247:30 | out : Notification [extras, ] : String | provenance | | -| Test.java:247:28:247:30 | out : Notification [extras, ] : String | Test.java:247:28:247:37 | out.extras : Bundle [] : String | provenance | | | Test.java:247:28:247:30 | out : Notification [extras, ] : String | Test.java:247:28:247:37 | out.extras : Bundle [] : String | provenance | | | Test.java:247:28:247:37 | out.extras : Bundle [] : String | Test.java:22:28:22:43 | container : Bundle [] : String | provenance | | | Test.java:247:28:247:37 | out.extras : Bundle [] : String | Test.java:247:9:247:38 | getMapValueDefault(...) | provenance | MaD:104 | @@ -722,10 +698,7 @@ edges | Test.java:851:46:851:53 | source(...) : Object | Test.java:26:30:26:43 | element : Object | provenance | | | Test.java:851:46:851:53 | source(...) : Object | Test.java:851:25:851:54 | newWithMapKeyDefault(...) : Bundle [] : String | provenance | MaD:105 | | Test.java:852:4:852:6 | out [post update] : Builder [android.content.Intent.extras, ] : String | Test.java:853:26:853:28 | out : Builder [android.content.Intent.extras, ] : String | provenance | | -| Test.java:852:4:852:6 | out [post update] : Builder [android.content.Intent.extras, ] : String | Test.java:853:26:853:28 | out : Builder [android.content.Intent.extras, ] : String | provenance | | | Test.java:852:18:852:19 | in : Bundle [] : String | Test.java:852:4:852:6 | out [post update] : Builder [android.content.Intent.extras, ] : String | provenance | MaD:110 | -| Test.java:852:18:852:19 | in : Bundle [] : String | Test.java:852:4:852:6 | out [post update] : Builder [android.content.Intent.extras, ] : String | provenance | MaD:110 | -| Test.java:853:26:853:28 | out : Builder [android.content.Intent.extras, ] : String | Test.java:853:26:853:40 | getExtras(...) : Bundle [] : String | provenance | MaD:117 | | Test.java:853:26:853:28 | out : Builder [android.content.Intent.extras, ] : String | Test.java:853:26:853:40 | getExtras(...) : Bundle [] : String | provenance | MaD:117 | | Test.java:853:26:853:40 | getExtras(...) : Bundle [] : String | Test.java:853:9:853:41 | getMapKeyDefault(...) | provenance | MaD:194 | | Test.java:858:16:858:56 | (...)... : Bundle [] : String | Test.java:859:18:859:19 | in : Bundle [] : String | provenance | | @@ -733,10 +706,7 @@ edges | Test.java:858:48:858:55 | source(...) : Object | Test.java:32:32:32:45 | element : Object | provenance | | | Test.java:858:48:858:55 | source(...) : Object | Test.java:858:25:858:56 | newWithMapValueDefault(...) : Bundle [] : String | provenance | MaD:106 | | Test.java:859:4:859:6 | out [post update] : Builder [android.content.Intent.extras, ] : String | Test.java:860:28:860:30 | out : Builder [android.content.Intent.extras, ] : String | provenance | | -| Test.java:859:4:859:6 | out [post update] : Builder [android.content.Intent.extras, ] : String | Test.java:860:28:860:30 | out : Builder [android.content.Intent.extras, ] : String | provenance | | | Test.java:859:18:859:19 | in : Bundle [] : String | Test.java:859:4:859:6 | out [post update] : Builder [android.content.Intent.extras, ] : String | provenance | MaD:111 | -| Test.java:859:18:859:19 | in : Bundle [] : String | Test.java:859:4:859:6 | out [post update] : Builder [android.content.Intent.extras, ] : String | provenance | MaD:111 | -| Test.java:860:28:860:30 | out : Builder [android.content.Intent.extras, ] : String | Test.java:860:28:860:42 | getExtras(...) : Bundle [] : String | provenance | MaD:117 | | Test.java:860:28:860:30 | out : Builder [android.content.Intent.extras, ] : String | Test.java:860:28:860:42 | getExtras(...) : Bundle [] : String | provenance | MaD:117 | | Test.java:860:28:860:42 | getExtras(...) : Bundle [] : String | Test.java:22:28:22:43 | container : Bundle [] : String | provenance | | | Test.java:860:28:860:42 | getExtras(...) : Bundle [] : String | Test.java:860:9:860:43 | getMapValueDefault(...) | provenance | MaD:104 | @@ -749,15 +719,9 @@ edges | Test.java:873:48:873:55 | source(...) : Object | Test.java:32:32:32:45 | element : Object | provenance | | | Test.java:873:48:873:55 | source(...) : Object | Test.java:873:25:873:56 | newWithMapValueDefault(...) : Bundle [] : String | provenance | MaD:106 | | Test.java:874:4:874:10 | builder [post update] : Builder [android.content.Intent.extras, ] : String | Test.java:875:10:875:16 | builder : Builder [android.content.Intent.extras, ] : String | provenance | | -| Test.java:874:4:874:10 | builder [post update] : Builder [android.content.Intent.extras, ] : String | Test.java:875:10:875:16 | builder : Builder [android.content.Intent.extras, ] : String | provenance | | -| Test.java:874:22:874:23 | in : Bundle [] : String | Test.java:874:4:874:10 | builder [post update] : Builder [android.content.Intent.extras, ] : String | provenance | MaD:111 | | Test.java:874:22:874:23 | in : Bundle [] : String | Test.java:874:4:874:10 | builder [post update] : Builder [android.content.Intent.extras, ] : String | provenance | MaD:111 | | Test.java:875:10:875:16 | builder : Builder [android.content.Intent.extras, ] : String | Test.java:875:10:875:24 | build(...) : Action [android.content.Intent.extras, ] : String | provenance | MaD:114 | -| Test.java:875:10:875:16 | builder : Builder [android.content.Intent.extras, ] : String | Test.java:875:10:875:24 | build(...) : Action [android.content.Intent.extras, ] : String | provenance | MaD:114 | -| Test.java:875:10:875:16 | builder : Builder [android.content.Intent.extras, ] : String | Test.java:875:10:875:24 | build(...) : Action [android.content.Intent.extras, ] : String | provenance | MaD:114 | | Test.java:875:10:875:24 | build(...) : Action [android.content.Intent.extras, ] : String | Test.java:876:28:876:30 | out : Action [android.content.Intent.extras, ] : String | provenance | | -| Test.java:875:10:875:24 | build(...) : Action [android.content.Intent.extras, ] : String | Test.java:876:28:876:30 | out : Action [android.content.Intent.extras, ] : String | provenance | | -| Test.java:876:28:876:30 | out : Action [android.content.Intent.extras, ] : String | Test.java:876:28:876:42 | getExtras(...) : Bundle [] : String | provenance | MaD:123 | | Test.java:876:28:876:30 | out : Action [android.content.Intent.extras, ] : String | Test.java:876:28:876:42 | getExtras(...) : Bundle [] : String | provenance | MaD:123 | | Test.java:876:28:876:42 | getExtras(...) : Bundle [] : String | Test.java:22:28:22:43 | container : Bundle [] : String | provenance | | | Test.java:876:28:876:42 | getExtras(...) : Bundle [] : String | Test.java:876:9:876:43 | getMapValueDefault(...) | provenance | MaD:104 | @@ -858,10 +822,7 @@ edges | Test.java:1042:46:1042:53 | source(...) : Object | Test.java:26:30:26:43 | element : Object | provenance | | | Test.java:1042:46:1042:53 | source(...) : Object | Test.java:1042:25:1042:54 | newWithMapKeyDefault(...) : Bundle [] : String | provenance | MaD:105 | | Test.java:1043:4:1043:6 | out [post update] : Builder [android.content.Intent.extras, ] : String | Test.java:1044:26:1044:28 | out : Builder [android.content.Intent.extras, ] : String | provenance | | -| Test.java:1043:4:1043:6 | out [post update] : Builder [android.content.Intent.extras, ] : String | Test.java:1044:26:1044:28 | out : Builder [android.content.Intent.extras, ] : String | provenance | | | Test.java:1043:18:1043:19 | in : Bundle [] : String | Test.java:1043:4:1043:6 | out [post update] : Builder [android.content.Intent.extras, ] : String | provenance | MaD:134 | -| Test.java:1043:18:1043:19 | in : Bundle [] : String | Test.java:1043:4:1043:6 | out [post update] : Builder [android.content.Intent.extras, ] : String | provenance | MaD:134 | -| Test.java:1044:26:1044:28 | out : Builder [android.content.Intent.extras, ] : String | Test.java:1044:26:1044:40 | getExtras(...) : Bundle [] : String | provenance | MaD:141 | | Test.java:1044:26:1044:28 | out : Builder [android.content.Intent.extras, ] : String | Test.java:1044:26:1044:40 | getExtras(...) : Bundle [] : String | provenance | MaD:141 | | Test.java:1044:26:1044:40 | getExtras(...) : Bundle [] : String | Test.java:1044:9:1044:41 | getMapKeyDefault(...) | provenance | MaD:194 | | Test.java:1049:16:1049:56 | (...)... : Bundle [] : String | Test.java:1050:18:1050:19 | in : Bundle [] : String | provenance | | @@ -869,10 +830,7 @@ edges | Test.java:1049:48:1049:55 | source(...) : Object | Test.java:32:32:32:45 | element : Object | provenance | | | Test.java:1049:48:1049:55 | source(...) : Object | Test.java:1049:25:1049:56 | newWithMapValueDefault(...) : Bundle [] : String | provenance | MaD:106 | | Test.java:1050:4:1050:6 | out [post update] : Builder [android.content.Intent.extras, ] : String | Test.java:1051:28:1051:30 | out : Builder [android.content.Intent.extras, ] : String | provenance | | -| Test.java:1050:4:1050:6 | out [post update] : Builder [android.content.Intent.extras, ] : String | Test.java:1051:28:1051:30 | out : Builder [android.content.Intent.extras, ] : String | provenance | | | Test.java:1050:18:1050:19 | in : Bundle [] : String | Test.java:1050:4:1050:6 | out [post update] : Builder [android.content.Intent.extras, ] : String | provenance | MaD:135 | -| Test.java:1050:18:1050:19 | in : Bundle [] : String | Test.java:1050:4:1050:6 | out [post update] : Builder [android.content.Intent.extras, ] : String | provenance | MaD:135 | -| Test.java:1051:28:1051:30 | out : Builder [android.content.Intent.extras, ] : String | Test.java:1051:28:1051:42 | getExtras(...) : Bundle [] : String | provenance | MaD:141 | | Test.java:1051:28:1051:30 | out : Builder [android.content.Intent.extras, ] : String | Test.java:1051:28:1051:42 | getExtras(...) : Bundle [] : String | provenance | MaD:141 | | Test.java:1051:28:1051:42 | getExtras(...) : Bundle [] : String | Test.java:22:28:22:43 | container : Bundle [] : String | provenance | | | Test.java:1051:28:1051:42 | getExtras(...) : Bundle [] : String | Test.java:1051:9:1051:43 | getMapValueDefault(...) | provenance | MaD:104 | @@ -889,15 +847,9 @@ edges | Test.java:1071:48:1071:55 | source(...) : Object | Test.java:32:32:32:45 | element : Object | provenance | | | Test.java:1071:48:1071:55 | source(...) : Object | Test.java:1071:25:1071:56 | newWithMapValueDefault(...) : Bundle [] : String | provenance | MaD:106 | | Test.java:1072:4:1072:10 | builder [post update] : Builder [android.content.Intent.extras, ] : String | Test.java:1073:10:1073:16 | builder : Builder [android.content.Intent.extras, ] : String | provenance | | -| Test.java:1072:4:1072:10 | builder [post update] : Builder [android.content.Intent.extras, ] : String | Test.java:1073:10:1073:16 | builder : Builder [android.content.Intent.extras, ] : String | provenance | | -| Test.java:1072:22:1072:23 | in : Bundle [] : String | Test.java:1072:4:1072:10 | builder [post update] : Builder [android.content.Intent.extras, ] : String | provenance | MaD:135 | | Test.java:1072:22:1072:23 | in : Bundle [] : String | Test.java:1072:4:1072:10 | builder [post update] : Builder [android.content.Intent.extras, ] : String | provenance | MaD:135 | | Test.java:1073:10:1073:16 | builder : Builder [android.content.Intent.extras, ] : String | Test.java:1073:10:1073:24 | build(...) : Notification [extras, ] : String | provenance | MaD:138 | -| Test.java:1073:10:1073:16 | builder : Builder [android.content.Intent.extras, ] : String | Test.java:1073:10:1073:24 | build(...) : Notification [extras, ] : String | provenance | MaD:138 | -| Test.java:1073:10:1073:16 | builder : Builder [android.content.Intent.extras, ] : String | Test.java:1073:10:1073:24 | build(...) : Notification [extras, ] : String | provenance | MaD:138 | | Test.java:1073:10:1073:24 | build(...) : Notification [extras, ] : String | Test.java:1074:28:1074:30 | out : Notification [extras, ] : String | provenance | | -| Test.java:1073:10:1073:24 | build(...) : Notification [extras, ] : String | Test.java:1074:28:1074:30 | out : Notification [extras, ] : String | provenance | | -| Test.java:1074:28:1074:30 | out : Notification [extras, ] : String | Test.java:1074:28:1074:37 | out.extras : Bundle [] : String | provenance | | | Test.java:1074:28:1074:30 | out : Notification [extras, ] : String | Test.java:1074:28:1074:37 | out.extras : Bundle [] : String | provenance | | | Test.java:1074:28:1074:37 | out.extras : Bundle [] : String | Test.java:22:28:22:43 | container : Bundle [] : String | provenance | | | Test.java:1074:28:1074:37 | out.extras : Bundle [] : String | Test.java:1074:9:1074:38 | getMapValueDefault(...) | provenance | MaD:104 | @@ -1174,21 +1126,17 @@ nodes | Test.java:79:25:79:54 | newWithMapKeyDefault(...) : Bundle [] : String | semmle.label | newWithMapKeyDefault(...) : Bundle [] : String | | Test.java:79:46:79:53 | source(...) : Object | semmle.label | source(...) : Object | | Test.java:80:4:80:6 | out [post update] : Builder [android.content.Intent.extras, ] : String | semmle.label | out [post update] : Builder [android.content.Intent.extras, ] : String | -| Test.java:80:4:80:6 | out [post update] : Builder [android.content.Intent.extras, ] : String | semmle.label | out [post update] : Builder [android.content.Intent.extras, ] : String | | Test.java:80:18:80:19 | in : Bundle [] : String | semmle.label | in : Bundle [] : String | | Test.java:81:9:81:41 | getMapKeyDefault(...) | semmle.label | getMapKeyDefault(...) | | Test.java:81:26:81:28 | out : Builder [android.content.Intent.extras, ] : String | semmle.label | out : Builder [android.content.Intent.extras, ] : String | -| Test.java:81:26:81:28 | out : Builder [android.content.Intent.extras, ] : String | semmle.label | out : Builder [android.content.Intent.extras, ] : String | | Test.java:81:26:81:40 | getExtras(...) : Bundle [] : String | semmle.label | getExtras(...) : Bundle [] : String | | Test.java:88:16:88:56 | (...)... : Bundle [] : String | semmle.label | (...)... : Bundle [] : String | | Test.java:88:25:88:56 | newWithMapValueDefault(...) : Bundle [] : String | semmle.label | newWithMapValueDefault(...) : Bundle [] : String | | Test.java:88:48:88:55 | source(...) : Object | semmle.label | source(...) : Object | | Test.java:89:4:89:6 | out [post update] : Builder [android.content.Intent.extras, ] : String | semmle.label | out [post update] : Builder [android.content.Intent.extras, ] : String | -| Test.java:89:4:89:6 | out [post update] : Builder [android.content.Intent.extras, ] : String | semmle.label | out [post update] : Builder [android.content.Intent.extras, ] : String | | Test.java:89:18:89:19 | in : Bundle [] : String | semmle.label | in : Bundle [] : String | | Test.java:90:9:90:43 | getMapValueDefault(...) | semmle.label | getMapValueDefault(...) | | Test.java:90:28:90:30 | out : Builder [android.content.Intent.extras, ] : String | semmle.label | out : Builder [android.content.Intent.extras, ] : String | -| Test.java:90:28:90:30 | out : Builder [android.content.Intent.extras, ] : String | semmle.label | out : Builder [android.content.Intent.extras, ] : String | | Test.java:90:28:90:42 | getExtras(...) : Bundle [] : String | semmle.label | getExtras(...) : Bundle [] : String | | Test.java:95:37:95:74 | (...)... : Builder | semmle.label | (...)... : Builder | | Test.java:95:67:95:74 | source(...) : Object | semmle.label | source(...) : Object | @@ -1204,15 +1152,11 @@ nodes | Test.java:112:25:112:56 | newWithMapValueDefault(...) : Bundle [] : String | semmle.label | newWithMapValueDefault(...) : Bundle [] : String | | Test.java:112:48:112:55 | source(...) : Object | semmle.label | source(...) : Object | | Test.java:113:4:113:10 | builder [post update] : Builder [android.content.Intent.extras, ] : String | semmle.label | builder [post update] : Builder [android.content.Intent.extras, ] : String | -| Test.java:113:4:113:10 | builder [post update] : Builder [android.content.Intent.extras, ] : String | semmle.label | builder [post update] : Builder [android.content.Intent.extras, ] : String | | Test.java:113:22:113:23 | in : Bundle [] : String | semmle.label | in : Bundle [] : String | | Test.java:114:10:114:16 | builder : Builder [android.content.Intent.extras, ] : String | semmle.label | builder : Builder [android.content.Intent.extras, ] : String | -| Test.java:114:10:114:16 | builder : Builder [android.content.Intent.extras, ] : String | semmle.label | builder : Builder [android.content.Intent.extras, ] : String | -| Test.java:114:10:114:24 | build(...) : Action [android.content.Intent.extras, ] : String | semmle.label | build(...) : Action [android.content.Intent.extras, ] : String | | Test.java:114:10:114:24 | build(...) : Action [android.content.Intent.extras, ] : String | semmle.label | build(...) : Action [android.content.Intent.extras, ] : String | | Test.java:115:9:115:43 | getMapValueDefault(...) | semmle.label | getMapValueDefault(...) | | Test.java:115:28:115:30 | out : Action [android.content.Intent.extras, ] : String | semmle.label | out : Action [android.content.Intent.extras, ] : String | -| Test.java:115:28:115:30 | out : Action [android.content.Intent.extras, ] : String | semmle.label | out : Action [android.content.Intent.extras, ] : String | | Test.java:115:28:115:42 | getExtras(...) : Bundle [] : String | semmle.label | getExtras(...) : Bundle [] : String | | Test.java:120:37:120:74 | (...)... : Builder | semmle.label | (...)... : Builder | | Test.java:120:67:120:74 | source(...) : Object | semmle.label | source(...) : Object | @@ -1278,21 +1222,17 @@ nodes | Test.java:206:25:206:54 | newWithMapKeyDefault(...) : Bundle [] : String | semmle.label | newWithMapKeyDefault(...) : Bundle [] : String | | Test.java:206:46:206:53 | source(...) : Object | semmle.label | source(...) : Object | | Test.java:207:4:207:6 | out [post update] : Builder [android.content.Intent.extras, ] : String | semmle.label | out [post update] : Builder [android.content.Intent.extras, ] : String | -| Test.java:207:4:207:6 | out [post update] : Builder [android.content.Intent.extras, ] : String | semmle.label | out [post update] : Builder [android.content.Intent.extras, ] : String | | Test.java:207:18:207:19 | in : Bundle [] : String | semmle.label | in : Bundle [] : String | | Test.java:208:9:208:41 | getMapKeyDefault(...) | semmle.label | getMapKeyDefault(...) | | Test.java:208:26:208:28 | out : Builder [android.content.Intent.extras, ] : String | semmle.label | out : Builder [android.content.Intent.extras, ] : String | -| Test.java:208:26:208:28 | out : Builder [android.content.Intent.extras, ] : String | semmle.label | out : Builder [android.content.Intent.extras, ] : String | | Test.java:208:26:208:40 | getExtras(...) : Bundle [] : String | semmle.label | getExtras(...) : Bundle [] : String | | Test.java:214:16:214:56 | (...)... : Bundle [] : String | semmle.label | (...)... : Bundle [] : String | | Test.java:214:25:214:56 | newWithMapValueDefault(...) : Bundle [] : String | semmle.label | newWithMapValueDefault(...) : Bundle [] : String | | Test.java:214:48:214:55 | source(...) : Object | semmle.label | source(...) : Object | | Test.java:215:4:215:6 | out [post update] : Builder [android.content.Intent.extras, ] : String | semmle.label | out [post update] : Builder [android.content.Intent.extras, ] : String | -| Test.java:215:4:215:6 | out [post update] : Builder [android.content.Intent.extras, ] : String | semmle.label | out [post update] : Builder [android.content.Intent.extras, ] : String | | Test.java:215:18:215:19 | in : Bundle [] : String | semmle.label | in : Bundle [] : String | | Test.java:216:9:216:43 | getMapValueDefault(...) | semmle.label | getMapValueDefault(...) | | Test.java:216:28:216:30 | out : Builder [android.content.Intent.extras, ] : String | semmle.label | out : Builder [android.content.Intent.extras, ] : String | -| Test.java:216:28:216:30 | out : Builder [android.content.Intent.extras, ] : String | semmle.label | out : Builder [android.content.Intent.extras, ] : String | | Test.java:216:28:216:42 | getExtras(...) : Bundle [] : String | semmle.label | getExtras(...) : Bundle [] : String | | Test.java:221:30:221:60 | (...)... : Builder | semmle.label | (...)... : Builder | | Test.java:221:53:221:60 | source(...) : Object | semmle.label | source(...) : Object | @@ -1313,15 +1253,11 @@ nodes | Test.java:244:25:244:56 | newWithMapValueDefault(...) : Bundle [] : String | semmle.label | newWithMapValueDefault(...) : Bundle [] : String | | Test.java:244:48:244:55 | source(...) : Object | semmle.label | source(...) : Object | | Test.java:245:4:245:10 | builder [post update] : Builder [android.content.Intent.extras, ] : String | semmle.label | builder [post update] : Builder [android.content.Intent.extras, ] : String | -| Test.java:245:4:245:10 | builder [post update] : Builder [android.content.Intent.extras, ] : String | semmle.label | builder [post update] : Builder [android.content.Intent.extras, ] : String | | Test.java:245:22:245:23 | in : Bundle [] : String | semmle.label | in : Bundle [] : String | | Test.java:246:10:246:16 | builder : Builder [android.content.Intent.extras, ] : String | semmle.label | builder : Builder [android.content.Intent.extras, ] : String | -| Test.java:246:10:246:16 | builder : Builder [android.content.Intent.extras, ] : String | semmle.label | builder : Builder [android.content.Intent.extras, ] : String | -| Test.java:246:10:246:24 | build(...) : Notification [extras, ] : String | semmle.label | build(...) : Notification [extras, ] : String | | Test.java:246:10:246:24 | build(...) : Notification [extras, ] : String | semmle.label | build(...) : Notification [extras, ] : String | | Test.java:247:9:247:38 | getMapValueDefault(...) | semmle.label | getMapValueDefault(...) | | Test.java:247:28:247:30 | out : Notification [extras, ] : String | semmle.label | out : Notification [extras, ] : String | -| Test.java:247:28:247:30 | out : Notification [extras, ] : String | semmle.label | out : Notification [extras, ] : String | | Test.java:247:28:247:37 | out.extras : Bundle [] : String | semmle.label | out.extras : Bundle [] : String | | Test.java:252:30:252:60 | (...)... : Builder | semmle.label | (...)... : Builder | | Test.java:252:53:252:60 | source(...) : Object | semmle.label | source(...) : Object | @@ -1765,21 +1701,17 @@ nodes | Test.java:851:25:851:54 | newWithMapKeyDefault(...) : Bundle [] : String | semmle.label | newWithMapKeyDefault(...) : Bundle [] : String | | Test.java:851:46:851:53 | source(...) : Object | semmle.label | source(...) : Object | | Test.java:852:4:852:6 | out [post update] : Builder [android.content.Intent.extras, ] : String | semmle.label | out [post update] : Builder [android.content.Intent.extras, ] : String | -| Test.java:852:4:852:6 | out [post update] : Builder [android.content.Intent.extras, ] : String | semmle.label | out [post update] : Builder [android.content.Intent.extras, ] : String | | Test.java:852:18:852:19 | in : Bundle [] : String | semmle.label | in : Bundle [] : String | | Test.java:853:9:853:41 | getMapKeyDefault(...) | semmle.label | getMapKeyDefault(...) | | Test.java:853:26:853:28 | out : Builder [android.content.Intent.extras, ] : String | semmle.label | out : Builder [android.content.Intent.extras, ] : String | -| Test.java:853:26:853:28 | out : Builder [android.content.Intent.extras, ] : String | semmle.label | out : Builder [android.content.Intent.extras, ] : String | | Test.java:853:26:853:40 | getExtras(...) : Bundle [] : String | semmle.label | getExtras(...) : Bundle [] : String | | Test.java:858:16:858:56 | (...)... : Bundle [] : String | semmle.label | (...)... : Bundle [] : String | | Test.java:858:25:858:56 | newWithMapValueDefault(...) : Bundle [] : String | semmle.label | newWithMapValueDefault(...) : Bundle [] : String | | Test.java:858:48:858:55 | source(...) : Object | semmle.label | source(...) : Object | | Test.java:859:4:859:6 | out [post update] : Builder [android.content.Intent.extras, ] : String | semmle.label | out [post update] : Builder [android.content.Intent.extras, ] : String | -| Test.java:859:4:859:6 | out [post update] : Builder [android.content.Intent.extras, ] : String | semmle.label | out [post update] : Builder [android.content.Intent.extras, ] : String | | Test.java:859:18:859:19 | in : Bundle [] : String | semmle.label | in : Bundle [] : String | | Test.java:860:9:860:43 | getMapValueDefault(...) | semmle.label | getMapValueDefault(...) | | Test.java:860:28:860:30 | out : Builder [android.content.Intent.extras, ] : String | semmle.label | out : Builder [android.content.Intent.extras, ] : String | -| Test.java:860:28:860:30 | out : Builder [android.content.Intent.extras, ] : String | semmle.label | out : Builder [android.content.Intent.extras, ] : String | | Test.java:860:28:860:42 | getExtras(...) : Bundle [] : String | semmle.label | getExtras(...) : Bundle [] : String | | Test.java:865:43:865:86 | (...)... : Builder | semmle.label | (...)... : Builder | | Test.java:865:79:865:86 | source(...) : Object | semmle.label | source(...) : Object | @@ -1790,15 +1722,11 @@ nodes | Test.java:873:25:873:56 | newWithMapValueDefault(...) : Bundle [] : String | semmle.label | newWithMapValueDefault(...) : Bundle [] : String | | Test.java:873:48:873:55 | source(...) : Object | semmle.label | source(...) : Object | | Test.java:874:4:874:10 | builder [post update] : Builder [android.content.Intent.extras, ] : String | semmle.label | builder [post update] : Builder [android.content.Intent.extras, ] : String | -| Test.java:874:4:874:10 | builder [post update] : Builder [android.content.Intent.extras, ] : String | semmle.label | builder [post update] : Builder [android.content.Intent.extras, ] : String | | Test.java:874:22:874:23 | in : Bundle [] : String | semmle.label | in : Bundle [] : String | | Test.java:875:10:875:16 | builder : Builder [android.content.Intent.extras, ] : String | semmle.label | builder : Builder [android.content.Intent.extras, ] : String | -| Test.java:875:10:875:16 | builder : Builder [android.content.Intent.extras, ] : String | semmle.label | builder : Builder [android.content.Intent.extras, ] : String | -| Test.java:875:10:875:24 | build(...) : Action [android.content.Intent.extras, ] : String | semmle.label | build(...) : Action [android.content.Intent.extras, ] : String | | Test.java:875:10:875:24 | build(...) : Action [android.content.Intent.extras, ] : String | semmle.label | build(...) : Action [android.content.Intent.extras, ] : String | | Test.java:876:9:876:43 | getMapValueDefault(...) | semmle.label | getMapValueDefault(...) | | Test.java:876:28:876:30 | out : Action [android.content.Intent.extras, ] : String | semmle.label | out : Action [android.content.Intent.extras, ] : String | -| Test.java:876:28:876:30 | out : Action [android.content.Intent.extras, ] : String | semmle.label | out : Action [android.content.Intent.extras, ] : String | | Test.java:876:28:876:42 | getExtras(...) : Bundle [] : String | semmle.label | getExtras(...) : Bundle [] : String | | Test.java:881:43:881:86 | (...)... : Builder | semmle.label | (...)... : Builder | | Test.java:881:79:881:86 | source(...) : Object | semmle.label | source(...) : Object | @@ -1919,21 +1847,17 @@ nodes | Test.java:1042:25:1042:54 | newWithMapKeyDefault(...) : Bundle [] : String | semmle.label | newWithMapKeyDefault(...) : Bundle [] : String | | Test.java:1042:46:1042:53 | source(...) : Object | semmle.label | source(...) : Object | | Test.java:1043:4:1043:6 | out [post update] : Builder [android.content.Intent.extras, ] : String | semmle.label | out [post update] : Builder [android.content.Intent.extras, ] : String | -| Test.java:1043:4:1043:6 | out [post update] : Builder [android.content.Intent.extras, ] : String | semmle.label | out [post update] : Builder [android.content.Intent.extras, ] : String | | Test.java:1043:18:1043:19 | in : Bundle [] : String | semmle.label | in : Bundle [] : String | | Test.java:1044:9:1044:41 | getMapKeyDefault(...) | semmle.label | getMapKeyDefault(...) | | Test.java:1044:26:1044:28 | out : Builder [android.content.Intent.extras, ] : String | semmle.label | out : Builder [android.content.Intent.extras, ] : String | -| Test.java:1044:26:1044:28 | out : Builder [android.content.Intent.extras, ] : String | semmle.label | out : Builder [android.content.Intent.extras, ] : String | | Test.java:1044:26:1044:40 | getExtras(...) : Bundle [] : String | semmle.label | getExtras(...) : Bundle [] : String | | Test.java:1049:16:1049:56 | (...)... : Bundle [] : String | semmle.label | (...)... : Bundle [] : String | | Test.java:1049:25:1049:56 | newWithMapValueDefault(...) : Bundle [] : String | semmle.label | newWithMapValueDefault(...) : Bundle [] : String | | Test.java:1049:48:1049:55 | source(...) : Object | semmle.label | source(...) : Object | | Test.java:1050:4:1050:6 | out [post update] : Builder [android.content.Intent.extras, ] : String | semmle.label | out [post update] : Builder [android.content.Intent.extras, ] : String | -| Test.java:1050:4:1050:6 | out [post update] : Builder [android.content.Intent.extras, ] : String | semmle.label | out [post update] : Builder [android.content.Intent.extras, ] : String | | Test.java:1050:18:1050:19 | in : Bundle [] : String | semmle.label | in : Bundle [] : String | | Test.java:1051:9:1051:43 | getMapValueDefault(...) | semmle.label | getMapValueDefault(...) | | Test.java:1051:28:1051:30 | out : Builder [android.content.Intent.extras, ] : String | semmle.label | out : Builder [android.content.Intent.extras, ] : String | -| Test.java:1051:28:1051:30 | out : Builder [android.content.Intent.extras, ] : String | semmle.label | out : Builder [android.content.Intent.extras, ] : String | | Test.java:1051:28:1051:42 | getExtras(...) : Bundle [] : String | semmle.label | getExtras(...) : Bundle [] : String | | Test.java:1056:36:1056:72 | (...)... : Builder | semmle.label | (...)... : Builder | | Test.java:1056:65:1056:72 | source(...) : Object | semmle.label | source(...) : Object | @@ -1949,15 +1873,11 @@ nodes | Test.java:1071:25:1071:56 | newWithMapValueDefault(...) : Bundle [] : String | semmle.label | newWithMapValueDefault(...) : Bundle [] : String | | Test.java:1071:48:1071:55 | source(...) : Object | semmle.label | source(...) : Object | | Test.java:1072:4:1072:10 | builder [post update] : Builder [android.content.Intent.extras, ] : String | semmle.label | builder [post update] : Builder [android.content.Intent.extras, ] : String | -| Test.java:1072:4:1072:10 | builder [post update] : Builder [android.content.Intent.extras, ] : String | semmle.label | builder [post update] : Builder [android.content.Intent.extras, ] : String | | Test.java:1072:22:1072:23 | in : Bundle [] : String | semmle.label | in : Bundle [] : String | | Test.java:1073:10:1073:16 | builder : Builder [android.content.Intent.extras, ] : String | semmle.label | builder : Builder [android.content.Intent.extras, ] : String | -| Test.java:1073:10:1073:16 | builder : Builder [android.content.Intent.extras, ] : String | semmle.label | builder : Builder [android.content.Intent.extras, ] : String | -| Test.java:1073:10:1073:24 | build(...) : Notification [extras, ] : String | semmle.label | build(...) : Notification [extras, ] : String | | Test.java:1073:10:1073:24 | build(...) : Notification [extras, ] : String | semmle.label | build(...) : Notification [extras, ] : String | | Test.java:1074:9:1074:38 | getMapValueDefault(...) | semmle.label | getMapValueDefault(...) | | Test.java:1074:28:1074:30 | out : Notification [extras, ] : String | semmle.label | out : Notification [extras, ] : String | -| Test.java:1074:28:1074:30 | out : Notification [extras, ] : String | semmle.label | out : Notification [extras, ] : String | | Test.java:1074:28:1074:37 | out.extras : Bundle [] : String | semmle.label | out.extras : Bundle [] : String | | Test.java:1079:36:1079:72 | (...)... : Builder | semmle.label | (...)... : Builder | | Test.java:1079:65:1079:72 | source(...) : Object | semmle.label | source(...) : Object | diff --git a/java/ql/test/library-tests/frameworks/android/taint-database/flowSteps.expected b/java/ql/test/library-tests/frameworks/android/taint-database/flowSteps.expected index 48de9172b36..e69de29bb2d 100644 --- a/java/ql/test/library-tests/frameworks/android/taint-database/flowSteps.expected +++ b/java/ql/test/library-tests/frameworks/android/taint-database/flowSteps.expected @@ -1,2 +0,0 @@ -failures -testFailures diff --git a/java/ql/test/library-tests/frameworks/android/taint-database/sinks.expected b/java/ql/test/library-tests/frameworks/android/taint-database/sinks.expected index 48de9172b36..e69de29bb2d 100644 --- a/java/ql/test/library-tests/frameworks/android/taint-database/sinks.expected +++ b/java/ql/test/library-tests/frameworks/android/taint-database/sinks.expected @@ -1,2 +0,0 @@ -failures -testFailures diff --git a/java/ql/test/library-tests/frameworks/guava/handwritten/flow.expected b/java/ql/test/library-tests/frameworks/guava/handwritten/flow.expected index 48de9172b36..e69de29bb2d 100644 --- a/java/ql/test/library-tests/frameworks/guava/handwritten/flow.expected +++ b/java/ql/test/library-tests/frameworks/guava/handwritten/flow.expected @@ -1,2 +0,0 @@ -failures -testFailures diff --git a/java/ql/test/library-tests/frameworks/jms/FlowTest.expected b/java/ql/test/library-tests/frameworks/jms/FlowTest.expected index 48de9172b36..e69de29bb2d 100644 --- a/java/ql/test/library-tests/frameworks/jms/FlowTest.expected +++ b/java/ql/test/library-tests/frameworks/jms/FlowTest.expected @@ -1,2 +0,0 @@ -failures -testFailures diff --git a/java/ql/test/library-tests/frameworks/jms/RemoteSourcesTest.expected b/java/ql/test/library-tests/frameworks/jms/RemoteSourcesTest.expected index 48de9172b36..e69de29bb2d 100644 --- a/java/ql/test/library-tests/frameworks/jms/RemoteSourcesTest.expected +++ b/java/ql/test/library-tests/frameworks/jms/RemoteSourcesTest.expected @@ -1,2 +0,0 @@ -failures -testFailures diff --git a/java/ql/test/library-tests/frameworks/rabbitmq/SourceTest.expected b/java/ql/test/library-tests/frameworks/rabbitmq/SourceTest.expected index 48de9172b36..e69de29bb2d 100644 --- a/java/ql/test/library-tests/frameworks/rabbitmq/SourceTest.expected +++ b/java/ql/test/library-tests/frameworks/rabbitmq/SourceTest.expected @@ -1,2 +0,0 @@ -failures -testFailures diff --git a/java/ql/test/library-tests/neutrals/neutralsinks/NeutralSinksTest.expected b/java/ql/test/library-tests/neutrals/neutralsinks/NeutralSinksTest.expected index 48de9172b36..e69de29bb2d 100644 --- a/java/ql/test/library-tests/neutrals/neutralsinks/NeutralSinksTest.expected +++ b/java/ql/test/library-tests/neutrals/neutralsinks/NeutralSinksTest.expected @@ -1,2 +0,0 @@ -failures -testFailures diff --git a/java/ql/test/library-tests/xml/XMLTest.expected b/java/ql/test/library-tests/xml/XMLTest.expected index 191aad0a6e2..cbdfca1fc67 100644 --- a/java/ql/test/library-tests/xml/XMLTest.expected +++ b/java/ql/test/library-tests/xml/XMLTest.expected @@ -1,4 +1,2 @@ -testFailures | test.xml:4:5:4:32 | attribute=value | Unexpected result: hasXmlResult | | test.xml:5:29:5:52 | $ hasXmlResult | Missing result: hasXmlResult | -failures diff --git a/java/ql/test/query-tests/security/CWE-023/semmle/tests/PartialPathTraversalFromRemoteTest.expected b/java/ql/test/query-tests/security/CWE-023/semmle/tests/PartialPathTraversalFromRemoteTest.expected index 48de9172b36..e69de29bb2d 100644 --- a/java/ql/test/query-tests/security/CWE-023/semmle/tests/PartialPathTraversalFromRemoteTest.expected +++ b/java/ql/test/query-tests/security/CWE-023/semmle/tests/PartialPathTraversalFromRemoteTest.expected @@ -1,2 +0,0 @@ -failures -testFailures diff --git a/java/ql/test/query-tests/security/CWE-074/JndiInjectionTest.expected b/java/ql/test/query-tests/security/CWE-074/JndiInjectionTest.expected index 48de9172b36..e69de29bb2d 100644 --- a/java/ql/test/query-tests/security/CWE-074/JndiInjectionTest.expected +++ b/java/ql/test/query-tests/security/CWE-074/JndiInjectionTest.expected @@ -1,2 +0,0 @@ -failures -testFailures diff --git a/java/ql/test/query-tests/security/CWE-074/XsltInjectionTest.expected b/java/ql/test/query-tests/security/CWE-074/XsltInjectionTest.expected index 48de9172b36..e69de29bb2d 100644 --- a/java/ql/test/query-tests/security/CWE-074/XsltInjectionTest.expected +++ b/java/ql/test/query-tests/security/CWE-074/XsltInjectionTest.expected @@ -1,2 +0,0 @@ -failures -testFailures diff --git a/java/ql/test/query-tests/security/CWE-079/semmle/tests/XSS.expected b/java/ql/test/query-tests/security/CWE-079/semmle/tests/XSS.expected index 48de9172b36..e69de29bb2d 100644 --- a/java/ql/test/query-tests/security/CWE-079/semmle/tests/XSS.expected +++ b/java/ql/test/query-tests/security/CWE-079/semmle/tests/XSS.expected @@ -1,2 +0,0 @@ -failures -testFailures diff --git a/java/ql/test/query-tests/security/CWE-089/semmle/examples/springjdbc.expected b/java/ql/test/query-tests/security/CWE-089/semmle/examples/springjdbc.expected index 48de9172b36..e69de29bb2d 100644 --- a/java/ql/test/query-tests/security/CWE-089/semmle/examples/springjdbc.expected +++ b/java/ql/test/query-tests/security/CWE-089/semmle/examples/springjdbc.expected @@ -1,2 +0,0 @@ -failures -testFailures diff --git a/java/ql/test/query-tests/security/CWE-094/ApkInstallationTest.expected b/java/ql/test/query-tests/security/CWE-094/ApkInstallationTest.expected index 48de9172b36..e69de29bb2d 100644 --- a/java/ql/test/query-tests/security/CWE-094/ApkInstallationTest.expected +++ b/java/ql/test/query-tests/security/CWE-094/ApkInstallationTest.expected @@ -1,2 +0,0 @@ -failures -testFailures diff --git a/java/ql/test/query-tests/security/CWE-094/GroovyInjectionTest.expected b/java/ql/test/query-tests/security/CWE-094/GroovyInjectionTest.expected index 48de9172b36..e69de29bb2d 100644 --- a/java/ql/test/query-tests/security/CWE-094/GroovyInjectionTest.expected +++ b/java/ql/test/query-tests/security/CWE-094/GroovyInjectionTest.expected @@ -1,2 +0,0 @@ -failures -testFailures diff --git a/java/ql/test/query-tests/security/CWE-094/JexlInjectionTest.expected b/java/ql/test/query-tests/security/CWE-094/JexlInjectionTest.expected index 48de9172b36..e69de29bb2d 100644 --- a/java/ql/test/query-tests/security/CWE-094/JexlInjectionTest.expected +++ b/java/ql/test/query-tests/security/CWE-094/JexlInjectionTest.expected @@ -1,2 +0,0 @@ -failures -testFailures diff --git a/java/ql/test/query-tests/security/CWE-094/MvelInjectionTest.expected b/java/ql/test/query-tests/security/CWE-094/MvelInjectionTest.expected index 48de9172b36..e69de29bb2d 100644 --- a/java/ql/test/query-tests/security/CWE-094/MvelInjectionTest.expected +++ b/java/ql/test/query-tests/security/CWE-094/MvelInjectionTest.expected @@ -1,2 +0,0 @@ -failures -testFailures diff --git a/java/ql/test/query-tests/security/CWE-094/SpelInjectionTest.expected b/java/ql/test/query-tests/security/CWE-094/SpelInjectionTest.expected index 48de9172b36..e69de29bb2d 100644 --- a/java/ql/test/query-tests/security/CWE-094/SpelInjectionTest.expected +++ b/java/ql/test/query-tests/security/CWE-094/SpelInjectionTest.expected @@ -1,2 +0,0 @@ -failures -testFailures diff --git a/java/ql/test/query-tests/security/CWE-094/TemplateInjectionTest.expected b/java/ql/test/query-tests/security/CWE-094/TemplateInjectionTest.expected index 48de9172b36..e69de29bb2d 100644 --- a/java/ql/test/query-tests/security/CWE-094/TemplateInjectionTest.expected +++ b/java/ql/test/query-tests/security/CWE-094/TemplateInjectionTest.expected @@ -1,2 +0,0 @@ -failures -testFailures diff --git a/java/ql/test/query-tests/security/CWE-1204/StaticInitializationVectorTest.expected b/java/ql/test/query-tests/security/CWE-1204/StaticInitializationVectorTest.expected index 48de9172b36..e69de29bb2d 100644 --- a/java/ql/test/query-tests/security/CWE-1204/StaticInitializationVectorTest.expected +++ b/java/ql/test/query-tests/security/CWE-1204/StaticInitializationVectorTest.expected @@ -1,2 +0,0 @@ -failures -testFailures diff --git a/java/ql/test/query-tests/security/CWE-200/semmle/tests/SensitiveNotification/test.expected b/java/ql/test/query-tests/security/CWE-200/semmle/tests/SensitiveNotification/test.expected index 8ec8033d086..e69de29bb2d 100644 --- a/java/ql/test/query-tests/security/CWE-200/semmle/tests/SensitiveNotification/test.expected +++ b/java/ql/test/query-tests/security/CWE-200/semmle/tests/SensitiveNotification/test.expected @@ -1,2 +0,0 @@ -testFailures -failures diff --git a/java/ql/test/query-tests/security/CWE-200/semmle/tests/SensitiveTextView/test.expected b/java/ql/test/query-tests/security/CWE-200/semmle/tests/SensitiveTextView/test.expected index 8ec8033d086..e69de29bb2d 100644 --- a/java/ql/test/query-tests/security/CWE-200/semmle/tests/SensitiveTextView/test.expected +++ b/java/ql/test/query-tests/security/CWE-200/semmle/tests/SensitiveTextView/test.expected @@ -1,2 +0,0 @@ -testFailures -failures diff --git a/java/ql/test/query-tests/security/CWE-273/UnsafeCertTrustTest.expected b/java/ql/test/query-tests/security/CWE-273/UnsafeCertTrustTest.expected index 48de9172b36..e69de29bb2d 100644 --- a/java/ql/test/query-tests/security/CWE-273/UnsafeCertTrustTest.expected +++ b/java/ql/test/query-tests/security/CWE-273/UnsafeCertTrustTest.expected @@ -1,2 +0,0 @@ -failures -testFailures diff --git a/java/ql/test/query-tests/security/CWE-287/InsecureKeys/Test1/InsecureKeys.expected b/java/ql/test/query-tests/security/CWE-287/InsecureKeys/Test1/InsecureKeys.expected index 8ec8033d086..e69de29bb2d 100644 --- a/java/ql/test/query-tests/security/CWE-287/InsecureKeys/Test1/InsecureKeys.expected +++ b/java/ql/test/query-tests/security/CWE-287/InsecureKeys/Test1/InsecureKeys.expected @@ -1,2 +0,0 @@ -testFailures -failures diff --git a/java/ql/test/query-tests/security/CWE-287/InsecureKeys/Test2/InsecureKeys.expected b/java/ql/test/query-tests/security/CWE-287/InsecureKeys/Test2/InsecureKeys.expected index 8ec8033d086..e69de29bb2d 100644 --- a/java/ql/test/query-tests/security/CWE-287/InsecureKeys/Test2/InsecureKeys.expected +++ b/java/ql/test/query-tests/security/CWE-287/InsecureKeys/Test2/InsecureKeys.expected @@ -1,2 +0,0 @@ -testFailures -failures diff --git a/java/ql/test/query-tests/security/CWE-287/InsecureLocalAuth/InsecureLocalAuth.expected b/java/ql/test/query-tests/security/CWE-287/InsecureLocalAuth/InsecureLocalAuth.expected index 8ec8033d086..e69de29bb2d 100644 --- a/java/ql/test/query-tests/security/CWE-287/InsecureLocalAuth/InsecureLocalAuth.expected +++ b/java/ql/test/query-tests/security/CWE-287/InsecureLocalAuth/InsecureLocalAuth.expected @@ -1,2 +0,0 @@ -testFailures -failures diff --git a/java/ql/test/query-tests/security/CWE-295/AndroidMissingCertificatePinning/Test1/test.expected b/java/ql/test/query-tests/security/CWE-295/AndroidMissingCertificatePinning/Test1/test.expected index 48de9172b36..e69de29bb2d 100644 --- a/java/ql/test/query-tests/security/CWE-295/AndroidMissingCertificatePinning/Test1/test.expected +++ b/java/ql/test/query-tests/security/CWE-295/AndroidMissingCertificatePinning/Test1/test.expected @@ -1,2 +0,0 @@ -failures -testFailures diff --git a/java/ql/test/query-tests/security/CWE-295/AndroidMissingCertificatePinning/Test2/test.expected b/java/ql/test/query-tests/security/CWE-295/AndroidMissingCertificatePinning/Test2/test.expected index 48de9172b36..e69de29bb2d 100644 --- a/java/ql/test/query-tests/security/CWE-295/AndroidMissingCertificatePinning/Test2/test.expected +++ b/java/ql/test/query-tests/security/CWE-295/AndroidMissingCertificatePinning/Test2/test.expected @@ -1,2 +0,0 @@ -failures -testFailures diff --git a/java/ql/test/query-tests/security/CWE-295/AndroidMissingCertificatePinning/Test3/test.expected b/java/ql/test/query-tests/security/CWE-295/AndroidMissingCertificatePinning/Test3/test.expected index 48de9172b36..e69de29bb2d 100644 --- a/java/ql/test/query-tests/security/CWE-295/AndroidMissingCertificatePinning/Test3/test.expected +++ b/java/ql/test/query-tests/security/CWE-295/AndroidMissingCertificatePinning/Test3/test.expected @@ -1,2 +0,0 @@ -failures -testFailures diff --git a/java/ql/test/query-tests/security/CWE-295/AndroidMissingCertificatePinning/Test4/test.expected b/java/ql/test/query-tests/security/CWE-295/AndroidMissingCertificatePinning/Test4/test.expected index 48de9172b36..e69de29bb2d 100644 --- a/java/ql/test/query-tests/security/CWE-295/AndroidMissingCertificatePinning/Test4/test.expected +++ b/java/ql/test/query-tests/security/CWE-295/AndroidMissingCertificatePinning/Test4/test.expected @@ -1,2 +0,0 @@ -failures -testFailures diff --git a/java/ql/test/query-tests/security/CWE-295/AndroidMissingCertificatePinning/Test5/test.expected b/java/ql/test/query-tests/security/CWE-295/AndroidMissingCertificatePinning/Test5/test.expected index 48de9172b36..e69de29bb2d 100644 --- a/java/ql/test/query-tests/security/CWE-295/AndroidMissingCertificatePinning/Test5/test.expected +++ b/java/ql/test/query-tests/security/CWE-295/AndroidMissingCertificatePinning/Test5/test.expected @@ -1,2 +0,0 @@ -failures -testFailures diff --git a/java/ql/test/query-tests/security/CWE-295/ImproperWebVeiwCertificateValidation/test.expected b/java/ql/test/query-tests/security/CWE-295/ImproperWebVeiwCertificateValidation/test.expected index 48de9172b36..e69de29bb2d 100644 --- a/java/ql/test/query-tests/security/CWE-295/ImproperWebVeiwCertificateValidation/test.expected +++ b/java/ql/test/query-tests/security/CWE-295/ImproperWebVeiwCertificateValidation/test.expected @@ -1,2 +0,0 @@ -failures -testFailures diff --git a/java/ql/test/query-tests/security/CWE-295/InsecureTrustManager/InsecureTrustManagerTest.expected b/java/ql/test/query-tests/security/CWE-295/InsecureTrustManager/InsecureTrustManagerTest.expected index 48de9172b36..e69de29bb2d 100644 --- a/java/ql/test/query-tests/security/CWE-295/InsecureTrustManager/InsecureTrustManagerTest.expected +++ b/java/ql/test/query-tests/security/CWE-295/InsecureTrustManager/InsecureTrustManagerTest.expected @@ -1,2 +0,0 @@ -failures -testFailures diff --git a/java/ql/test/query-tests/security/CWE-297/InsecureJavaMailTest.expected b/java/ql/test/query-tests/security/CWE-297/InsecureJavaMailTest.expected index 48de9172b36..e69de29bb2d 100644 --- a/java/ql/test/query-tests/security/CWE-297/InsecureJavaMailTest.expected +++ b/java/ql/test/query-tests/security/CWE-297/InsecureJavaMailTest.expected @@ -1,2 +0,0 @@ -failures -testFailures diff --git a/java/ql/test/query-tests/security/CWE-312/android/CleartextStorage/CleartextStorageAndroidDatabaseTest.expected b/java/ql/test/query-tests/security/CWE-312/android/CleartextStorage/CleartextStorageAndroidDatabaseTest.expected index 48de9172b36..e69de29bb2d 100644 --- a/java/ql/test/query-tests/security/CWE-312/android/CleartextStorage/CleartextStorageAndroidDatabaseTest.expected +++ b/java/ql/test/query-tests/security/CWE-312/android/CleartextStorage/CleartextStorageAndroidDatabaseTest.expected @@ -1,2 +0,0 @@ -failures -testFailures diff --git a/java/ql/test/query-tests/security/CWE-312/android/CleartextStorage/CleartextStorageAndroidFilesystemTest.expected b/java/ql/test/query-tests/security/CWE-312/android/CleartextStorage/CleartextStorageAndroidFilesystemTest.expected index 48de9172b36..e69de29bb2d 100644 --- a/java/ql/test/query-tests/security/CWE-312/android/CleartextStorage/CleartextStorageAndroidFilesystemTest.expected +++ b/java/ql/test/query-tests/security/CWE-312/android/CleartextStorage/CleartextStorageAndroidFilesystemTest.expected @@ -1,2 +0,0 @@ -failures -testFailures diff --git a/java/ql/test/query-tests/security/CWE-312/android/CleartextStorage/CleartextStorageSharedPrefsTest.expected b/java/ql/test/query-tests/security/CWE-312/android/CleartextStorage/CleartextStorageSharedPrefsTest.expected index 48de9172b36..e69de29bb2d 100644 --- a/java/ql/test/query-tests/security/CWE-312/android/CleartextStorage/CleartextStorageSharedPrefsTest.expected +++ b/java/ql/test/query-tests/security/CWE-312/android/CleartextStorage/CleartextStorageSharedPrefsTest.expected @@ -1,2 +0,0 @@ -failures -testFailures diff --git a/java/ql/test/query-tests/security/CWE-326/InsufficientKeySizeTest.expected b/java/ql/test/query-tests/security/CWE-326/InsufficientKeySizeTest.expected index 48de9172b36..e69de29bb2d 100644 --- a/java/ql/test/query-tests/security/CWE-326/InsufficientKeySizeTest.expected +++ b/java/ql/test/query-tests/security/CWE-326/InsufficientKeySizeTest.expected @@ -1,2 +0,0 @@ -failures -testFailures diff --git a/java/ql/test/query-tests/security/CWE-330/InsecureRandomnessTest.expected b/java/ql/test/query-tests/security/CWE-330/InsecureRandomnessTest.expected index 48de9172b36..e69de29bb2d 100644 --- a/java/ql/test/query-tests/security/CWE-330/InsecureRandomnessTest.expected +++ b/java/ql/test/query-tests/security/CWE-330/InsecureRandomnessTest.expected @@ -1,2 +0,0 @@ -failures -testFailures diff --git a/java/ql/test/query-tests/security/CWE-347/MissingJWTSignatureCheckTest.expected b/java/ql/test/query-tests/security/CWE-347/MissingJWTSignatureCheckTest.expected index 48de9172b36..e69de29bb2d 100644 --- a/java/ql/test/query-tests/security/CWE-347/MissingJWTSignatureCheckTest.expected +++ b/java/ql/test/query-tests/security/CWE-347/MissingJWTSignatureCheckTest.expected @@ -1,2 +0,0 @@ -failures -testFailures diff --git a/java/ql/test/query-tests/security/CWE-352/SpringCsrfProtectionTest.expected b/java/ql/test/query-tests/security/CWE-352/SpringCsrfProtectionTest.expected index a74f2c23cda..e69de29bb2d 100644 --- a/java/ql/test/query-tests/security/CWE-352/SpringCsrfProtectionTest.expected +++ b/java/ql/test/query-tests/security/CWE-352/SpringCsrfProtectionTest.expected @@ -1,2 +0,0 @@ -testFailures -failures \ No newline at end of file diff --git a/java/ql/test/query-tests/security/CWE-470/FragmentInjectionInPreferenceActivityTest.expected b/java/ql/test/query-tests/security/CWE-470/FragmentInjectionInPreferenceActivityTest.expected index 48de9172b36..e69de29bb2d 100644 --- a/java/ql/test/query-tests/security/CWE-470/FragmentInjectionInPreferenceActivityTest.expected +++ b/java/ql/test/query-tests/security/CWE-470/FragmentInjectionInPreferenceActivityTest.expected @@ -1,2 +0,0 @@ -failures -testFailures diff --git a/java/ql/test/query-tests/security/CWE-489/debuggable-attribute/DebuggableAttributeEnabledTest.expected b/java/ql/test/query-tests/security/CWE-489/debuggable-attribute/DebuggableAttributeEnabledTest.expected index 48de9172b36..e69de29bb2d 100644 --- a/java/ql/test/query-tests/security/CWE-489/debuggable-attribute/DebuggableAttributeEnabledTest.expected +++ b/java/ql/test/query-tests/security/CWE-489/debuggable-attribute/DebuggableAttributeEnabledTest.expected @@ -1,2 +0,0 @@ -failures -testFailures diff --git a/java/ql/test/query-tests/security/CWE-502/UnsafeDeserialization.expected b/java/ql/test/query-tests/security/CWE-502/UnsafeDeserialization.expected index 48de9172b36..e69de29bb2d 100644 --- a/java/ql/test/query-tests/security/CWE-502/UnsafeDeserialization.expected +++ b/java/ql/test/query-tests/security/CWE-502/UnsafeDeserialization.expected @@ -1,2 +0,0 @@ -failures -testFailures diff --git a/java/ql/test/query-tests/security/CWE-522/InsecureBasicAuthTest.expected b/java/ql/test/query-tests/security/CWE-522/InsecureBasicAuthTest.expected index 48de9172b36..e69de29bb2d 100644 --- a/java/ql/test/query-tests/security/CWE-522/InsecureBasicAuthTest.expected +++ b/java/ql/test/query-tests/security/CWE-522/InsecureBasicAuthTest.expected @@ -1,2 +0,0 @@ -failures -testFailures diff --git a/java/ql/test/query-tests/security/CWE-522/InsecureLdapAuthTest.expected b/java/ql/test/query-tests/security/CWE-522/InsecureLdapAuthTest.expected index 48de9172b36..e69de29bb2d 100644 --- a/java/ql/test/query-tests/security/CWE-522/InsecureLdapAuthTest.expected +++ b/java/ql/test/query-tests/security/CWE-522/InsecureLdapAuthTest.expected @@ -1,2 +0,0 @@ -failures -testFailures diff --git a/java/ql/test/query-tests/security/CWE-524/SensitiveKeyboardCache.expected b/java/ql/test/query-tests/security/CWE-524/SensitiveKeyboardCache.expected index 48de9172b36..e69de29bb2d 100644 --- a/java/ql/test/query-tests/security/CWE-524/SensitiveKeyboardCache.expected +++ b/java/ql/test/query-tests/security/CWE-524/SensitiveKeyboardCache.expected @@ -1,2 +0,0 @@ -failures -testFailures diff --git a/java/ql/test/query-tests/security/CWE-643/XPathInjectionTest.expected b/java/ql/test/query-tests/security/CWE-643/XPathInjectionTest.expected index 48de9172b36..e69de29bb2d 100644 --- a/java/ql/test/query-tests/security/CWE-643/XPathInjectionTest.expected +++ b/java/ql/test/query-tests/security/CWE-643/XPathInjectionTest.expected @@ -1,2 +0,0 @@ -failures -testFailures diff --git a/java/ql/test/query-tests/security/CWE-730/PolynomialReDoS.expected b/java/ql/test/query-tests/security/CWE-730/PolynomialReDoS.expected index 48de9172b36..e69de29bb2d 100644 --- a/java/ql/test/query-tests/security/CWE-730/PolynomialReDoS.expected +++ b/java/ql/test/query-tests/security/CWE-730/PolynomialReDoS.expected @@ -1,2 +0,0 @@ -failures -testFailures diff --git a/java/ql/test/query-tests/security/CWE-730/ReDoS.expected b/java/ql/test/query-tests/security/CWE-730/ReDoS.expected index 48de9172b36..e69de29bb2d 100644 --- a/java/ql/test/query-tests/security/CWE-730/ReDoS.expected +++ b/java/ql/test/query-tests/security/CWE-730/ReDoS.expected @@ -1,2 +0,0 @@ -failures -testFailures diff --git a/java/ql/test/query-tests/security/CWE-730/RegexInjectionTest.expected b/java/ql/test/query-tests/security/CWE-730/RegexInjectionTest.expected index 48de9172b36..e69de29bb2d 100644 --- a/java/ql/test/query-tests/security/CWE-730/RegexInjectionTest.expected +++ b/java/ql/test/query-tests/security/CWE-730/RegexInjectionTest.expected @@ -1,2 +0,0 @@ -failures -testFailures diff --git a/java/ql/test/query-tests/security/CWE-749/UnsafeAndroidAccessTest.expected b/java/ql/test/query-tests/security/CWE-749/UnsafeAndroidAccessTest.expected index 48de9172b36..e69de29bb2d 100644 --- a/java/ql/test/query-tests/security/CWE-749/UnsafeAndroidAccessTest.expected +++ b/java/ql/test/query-tests/security/CWE-749/UnsafeAndroidAccessTest.expected @@ -1,2 +0,0 @@ -failures -testFailures diff --git a/java/ql/test/query-tests/security/CWE-798/semmle/tests/HardcodedCredentialsApiCall.expected b/java/ql/test/query-tests/security/CWE-798/semmle/tests/HardcodedCredentialsApiCall.expected index 48de9172b36..e69de29bb2d 100644 --- a/java/ql/test/query-tests/security/CWE-798/semmle/tests/HardcodedCredentialsApiCall.expected +++ b/java/ql/test/query-tests/security/CWE-798/semmle/tests/HardcodedCredentialsApiCall.expected @@ -1,2 +0,0 @@ -failures -testFailures diff --git a/java/ql/test/query-tests/security/CWE-798/semmle/tests/HardcodedCredentialsComparison.expected b/java/ql/test/query-tests/security/CWE-798/semmle/tests/HardcodedCredentialsComparison.expected index 48de9172b36..e69de29bb2d 100644 --- a/java/ql/test/query-tests/security/CWE-798/semmle/tests/HardcodedCredentialsComparison.expected +++ b/java/ql/test/query-tests/security/CWE-798/semmle/tests/HardcodedCredentialsComparison.expected @@ -1,2 +0,0 @@ -failures -testFailures diff --git a/java/ql/test/query-tests/security/CWE-798/semmle/tests/HardcodedCredentialsSourceCall.expected b/java/ql/test/query-tests/security/CWE-798/semmle/tests/HardcodedCredentialsSourceCall.expected index 48de9172b36..e69de29bb2d 100644 --- a/java/ql/test/query-tests/security/CWE-798/semmle/tests/HardcodedCredentialsSourceCall.expected +++ b/java/ql/test/query-tests/security/CWE-798/semmle/tests/HardcodedCredentialsSourceCall.expected @@ -1,2 +0,0 @@ -failures -testFailures diff --git a/java/ql/test/query-tests/security/CWE-798/semmle/tests/HardcodedPasswordField.expected b/java/ql/test/query-tests/security/CWE-798/semmle/tests/HardcodedPasswordField.expected index 48de9172b36..e69de29bb2d 100644 --- a/java/ql/test/query-tests/security/CWE-798/semmle/tests/HardcodedPasswordField.expected +++ b/java/ql/test/query-tests/security/CWE-798/semmle/tests/HardcodedPasswordField.expected @@ -1,2 +0,0 @@ -failures -testFailures diff --git a/java/ql/test/query-tests/security/CWE-807/semmle/tests/ConditionalBypassTest.expected b/java/ql/test/query-tests/security/CWE-807/semmle/tests/ConditionalBypassTest.expected index 48de9172b36..e69de29bb2d 100644 --- a/java/ql/test/query-tests/security/CWE-807/semmle/tests/ConditionalBypassTest.expected +++ b/java/ql/test/query-tests/security/CWE-807/semmle/tests/ConditionalBypassTest.expected @@ -1,2 +0,0 @@ -failures -testFailures diff --git a/java/ql/test/query-tests/security/CWE-917/OgnlInjectionTest.expected b/java/ql/test/query-tests/security/CWE-917/OgnlInjectionTest.expected index 48de9172b36..e69de29bb2d 100644 --- a/java/ql/test/query-tests/security/CWE-917/OgnlInjectionTest.expected +++ b/java/ql/test/query-tests/security/CWE-917/OgnlInjectionTest.expected @@ -1,2 +0,0 @@ -failures -testFailures diff --git a/java/ql/test/query-tests/security/CWE-918/RequestForgery.expected b/java/ql/test/query-tests/security/CWE-918/RequestForgery.expected index 48de9172b36..e69de29bb2d 100644 --- a/java/ql/test/query-tests/security/CWE-918/RequestForgery.expected +++ b/java/ql/test/query-tests/security/CWE-918/RequestForgery.expected @@ -1,2 +0,0 @@ -failures -testFailures diff --git a/java/ql/test/query-tests/security/CWE-925/ImproperIntentVerification.expected b/java/ql/test/query-tests/security/CWE-925/ImproperIntentVerification.expected index 48de9172b36..e69de29bb2d 100644 --- a/java/ql/test/query-tests/security/CWE-925/ImproperIntentVerification.expected +++ b/java/ql/test/query-tests/security/CWE-925/ImproperIntentVerification.expected @@ -1,2 +0,0 @@ -failures -testFailures diff --git a/java/ql/test/query-tests/security/CWE-926/ImplicitlyExportedAndroidComponentTest.expected b/java/ql/test/query-tests/security/CWE-926/ImplicitlyExportedAndroidComponentTest.expected index 48de9172b36..e69de29bb2d 100644 --- a/java/ql/test/query-tests/security/CWE-926/ImplicitlyExportedAndroidComponentTest.expected +++ b/java/ql/test/query-tests/security/CWE-926/ImplicitlyExportedAndroidComponentTest.expected @@ -1,2 +0,0 @@ -failures -testFailures diff --git a/java/ql/test/query-tests/security/CWE-926/incomplete_provider_permissions/ContentProviderIncompletePermissionsTest.expected b/java/ql/test/query-tests/security/CWE-926/incomplete_provider_permissions/ContentProviderIncompletePermissionsTest.expected index 48de9172b36..e69de29bb2d 100644 --- a/java/ql/test/query-tests/security/CWE-926/incomplete_provider_permissions/ContentProviderIncompletePermissionsTest.expected +++ b/java/ql/test/query-tests/security/CWE-926/incomplete_provider_permissions/ContentProviderIncompletePermissionsTest.expected @@ -1,2 +0,0 @@ -failures -testFailures diff --git a/java/ql/test/query-tests/security/CWE-927/ImplicitPendingIntentsTest.expected b/java/ql/test/query-tests/security/CWE-927/ImplicitPendingIntentsTest.expected index 8ec8033d086..e69de29bb2d 100644 --- a/java/ql/test/query-tests/security/CWE-927/ImplicitPendingIntentsTest.expected +++ b/java/ql/test/query-tests/security/CWE-927/ImplicitPendingIntentsTest.expected @@ -1,2 +0,0 @@ -testFailures -failures diff --git a/java/ql/test/query-tests/security/CWE-927/SensitiveResultReceiver.expected b/java/ql/test/query-tests/security/CWE-927/SensitiveResultReceiver.expected index 48de9172b36..e69de29bb2d 100644 --- a/java/ql/test/query-tests/security/CWE-927/SensitiveResultReceiver.expected +++ b/java/ql/test/query-tests/security/CWE-927/SensitiveResultReceiver.expected @@ -1,2 +0,0 @@ -failures -testFailures diff --git a/javascript/ql/lib/CHANGELOG.md b/javascript/ql/lib/CHANGELOG.md index 50d1486c006..ebe424935eb 100644 --- a/javascript/ql/lib/CHANGELOG.md +++ b/javascript/ql/lib/CHANGELOG.md @@ -1,3 +1,29 @@ +## 2.2.0 + +### Major Analysis Improvements + +* The `js/incomplete-sanitization` query now also checks regular expressions constructed using `new RegExp(..)`. Previously it only checked regular expression literals. +* Regular expression-based sanitisers implemented with `new RegExp(..)` are now detected in more cases. +* Regular expression related queries now account for unknown flags. + +### Minor Analysis Improvements + +* Added taint-steps for `String.prototype.toWellFormed`. +* Added taint-steps for `Map.groupBy` and `Object.groupBy`. +* Added taint-steps for `Array.prototype.findLast`. +* Added taint-steps for `Array.prototype.findLastIndex`. + +## 2.1.1 + +### Minor Analysis Improvements + +* Added taint-steps for `Array.prototype.with`. +* Added taint-steps for `Array.prototype.toSpliced` +* Added taint-steps for `Array.prototype.toReversed`. +* Added taint-steps for `Array.prototype.toSorted`. +* Added support for `String.prototype.matchAll`. +* Added taint-steps for `Array.prototype.reverse` + ## 2.1.0 ### New Features diff --git a/javascript/ql/lib/change-notes/2024-11-11-matchAll-support.md b/javascript/ql/lib/change-notes/2024-11-11-matchAll-support.md deleted file mode 100644 index 74d7c3f34c2..00000000000 --- a/javascript/ql/lib/change-notes/2024-11-11-matchAll-support.md +++ /dev/null @@ -1,4 +0,0 @@ ---- -category: minorAnalysis ---- -Added support for `String.prototype.matchAll`. diff --git a/javascript/ql/lib/change-notes/2024-11-11-reserve-support.md b/javascript/ql/lib/change-notes/2024-11-11-reserve-support.md deleted file mode 100644 index bd2e6808e0c..00000000000 --- a/javascript/ql/lib/change-notes/2024-11-11-reserve-support.md +++ /dev/null @@ -1,4 +0,0 @@ ---- -category: minorAnalysis ---- -* Added taint-steps for `Array.prototype.reverse` diff --git a/javascript/ql/lib/change-notes/2024-11-12-immutable-array-operations.md b/javascript/ql/lib/change-notes/2024-11-12-immutable-array-operations.md deleted file mode 100644 index 20c16d88c6e..00000000000 --- a/javascript/ql/lib/change-notes/2024-11-12-immutable-array-operations.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -category: minorAnalysis ---- -* Added taint-steps for `Array.prototype.toReversed`. -* Added taint-steps for `Array.prototype.toSorted`. diff --git a/javascript/ql/lib/change-notes/2024-11-15-toSpliced-support.md b/javascript/ql/lib/change-notes/2024-11-15-toSpliced-support.md deleted file mode 100644 index a73955e5d2a..00000000000 --- a/javascript/ql/lib/change-notes/2024-11-15-toSpliced-support.md +++ /dev/null @@ -1,4 +0,0 @@ ---- -category: minorAnalysis ---- -Added taint-steps for `Array.prototype.toSpliced` diff --git a/javascript/ql/lib/change-notes/2024-11-18-ES2022-find-functions.md b/javascript/ql/lib/change-notes/2024-11-18-ES2022-find-functions.md deleted file mode 100644 index e3fe3b6aef2..00000000000 --- a/javascript/ql/lib/change-notes/2024-11-18-ES2022-find-functions.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -category: minorAnalysis ---- -* Added taint-steps for `Array.prototype.findLast` -* Added taint-steps for `Array.prototype.findLastIndex` diff --git a/javascript/ql/lib/change-notes/2024-11-18-ES2023-array-protype-with.md b/javascript/ql/lib/change-notes/2024-11-18-ES2023-array-protype-with.md deleted file mode 100644 index 92f160ec1de..00000000000 --- a/javascript/ql/lib/change-notes/2024-11-18-ES2023-array-protype-with.md +++ /dev/null @@ -1,4 +0,0 @@ ---- -category: minorAnalysis ---- -Added taint-steps for `Array.prototype.with`. diff --git a/javascript/ql/lib/change-notes/2024-11-20-ES2023-string-protytpe-toWellFormed.md b/javascript/ql/lib/change-notes/2024-11-20-ES2023-string-protytpe-toWellFormed.md deleted file mode 100644 index dda4d878760..00000000000 --- a/javascript/ql/lib/change-notes/2024-11-20-ES2023-string-protytpe-toWellFormed.md +++ /dev/null @@ -1,4 +0,0 @@ ---- -category: minorAnalysis ---- -* Added taint-steps for `String.prototype.toWellFormed`. diff --git a/javascript/ql/lib/change-notes/2024-11-20-ES2024-group-functions.md b/javascript/ql/lib/change-notes/2024-11-20-ES2024-group-functions.md deleted file mode 100644 index 8511727f8e7..00000000000 --- a/javascript/ql/lib/change-notes/2024-11-20-ES2024-group-functions.md +++ /dev/null @@ -1,4 +0,0 @@ ---- -category: minorAnalysis ---- -* Added taint-steps for `Map.groupBy` and `Object.groupBy`. diff --git a/javascript/ql/lib/change-notes/released/2.1.1.md b/javascript/ql/lib/change-notes/released/2.1.1.md new file mode 100644 index 00000000000..fd6616a6c03 --- /dev/null +++ b/javascript/ql/lib/change-notes/released/2.1.1.md @@ -0,0 +1,10 @@ +## 2.1.1 + +### Minor Analysis Improvements + +* Added taint-steps for `Array.prototype.with`. +* Added taint-steps for `Array.prototype.toSpliced` +* Added taint-steps for `Array.prototype.toReversed`. +* Added taint-steps for `Array.prototype.toSorted`. +* Added support for `String.prototype.matchAll`. +* Added taint-steps for `Array.prototype.reverse` diff --git a/javascript/ql/lib/change-notes/released/2.2.0.md b/javascript/ql/lib/change-notes/released/2.2.0.md new file mode 100644 index 00000000000..f8c194f73f8 --- /dev/null +++ b/javascript/ql/lib/change-notes/released/2.2.0.md @@ -0,0 +1,14 @@ +## 2.2.0 + +### Major Analysis Improvements + +* The `js/incomplete-sanitization` query now also checks regular expressions constructed using `new RegExp(..)`. Previously it only checked regular expression literals. +* Regular expression-based sanitisers implemented with `new RegExp(..)` are now detected in more cases. +* Regular expression related queries now account for unknown flags. + +### Minor Analysis Improvements + +* Added taint-steps for `String.prototype.toWellFormed`. +* Added taint-steps for `Map.groupBy` and `Object.groupBy`. +* Added taint-steps for `Array.prototype.findLast`. +* Added taint-steps for `Array.prototype.findLastIndex`. diff --git a/javascript/ql/lib/codeql-pack.release.yml b/javascript/ql/lib/codeql-pack.release.yml index 487a1a58b2b..2f308354195 100644 --- a/javascript/ql/lib/codeql-pack.release.yml +++ b/javascript/ql/lib/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 2.1.0 +lastReleaseVersion: 2.2.0 diff --git a/javascript/ql/lib/qlpack.yml b/javascript/ql/lib/qlpack.yml index f732755a75b..4d568ff4813 100644 --- a/javascript/ql/lib/qlpack.yml +++ b/javascript/ql/lib/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/javascript-all -version: 2.1.1-dev +version: 2.2.1-dev groups: javascript dbscheme: semmlecode.javascript.dbscheme extractor: javascript diff --git a/javascript/ql/lib/semmle/javascript/StandardLibrary.qll b/javascript/ql/lib/semmle/javascript/StandardLibrary.qll index b40f10d9369..0b84e9a734b 100644 --- a/javascript/ql/lib/semmle/javascript/StandardLibrary.qll +++ b/javascript/ql/lib/semmle/javascript/StandardLibrary.qll @@ -117,6 +117,12 @@ class StringReplaceCall extends DataFlow::MethodCallNode { */ predicate isGlobal() { this.getRegExp().isGlobal() or this.getMethodName() = "replaceAll" } + /** + * Holds if this is a global replacement, that is, the first argument is a regular expression + * with the `g` flag or unknown flags, or this is a call to `.replaceAll()`. + */ + predicate maybeGlobal() { this.getRegExp().maybeGlobal() or this.getMethodName() = "replaceAll" } + /** * Holds if this call to `replace` replaces `old` with `new`. */ diff --git a/javascript/ql/lib/semmle/javascript/dataflow/Nodes.qll b/javascript/ql/lib/semmle/javascript/dataflow/Nodes.qll index d88dab4d431..8a7d2d11b91 100644 --- a/javascript/ql/lib/semmle/javascript/dataflow/Nodes.qll +++ b/javascript/ql/lib/semmle/javascript/dataflow/Nodes.qll @@ -1685,6 +1685,9 @@ class RegExpCreationNode extends DataFlow::SourceNode { /** Holds if the constructed predicate has the `g` flag. */ predicate isGlobal() { RegExp::isGlobal(this.getFlags()) } + /** Holds if the constructed predicate has the `g` flag or unknown flags. */ + predicate maybeGlobal() { RegExp::maybeGlobal(this.tryGetFlags()) } + /** Gets a data flow node referring to this regular expression. */ private DataFlow::SourceNode getAReference(DataFlow::TypeTracker t) { t.start() and diff --git a/javascript/ql/lib/semmle/javascript/security/IncompleteBlacklistSanitizer.qll b/javascript/ql/lib/semmle/javascript/security/IncompleteBlacklistSanitizer.qll index 6b05e2c754d..13d5033458a 100644 --- a/javascript/ql/lib/semmle/javascript/security/IncompleteBlacklistSanitizer.qll +++ b/javascript/ql/lib/semmle/javascript/security/IncompleteBlacklistSanitizer.qll @@ -74,7 +74,7 @@ private StringReplaceCall getAStringReplaceMethodCall(StringReplaceCall n) { module HtmlSanitization { private predicate fixedGlobalReplacement(StringReplaceCallSequence chain) { forall(StringReplaceCall member | member = chain.getAMember() | - member.isGlobal() and member.getArgument(0) instanceof DataFlow::RegExpLiteralNode + member.maybeGlobal() and member.getArgument(0) instanceof DataFlow::RegExpCreationNode ) } diff --git a/javascript/ql/lib/semmle/javascript/security/dataflow/CleartextLoggingCustomizations.qll b/javascript/ql/lib/semmle/javascript/security/dataflow/CleartextLoggingCustomizations.qll index c783a9c3cfc..b302a025b2c 100644 --- a/javascript/ql/lib/semmle/javascript/security/dataflow/CleartextLoggingCustomizations.qll +++ b/javascript/ql/lib/semmle/javascript/security/dataflow/CleartextLoggingCustomizations.qll @@ -36,9 +36,12 @@ module CleartextLogging { */ class MaskingReplacer extends Barrier, StringReplaceCall { MaskingReplacer() { - this.isGlobal() and + this.maybeGlobal() and exists(this.getRawReplacement().getStringValue()) and - any(RegExpDot term).getLiteral() = this.getRegExp().asExpr() + exists(DataFlow::RegExpCreationNode regexpObj | + this.(StringReplaceCall).getRegExp() = regexpObj and + regexpObj.getRoot() = any(RegExpDot term).getRootTerm() + ) } } diff --git a/javascript/ql/lib/semmle/javascript/security/dataflow/PrototypePollutingAssignmentQuery.qll b/javascript/ql/lib/semmle/javascript/security/dataflow/PrototypePollutingAssignmentQuery.qll index 0ba2f26b24c..197b8594244 100644 --- a/javascript/ql/lib/semmle/javascript/security/dataflow/PrototypePollutingAssignmentQuery.qll +++ b/javascript/ql/lib/semmle/javascript/security/dataflow/PrototypePollutingAssignmentQuery.qll @@ -46,7 +46,7 @@ class Configuration extends TaintTracking::Configuration { // Replacing with "_" is likely to be exploitable not replace.getRawReplacement().getStringValue() = "_" and ( - replace.isGlobal() + replace.maybeGlobal() or // Non-global replace with a non-empty string can also prevent __proto__ by // inserting a chunk of text that doesn't fit anywhere in __proto__ diff --git a/javascript/ql/lib/semmle/javascript/security/dataflow/RegExpInjectionCustomizations.qll b/javascript/ql/lib/semmle/javascript/security/dataflow/RegExpInjectionCustomizations.qll index 291d6eebc1c..03cbd01b630 100644 --- a/javascript/ql/lib/semmle/javascript/security/dataflow/RegExpInjectionCustomizations.qll +++ b/javascript/ql/lib/semmle/javascript/security/dataflow/RegExpInjectionCustomizations.qll @@ -76,7 +76,7 @@ module RegExpInjection { */ class MetacharEscapeSanitizer extends Sanitizer, StringReplaceCall { MetacharEscapeSanitizer() { - this.isGlobal() and + this.maybeGlobal() and ( RegExp::alwaysMatchesMetaCharacter(this.getRegExp().getRoot(), ["{", "[", "+"]) or diff --git a/javascript/ql/lib/semmle/javascript/security/dataflow/TaintedPathCustomizations.qll b/javascript/ql/lib/semmle/javascript/security/dataflow/TaintedPathCustomizations.qll index c24ea7f6110..8798c926086 100644 --- a/javascript/ql/lib/semmle/javascript/security/dataflow/TaintedPathCustomizations.qll +++ b/javascript/ql/lib/semmle/javascript/security/dataflow/TaintedPathCustomizations.qll @@ -221,10 +221,10 @@ module TaintedPath { this instanceof StringReplaceCall and input = this.getReceiver() and output = this and - not exists(RegExpLiteral literal, RegExpTerm term | - this.(StringReplaceCall).getRegExp().asExpr() = literal and - this.(StringReplaceCall).isGlobal() and - literal.getRoot() = term + not exists(DataFlow::RegExpCreationNode regexp, RegExpTerm term | + this.(StringReplaceCall).getRegExp() = regexp and + this.(StringReplaceCall).maybeGlobal() and + regexp.getRoot() = term | term.getAMatchedString() = "/" or term.getAMatchedString() = "." or @@ -305,9 +305,9 @@ module TaintedPath { input = this.getReceiver() and output = this and this.isGlobal() and - exists(RegExpLiteral literal, RegExpTerm term | - this.getRegExp().asExpr() = literal and - literal.getRoot() = term and + exists(DataFlow::RegExpCreationNode regexp, RegExpTerm term | + this.getRegExp() = regexp and + regexp.getRoot() = term and not term.getAMatchedString() = "/" | term.getAMatchedString() = "." or diff --git a/javascript/ql/lib/semmle/javascript/security/dataflow/UnsafeShellCommandConstructionCustomizations.qll b/javascript/ql/lib/semmle/javascript/security/dataflow/UnsafeShellCommandConstructionCustomizations.qll index 77625874df9..8e753a5ef63 100644 --- a/javascript/ql/lib/semmle/javascript/security/dataflow/UnsafeShellCommandConstructionCustomizations.qll +++ b/javascript/ql/lib/semmle/javascript/security/dataflow/UnsafeShellCommandConstructionCustomizations.qll @@ -245,7 +245,7 @@ module UnsafeShellCommandConstruction { class ReplaceQuotesSanitizer extends Sanitizer, StringReplaceCall { ReplaceQuotesSanitizer() { this.getAReplacedString() = "'" and - this.isGlobal() and + this.maybeGlobal() and this.getRawReplacement().mayHaveStringValue(["'\\''", ""]) } } diff --git a/javascript/ql/lib/semmle/javascript/security/dataflow/Xss.qll b/javascript/ql/lib/semmle/javascript/security/dataflow/Xss.qll index fc2db8e9f87..a0def5b7b74 100644 --- a/javascript/ql/lib/semmle/javascript/security/dataflow/Xss.qll +++ b/javascript/ql/lib/semmle/javascript/security/dataflow/Xss.qll @@ -36,7 +36,7 @@ module Shared { */ class MetacharEscapeSanitizer extends Sanitizer, StringReplaceCall { MetacharEscapeSanitizer() { - this.isGlobal() and + this.maybeGlobal() and ( RegExp::alwaysMatchesMetaCharacter(this.getRegExp().getRoot(), ["<", "'", "\""]) or diff --git a/javascript/ql/src/CHANGELOG.md b/javascript/ql/src/CHANGELOG.md index 9a9a4641c6e..195298ec89f 100644 --- a/javascript/ql/src/CHANGELOG.md +++ b/javascript/ql/src/CHANGELOG.md @@ -1,3 +1,11 @@ +## 1.2.5 + +No user-facing changes. + +## 1.2.4 + +No user-facing changes. + ## 1.2.3 No user-facing changes. diff --git a/javascript/ql/src/Security/CWE-116/IncompleteSanitization.ql b/javascript/ql/src/Security/CWE-116/IncompleteSanitization.ql index dc92b24abef..7d0dc71a2a8 100644 --- a/javascript/ql/src/Security/CWE-116/IncompleteSanitization.ql +++ b/javascript/ql/src/Security/CWE-116/IncompleteSanitization.ql @@ -23,7 +23,7 @@ string metachar() { result = "'\"\\&<>\n\r\t*|{}[]%$".charAt(_) } /** Gets a string matched by `e` in a `replace` call. */ string getAMatchedString(DataFlow::Node e) { - result = e.(DataFlow::RegExpLiteralNode).getRoot().getAMatchedString() + result = e.(DataFlow::RegExpCreationNode).getRoot().getAMatchedString() or result = e.getStringValue() } @@ -52,8 +52,8 @@ predicate isSimpleAlt(RegExpAlt t) { forall(RegExpTerm ch | ch = t.getAChild() | * Holds if `mce` is of the form `x.replace(re, new)`, where `re` is a global * regular expression and `new` prefixes the matched string with a backslash. */ -predicate isBackslashEscape(StringReplaceCall mce, DataFlow::RegExpLiteralNode re) { - mce.isGlobal() and +predicate isBackslashEscape(StringReplaceCall mce, DataFlow::RegExpCreationNode re) { + mce.maybeGlobal() and re = mce.getRegExp() and ( // replacement with `\$&`, `\$1` or similar @@ -72,7 +72,7 @@ predicate allBackslashesEscaped(DataFlow::Node nd) { nd instanceof JsonStringifyCall or // check whether `nd` itself escapes backslashes - exists(DataFlow::RegExpLiteralNode rel | isBackslashEscape(nd, rel) | + exists(DataFlow::RegExpCreationNode rel | isBackslashEscape(nd, rel) | // if it's a complex regexp, we conservatively assume that it probably escapes backslashes not isSimple(rel.getRoot()) or getAMatchedString(rel) = "\\" @@ -143,12 +143,21 @@ predicate whitelistedRemoval(StringReplaceCall repl) { ) } +/** + * Gets a nice string representation of the pattern or value of the node. + */ +string getPatternOrValueString(DataFlow::Node node) { + if node instanceof DataFlow::RegExpConstructorInvokeNode + then result = "/" + node.(DataFlow::RegExpConstructorInvokeNode).getRoot() + "/" + else result = node.toString() +} + from StringReplaceCall repl, DataFlow::Node old, string msg where (old = repl.getArgument(0) or old = repl.getRegExp()) and ( - not repl.isGlobal() and - msg = "This replaces only the first occurrence of " + old + "." and + not repl.maybeGlobal() and + msg = "This replaces only the first occurrence of " + getPatternOrValueString(old) + "." and // only flag if this is likely to be a sanitizer or URL encoder or decoder exists(string m | m = getAMatchedString(old) | // sanitizer diff --git a/javascript/ql/src/Security/CWE-178/CaseSensitiveMiddlewarePath.ql b/javascript/ql/src/Security/CWE-178/CaseSensitiveMiddlewarePath.ql index d16f72d4172..997ee8971a5 100644 --- a/javascript/ql/src/Security/CWE-178/CaseSensitiveMiddlewarePath.ql +++ b/javascript/ql/src/Security/CWE-178/CaseSensitiveMiddlewarePath.ql @@ -65,8 +65,8 @@ predicate isCaseSensitiveMiddleware( arg = call.getArgument(0) and regexp.getAReference().flowsTo(arg) and exists(string flags | - flags = regexp.getFlags() and - not RegExp::isIgnoreCase(flags) + flags = regexp.tryGetFlags() and + not RegExp::maybeIgnoreCase(flags) ) ) } diff --git a/javascript/ql/src/change-notes/released/1.2.4.md b/javascript/ql/src/change-notes/released/1.2.4.md new file mode 100644 index 00000000000..21fd88e8124 --- /dev/null +++ b/javascript/ql/src/change-notes/released/1.2.4.md @@ -0,0 +1,3 @@ +## 1.2.4 + +No user-facing changes. diff --git a/javascript/ql/src/change-notes/released/1.2.5.md b/javascript/ql/src/change-notes/released/1.2.5.md new file mode 100644 index 00000000000..c805dc2cd4c --- /dev/null +++ b/javascript/ql/src/change-notes/released/1.2.5.md @@ -0,0 +1,3 @@ +## 1.2.5 + +No user-facing changes. diff --git a/javascript/ql/src/codeql-pack.release.yml b/javascript/ql/src/codeql-pack.release.yml index 09a7400b594..40355f0807f 100644 --- a/javascript/ql/src/codeql-pack.release.yml +++ b/javascript/ql/src/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.2.3 +lastReleaseVersion: 1.2.5 diff --git a/javascript/ql/src/qlpack.yml b/javascript/ql/src/qlpack.yml index 98c38e64248..78f0585027b 100644 --- a/javascript/ql/src/qlpack.yml +++ b/javascript/ql/src/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/javascript-queries -version: 1.2.4-dev +version: 1.2.6-dev groups: - javascript - queries diff --git a/javascript/ql/test/library-tests/EndpointNaming/EndpointNaming.expected b/javascript/ql/test/library-tests/EndpointNaming/EndpointNaming.expected index af5e8d62bb3..d2c34c887cc 100644 --- a/javascript/ql/test/library-tests/EndpointNaming/EndpointNaming.expected +++ b/javascript/ql/test/library-tests/EndpointNaming/EndpointNaming.expected @@ -5,4 +5,3 @@ ambiguousPreferredPredecessor | pack2/main.js:1:1:3:1 | def moduleImport("pack2").getMember("exports").getMember("MainClass").getInstance() | ambiguousSinkName ambiguousFunctionName -failures diff --git a/javascript/ql/test/library-tests/threat-models/sources/TestSources.expected b/javascript/ql/test/library-tests/threat-models/sources/TestSources.expected index 8ec8033d086..e69de29bb2d 100644 --- a/javascript/ql/test/library-tests/threat-models/sources/TestSources.expected +++ b/javascript/ql/test/library-tests/threat-models/sources/TestSources.expected @@ -1,2 +0,0 @@ -testFailures -failures diff --git a/javascript/ql/test/query-tests/Security/CWE-022/TaintedPath/TaintedPath.expected b/javascript/ql/test/query-tests/Security/CWE-022/TaintedPath/TaintedPath.expected index 0022ca69c6b..6a45147a4e2 100644 --- a/javascript/ql/test/query-tests/Security/CWE-022/TaintedPath/TaintedPath.expected +++ b/javascript/ql/test/query-tests/Security/CWE-022/TaintedPath/TaintedPath.expected @@ -1517,6 +1517,207 @@ nodes | TaintedPath.js:198:35:198:38 | path | | TaintedPath.js:198:35:198:38 | path | | TaintedPath.js:198:35:198:38 | path | +| TaintedPath.js:202:7:202:48 | path | +| TaintedPath.js:202:7:202:48 | path | +| TaintedPath.js:202:7:202:48 | path | +| TaintedPath.js:202:7:202:48 | path | +| TaintedPath.js:202:7:202:48 | path | +| TaintedPath.js:202:7:202:48 | path | +| TaintedPath.js:202:7:202:48 | path | +| TaintedPath.js:202:7:202:48 | path | +| TaintedPath.js:202:7:202:48 | path | +| TaintedPath.js:202:7:202:48 | path | +| TaintedPath.js:202:7:202:48 | path | +| TaintedPath.js:202:7:202:48 | path | +| TaintedPath.js:202:7:202:48 | path | +| TaintedPath.js:202:7:202:48 | path | +| TaintedPath.js:202:7:202:48 | path | +| TaintedPath.js:202:7:202:48 | path | +| TaintedPath.js:202:14:202:37 | url.par ... , true) | +| TaintedPath.js:202:14:202:37 | url.par ... , true) | +| TaintedPath.js:202:14:202:37 | url.par ... , true) | +| TaintedPath.js:202:14:202:37 | url.par ... , true) | +| TaintedPath.js:202:14:202:37 | url.par ... , true) | +| TaintedPath.js:202:14:202:37 | url.par ... , true) | +| TaintedPath.js:202:14:202:37 | url.par ... , true) | +| TaintedPath.js:202:14:202:37 | url.par ... , true) | +| TaintedPath.js:202:14:202:37 | url.par ... , true) | +| TaintedPath.js:202:14:202:37 | url.par ... , true) | +| TaintedPath.js:202:14:202:37 | url.par ... , true) | +| TaintedPath.js:202:14:202:37 | url.par ... , true) | +| TaintedPath.js:202:14:202:37 | url.par ... , true) | +| TaintedPath.js:202:14:202:37 | url.par ... , true) | +| TaintedPath.js:202:14:202:37 | url.par ... , true) | +| TaintedPath.js:202:14:202:37 | url.par ... , true) | +| TaintedPath.js:202:14:202:43 | url.par ... ).query | +| TaintedPath.js:202:14:202:43 | url.par ... ).query | +| TaintedPath.js:202:14:202:43 | url.par ... ).query | +| TaintedPath.js:202:14:202:43 | url.par ... ).query | +| TaintedPath.js:202:14:202:43 | url.par ... ).query | +| TaintedPath.js:202:14:202:43 | url.par ... ).query | +| TaintedPath.js:202:14:202:43 | url.par ... ).query | +| TaintedPath.js:202:14:202:43 | url.par ... ).query | +| TaintedPath.js:202:14:202:43 | url.par ... ).query | +| TaintedPath.js:202:14:202:43 | url.par ... ).query | +| TaintedPath.js:202:14:202:43 | url.par ... ).query | +| TaintedPath.js:202:14:202:43 | url.par ... ).query | +| TaintedPath.js:202:14:202:43 | url.par ... ).query | +| TaintedPath.js:202:14:202:43 | url.par ... ).query | +| TaintedPath.js:202:14:202:43 | url.par ... ).query | +| TaintedPath.js:202:14:202:43 | url.par ... ).query | +| TaintedPath.js:202:14:202:48 | url.par ... ry.path | +| TaintedPath.js:202:14:202:48 | url.par ... ry.path | +| TaintedPath.js:202:14:202:48 | url.par ... ry.path | +| TaintedPath.js:202:14:202:48 | url.par ... ry.path | +| TaintedPath.js:202:14:202:48 | url.par ... ry.path | +| TaintedPath.js:202:14:202:48 | url.par ... ry.path | +| TaintedPath.js:202:14:202:48 | url.par ... ry.path | +| TaintedPath.js:202:14:202:48 | url.par ... ry.path | +| TaintedPath.js:202:14:202:48 | url.par ... ry.path | +| TaintedPath.js:202:14:202:48 | url.par ... ry.path | +| TaintedPath.js:202:14:202:48 | url.par ... ry.path | +| TaintedPath.js:202:14:202:48 | url.par ... ry.path | +| TaintedPath.js:202:14:202:48 | url.par ... ry.path | +| TaintedPath.js:202:14:202:48 | url.par ... ry.path | +| TaintedPath.js:202:14:202:48 | url.par ... ry.path | +| TaintedPath.js:202:14:202:48 | url.par ... ry.path | +| TaintedPath.js:202:24:202:30 | req.url | +| TaintedPath.js:202:24:202:30 | req.url | +| TaintedPath.js:202:24:202:30 | req.url | +| TaintedPath.js:202:24:202:30 | req.url | +| TaintedPath.js:202:24:202:30 | req.url | +| TaintedPath.js:206:29:206:32 | path | +| TaintedPath.js:206:29:206:32 | path | +| TaintedPath.js:206:29:206:32 | path | +| TaintedPath.js:206:29:206:32 | path | +| TaintedPath.js:206:29:206:32 | path | +| TaintedPath.js:206:29:206:32 | path | +| TaintedPath.js:206:29:206:32 | path | +| TaintedPath.js:206:29:206:32 | path | +| TaintedPath.js:206:29:206:32 | path | +| TaintedPath.js:206:29:206:32 | path | +| TaintedPath.js:206:29:206:32 | path | +| TaintedPath.js:206:29:206:32 | path | +| TaintedPath.js:206:29:206:32 | path | +| TaintedPath.js:206:29:206:32 | path | +| TaintedPath.js:206:29:206:32 | path | +| TaintedPath.js:206:29:206:32 | path | +| TaintedPath.js:206:29:206:85 | path.re ... '), '') | +| TaintedPath.js:206:29:206:85 | path.re ... '), '') | +| TaintedPath.js:206:29:206:85 | path.re ... '), '') | +| TaintedPath.js:206:29:206:85 | path.re ... '), '') | +| TaintedPath.js:206:29:206:85 | path.re ... '), '') | +| TaintedPath.js:206:29:206:85 | path.re ... '), '') | +| TaintedPath.js:206:29:206:85 | path.re ... '), '') | +| TaintedPath.js:206:29:206:85 | path.re ... '), '') | +| TaintedPath.js:206:29:206:85 | path.re ... '), '') | +| TaintedPath.js:206:29:206:85 | path.re ... '), '') | +| TaintedPath.js:206:29:206:85 | path.re ... '), '') | +| TaintedPath.js:206:29:206:85 | path.re ... '), '') | +| TaintedPath.js:206:29:206:85 | path.re ... '), '') | +| TaintedPath.js:206:29:206:85 | path.re ... '), '') | +| TaintedPath.js:206:29:206:85 | path.re ... '), '') | +| TaintedPath.js:206:29:206:85 | path.re ... '), '') | +| TaintedPath.js:206:29:206:85 | path.re ... '), '') | +| TaintedPath.js:211:7:211:48 | path | +| TaintedPath.js:211:7:211:48 | path | +| TaintedPath.js:211:7:211:48 | path | +| TaintedPath.js:211:7:211:48 | path | +| TaintedPath.js:211:7:211:48 | path | +| TaintedPath.js:211:7:211:48 | path | +| TaintedPath.js:211:7:211:48 | path | +| TaintedPath.js:211:7:211:48 | path | +| TaintedPath.js:211:7:211:48 | path | +| TaintedPath.js:211:7:211:48 | path | +| TaintedPath.js:211:7:211:48 | path | +| TaintedPath.js:211:7:211:48 | path | +| TaintedPath.js:211:7:211:48 | path | +| TaintedPath.js:211:7:211:48 | path | +| TaintedPath.js:211:7:211:48 | path | +| TaintedPath.js:211:7:211:48 | path | +| TaintedPath.js:211:14:211:37 | url.par ... , true) | +| TaintedPath.js:211:14:211:37 | url.par ... , true) | +| TaintedPath.js:211:14:211:37 | url.par ... , true) | +| TaintedPath.js:211:14:211:37 | url.par ... , true) | +| TaintedPath.js:211:14:211:37 | url.par ... , true) | +| TaintedPath.js:211:14:211:37 | url.par ... , true) | +| TaintedPath.js:211:14:211:37 | url.par ... , true) | +| TaintedPath.js:211:14:211:37 | url.par ... , true) | +| TaintedPath.js:211:14:211:37 | url.par ... , true) | +| TaintedPath.js:211:14:211:37 | url.par ... , true) | +| TaintedPath.js:211:14:211:37 | url.par ... , true) | +| TaintedPath.js:211:14:211:37 | url.par ... , true) | +| TaintedPath.js:211:14:211:37 | url.par ... , true) | +| TaintedPath.js:211:14:211:37 | url.par ... , true) | +| TaintedPath.js:211:14:211:37 | url.par ... , true) | +| TaintedPath.js:211:14:211:37 | url.par ... , true) | +| TaintedPath.js:211:14:211:43 | url.par ... ).query | +| TaintedPath.js:211:14:211:43 | url.par ... ).query | +| TaintedPath.js:211:14:211:43 | url.par ... ).query | +| TaintedPath.js:211:14:211:43 | url.par ... ).query | +| TaintedPath.js:211:14:211:43 | url.par ... ).query | +| TaintedPath.js:211:14:211:43 | url.par ... ).query | +| TaintedPath.js:211:14:211:43 | url.par ... ).query | +| TaintedPath.js:211:14:211:43 | url.par ... ).query | +| TaintedPath.js:211:14:211:43 | url.par ... ).query | +| TaintedPath.js:211:14:211:43 | url.par ... ).query | +| TaintedPath.js:211:14:211:43 | url.par ... ).query | +| TaintedPath.js:211:14:211:43 | url.par ... ).query | +| TaintedPath.js:211:14:211:43 | url.par ... ).query | +| TaintedPath.js:211:14:211:43 | url.par ... ).query | +| TaintedPath.js:211:14:211:43 | url.par ... ).query | +| TaintedPath.js:211:14:211:43 | url.par ... ).query | +| TaintedPath.js:211:14:211:48 | url.par ... ry.path | +| TaintedPath.js:211:14:211:48 | url.par ... ry.path | +| TaintedPath.js:211:14:211:48 | url.par ... ry.path | +| TaintedPath.js:211:14:211:48 | url.par ... ry.path | +| TaintedPath.js:211:14:211:48 | url.par ... ry.path | +| TaintedPath.js:211:14:211:48 | url.par ... ry.path | +| TaintedPath.js:211:14:211:48 | url.par ... ry.path | +| TaintedPath.js:211:14:211:48 | url.par ... ry.path | +| TaintedPath.js:211:14:211:48 | url.par ... ry.path | +| TaintedPath.js:211:14:211:48 | url.par ... ry.path | +| TaintedPath.js:211:14:211:48 | url.par ... ry.path | +| TaintedPath.js:211:14:211:48 | url.par ... ry.path | +| TaintedPath.js:211:14:211:48 | url.par ... ry.path | +| TaintedPath.js:211:14:211:48 | url.par ... ry.path | +| TaintedPath.js:211:14:211:48 | url.par ... ry.path | +| TaintedPath.js:211:14:211:48 | url.par ... ry.path | +| TaintedPath.js:211:24:211:30 | req.url | +| TaintedPath.js:211:24:211:30 | req.url | +| TaintedPath.js:211:24:211:30 | req.url | +| TaintedPath.js:211:24:211:30 | req.url | +| TaintedPath.js:211:24:211:30 | req.url | +| TaintedPath.js:213:29:213:32 | path | +| TaintedPath.js:213:29:213:32 | path | +| TaintedPath.js:213:29:213:32 | path | +| TaintedPath.js:213:29:213:32 | path | +| TaintedPath.js:213:29:213:32 | path | +| TaintedPath.js:213:29:213:32 | path | +| TaintedPath.js:213:29:213:32 | path | +| TaintedPath.js:213:29:213:32 | path | +| TaintedPath.js:213:29:213:68 | path.re ... '), '') | +| TaintedPath.js:213:29:213:68 | path.re ... '), '') | +| TaintedPath.js:213:29:213:68 | path.re ... '), '') | +| TaintedPath.js:213:29:213:68 | path.re ... '), '') | +| TaintedPath.js:213:29:213:68 | path.re ... '), '') | +| TaintedPath.js:216:31:216:34 | path | +| TaintedPath.js:216:31:216:34 | path | +| TaintedPath.js:216:31:216:34 | path | +| TaintedPath.js:216:31:216:34 | path | +| TaintedPath.js:216:31:216:34 | path | +| TaintedPath.js:216:31:216:34 | path | +| TaintedPath.js:216:31:216:34 | path | +| TaintedPath.js:216:31:216:34 | path | +| TaintedPath.js:216:31:216:69 | path.re ... '), '') | +| TaintedPath.js:216:31:216:69 | path.re ... '), '') | +| TaintedPath.js:216:31:216:69 | path.re ... '), '') | +| TaintedPath.js:216:31:216:69 | path.re ... '), '') | +| TaintedPath.js:216:31:216:69 | path.re ... '), '') | +| TaintedPath.js:216:31:216:69 | path.re ... '), '') | +| TaintedPath.js:216:31:216:69 | path.re ... '), '') | +| TaintedPath.js:216:31:216:69 | path.re ... '), '') | +| TaintedPath.js:216:31:216:69 | path.re ... '), '') | | examples/TaintedPath.js:8:7:8:52 | filePath | | examples/TaintedPath.js:8:7:8:52 | filePath | | examples/TaintedPath.js:8:7:8:52 | filePath | @@ -6680,6 +6881,262 @@ edges | TaintedPath.js:195:24:195:30 | req.url | TaintedPath.js:195:14:195:37 | url.par ... , true) | | TaintedPath.js:195:24:195:30 | req.url | TaintedPath.js:195:14:195:37 | url.par ... , true) | | TaintedPath.js:195:24:195:30 | req.url | TaintedPath.js:195:14:195:37 | url.par ... , true) | +| TaintedPath.js:202:7:202:48 | path | TaintedPath.js:206:29:206:32 | path | +| TaintedPath.js:202:7:202:48 | path | TaintedPath.js:206:29:206:32 | path | +| TaintedPath.js:202:7:202:48 | path | TaintedPath.js:206:29:206:32 | path | +| TaintedPath.js:202:7:202:48 | path | TaintedPath.js:206:29:206:32 | path | +| TaintedPath.js:202:7:202:48 | path | TaintedPath.js:206:29:206:32 | path | +| TaintedPath.js:202:7:202:48 | path | TaintedPath.js:206:29:206:32 | path | +| TaintedPath.js:202:7:202:48 | path | TaintedPath.js:206:29:206:32 | path | +| TaintedPath.js:202:7:202:48 | path | TaintedPath.js:206:29:206:32 | path | +| TaintedPath.js:202:7:202:48 | path | TaintedPath.js:206:29:206:32 | path | +| TaintedPath.js:202:7:202:48 | path | TaintedPath.js:206:29:206:32 | path | +| TaintedPath.js:202:7:202:48 | path | TaintedPath.js:206:29:206:32 | path | +| TaintedPath.js:202:7:202:48 | path | TaintedPath.js:206:29:206:32 | path | +| TaintedPath.js:202:7:202:48 | path | TaintedPath.js:206:29:206:32 | path | +| TaintedPath.js:202:7:202:48 | path | TaintedPath.js:206:29:206:32 | path | +| TaintedPath.js:202:7:202:48 | path | TaintedPath.js:206:29:206:32 | path | +| TaintedPath.js:202:7:202:48 | path | TaintedPath.js:206:29:206:32 | path | +| TaintedPath.js:202:14:202:37 | url.par ... , true) | TaintedPath.js:202:14:202:43 | url.par ... ).query | +| TaintedPath.js:202:14:202:37 | url.par ... , true) | TaintedPath.js:202:14:202:43 | url.par ... ).query | +| TaintedPath.js:202:14:202:37 | url.par ... , true) | TaintedPath.js:202:14:202:43 | url.par ... ).query | +| TaintedPath.js:202:14:202:37 | url.par ... , true) | TaintedPath.js:202:14:202:43 | url.par ... ).query | +| TaintedPath.js:202:14:202:37 | url.par ... , true) | TaintedPath.js:202:14:202:43 | url.par ... ).query | +| TaintedPath.js:202:14:202:37 | url.par ... , true) | TaintedPath.js:202:14:202:43 | url.par ... ).query | +| TaintedPath.js:202:14:202:37 | url.par ... , true) | TaintedPath.js:202:14:202:43 | url.par ... ).query | +| TaintedPath.js:202:14:202:37 | url.par ... , true) | TaintedPath.js:202:14:202:43 | url.par ... ).query | +| TaintedPath.js:202:14:202:37 | url.par ... , true) | TaintedPath.js:202:14:202:43 | url.par ... ).query | +| TaintedPath.js:202:14:202:37 | url.par ... , true) | TaintedPath.js:202:14:202:43 | url.par ... ).query | +| TaintedPath.js:202:14:202:37 | url.par ... , true) | TaintedPath.js:202:14:202:43 | url.par ... ).query | +| TaintedPath.js:202:14:202:37 | url.par ... , true) | TaintedPath.js:202:14:202:43 | url.par ... ).query | +| TaintedPath.js:202:14:202:37 | url.par ... , true) | TaintedPath.js:202:14:202:43 | url.par ... ).query | +| TaintedPath.js:202:14:202:37 | url.par ... , true) | TaintedPath.js:202:14:202:43 | url.par ... ).query | +| TaintedPath.js:202:14:202:37 | url.par ... , true) | TaintedPath.js:202:14:202:43 | url.par ... ).query | +| TaintedPath.js:202:14:202:37 | url.par ... , true) | TaintedPath.js:202:14:202:43 | url.par ... ).query | +| TaintedPath.js:202:14:202:43 | url.par ... ).query | TaintedPath.js:202:14:202:48 | url.par ... ry.path | +| TaintedPath.js:202:14:202:43 | url.par ... ).query | TaintedPath.js:202:14:202:48 | url.par ... ry.path | +| TaintedPath.js:202:14:202:43 | url.par ... ).query | TaintedPath.js:202:14:202:48 | url.par ... ry.path | +| TaintedPath.js:202:14:202:43 | url.par ... ).query | TaintedPath.js:202:14:202:48 | url.par ... ry.path | +| TaintedPath.js:202:14:202:43 | url.par ... ).query | TaintedPath.js:202:14:202:48 | url.par ... ry.path | +| TaintedPath.js:202:14:202:43 | url.par ... ).query | TaintedPath.js:202:14:202:48 | url.par ... ry.path | +| TaintedPath.js:202:14:202:43 | url.par ... ).query | TaintedPath.js:202:14:202:48 | url.par ... ry.path | +| TaintedPath.js:202:14:202:43 | url.par ... ).query | TaintedPath.js:202:14:202:48 | url.par ... ry.path | +| TaintedPath.js:202:14:202:43 | url.par ... ).query | TaintedPath.js:202:14:202:48 | url.par ... ry.path | +| TaintedPath.js:202:14:202:43 | url.par ... ).query | TaintedPath.js:202:14:202:48 | url.par ... ry.path | +| TaintedPath.js:202:14:202:43 | url.par ... ).query | TaintedPath.js:202:14:202:48 | url.par ... ry.path | +| TaintedPath.js:202:14:202:43 | url.par ... ).query | TaintedPath.js:202:14:202:48 | url.par ... ry.path | +| TaintedPath.js:202:14:202:43 | url.par ... ).query | TaintedPath.js:202:14:202:48 | url.par ... ry.path | +| TaintedPath.js:202:14:202:43 | url.par ... ).query | TaintedPath.js:202:14:202:48 | url.par ... ry.path | +| TaintedPath.js:202:14:202:43 | url.par ... ).query | TaintedPath.js:202:14:202:48 | url.par ... ry.path | +| TaintedPath.js:202:14:202:43 | url.par ... ).query | TaintedPath.js:202:14:202:48 | url.par ... ry.path | +| TaintedPath.js:202:14:202:48 | url.par ... ry.path | TaintedPath.js:202:7:202:48 | path | +| TaintedPath.js:202:14:202:48 | url.par ... ry.path | TaintedPath.js:202:7:202:48 | path | +| TaintedPath.js:202:14:202:48 | url.par ... ry.path | TaintedPath.js:202:7:202:48 | path | +| TaintedPath.js:202:14:202:48 | url.par ... ry.path | TaintedPath.js:202:7:202:48 | path | +| TaintedPath.js:202:14:202:48 | url.par ... ry.path | TaintedPath.js:202:7:202:48 | path | +| TaintedPath.js:202:14:202:48 | url.par ... ry.path | TaintedPath.js:202:7:202:48 | path | +| TaintedPath.js:202:14:202:48 | url.par ... ry.path | TaintedPath.js:202:7:202:48 | path | +| TaintedPath.js:202:14:202:48 | url.par ... ry.path | TaintedPath.js:202:7:202:48 | path | +| TaintedPath.js:202:14:202:48 | url.par ... ry.path | TaintedPath.js:202:7:202:48 | path | +| TaintedPath.js:202:14:202:48 | url.par ... ry.path | TaintedPath.js:202:7:202:48 | path | +| TaintedPath.js:202:14:202:48 | url.par ... ry.path | TaintedPath.js:202:7:202:48 | path | +| TaintedPath.js:202:14:202:48 | url.par ... ry.path | TaintedPath.js:202:7:202:48 | path | +| TaintedPath.js:202:14:202:48 | url.par ... ry.path | TaintedPath.js:202:7:202:48 | path | +| TaintedPath.js:202:14:202:48 | url.par ... ry.path | TaintedPath.js:202:7:202:48 | path | +| TaintedPath.js:202:14:202:48 | url.par ... ry.path | TaintedPath.js:202:7:202:48 | path | +| TaintedPath.js:202:14:202:48 | url.par ... ry.path | TaintedPath.js:202:7:202:48 | path | +| TaintedPath.js:202:24:202:30 | req.url | TaintedPath.js:202:14:202:37 | url.par ... , true) | +| TaintedPath.js:202:24:202:30 | req.url | TaintedPath.js:202:14:202:37 | url.par ... , true) | +| TaintedPath.js:202:24:202:30 | req.url | TaintedPath.js:202:14:202:37 | url.par ... , true) | +| TaintedPath.js:202:24:202:30 | req.url | TaintedPath.js:202:14:202:37 | url.par ... , true) | +| TaintedPath.js:202:24:202:30 | req.url | TaintedPath.js:202:14:202:37 | url.par ... , true) | +| TaintedPath.js:202:24:202:30 | req.url | TaintedPath.js:202:14:202:37 | url.par ... , true) | +| TaintedPath.js:202:24:202:30 | req.url | TaintedPath.js:202:14:202:37 | url.par ... , true) | +| TaintedPath.js:202:24:202:30 | req.url | TaintedPath.js:202:14:202:37 | url.par ... , true) | +| TaintedPath.js:202:24:202:30 | req.url | TaintedPath.js:202:14:202:37 | url.par ... , true) | +| TaintedPath.js:202:24:202:30 | req.url | TaintedPath.js:202:14:202:37 | url.par ... , true) | +| TaintedPath.js:202:24:202:30 | req.url | TaintedPath.js:202:14:202:37 | url.par ... , true) | +| TaintedPath.js:202:24:202:30 | req.url | TaintedPath.js:202:14:202:37 | url.par ... , true) | +| TaintedPath.js:202:24:202:30 | req.url | TaintedPath.js:202:14:202:37 | url.par ... , true) | +| TaintedPath.js:202:24:202:30 | req.url | TaintedPath.js:202:14:202:37 | url.par ... , true) | +| TaintedPath.js:202:24:202:30 | req.url | TaintedPath.js:202:14:202:37 | url.par ... , true) | +| TaintedPath.js:202:24:202:30 | req.url | TaintedPath.js:202:14:202:37 | url.par ... , true) | +| TaintedPath.js:202:24:202:30 | req.url | TaintedPath.js:202:14:202:37 | url.par ... , true) | +| TaintedPath.js:202:24:202:30 | req.url | TaintedPath.js:202:14:202:37 | url.par ... , true) | +| TaintedPath.js:202:24:202:30 | req.url | TaintedPath.js:202:14:202:37 | url.par ... , true) | +| TaintedPath.js:202:24:202:30 | req.url | TaintedPath.js:202:14:202:37 | url.par ... , true) | +| TaintedPath.js:202:24:202:30 | req.url | TaintedPath.js:202:14:202:37 | url.par ... , true) | +| TaintedPath.js:202:24:202:30 | req.url | TaintedPath.js:202:14:202:37 | url.par ... , true) | +| TaintedPath.js:202:24:202:30 | req.url | TaintedPath.js:202:14:202:37 | url.par ... , true) | +| TaintedPath.js:202:24:202:30 | req.url | TaintedPath.js:202:14:202:37 | url.par ... , true) | +| TaintedPath.js:202:24:202:30 | req.url | TaintedPath.js:202:14:202:37 | url.par ... , true) | +| TaintedPath.js:202:24:202:30 | req.url | TaintedPath.js:202:14:202:37 | url.par ... , true) | +| TaintedPath.js:202:24:202:30 | req.url | TaintedPath.js:202:14:202:37 | url.par ... , true) | +| TaintedPath.js:202:24:202:30 | req.url | TaintedPath.js:202:14:202:37 | url.par ... , true) | +| TaintedPath.js:202:24:202:30 | req.url | TaintedPath.js:202:14:202:37 | url.par ... , true) | +| TaintedPath.js:202:24:202:30 | req.url | TaintedPath.js:202:14:202:37 | url.par ... , true) | +| TaintedPath.js:202:24:202:30 | req.url | TaintedPath.js:202:14:202:37 | url.par ... , true) | +| TaintedPath.js:202:24:202:30 | req.url | TaintedPath.js:202:14:202:37 | url.par ... , true) | +| TaintedPath.js:206:29:206:32 | path | TaintedPath.js:206:29:206:85 | path.re ... '), '') | +| TaintedPath.js:206:29:206:32 | path | TaintedPath.js:206:29:206:85 | path.re ... '), '') | +| TaintedPath.js:206:29:206:32 | path | TaintedPath.js:206:29:206:85 | path.re ... '), '') | +| TaintedPath.js:206:29:206:32 | path | TaintedPath.js:206:29:206:85 | path.re ... '), '') | +| TaintedPath.js:206:29:206:32 | path | TaintedPath.js:206:29:206:85 | path.re ... '), '') | +| TaintedPath.js:206:29:206:32 | path | TaintedPath.js:206:29:206:85 | path.re ... '), '') | +| TaintedPath.js:206:29:206:32 | path | TaintedPath.js:206:29:206:85 | path.re ... '), '') | +| TaintedPath.js:206:29:206:32 | path | TaintedPath.js:206:29:206:85 | path.re ... '), '') | +| TaintedPath.js:206:29:206:32 | path | TaintedPath.js:206:29:206:85 | path.re ... '), '') | +| TaintedPath.js:206:29:206:32 | path | TaintedPath.js:206:29:206:85 | path.re ... '), '') | +| TaintedPath.js:206:29:206:32 | path | TaintedPath.js:206:29:206:85 | path.re ... '), '') | +| TaintedPath.js:206:29:206:32 | path | TaintedPath.js:206:29:206:85 | path.re ... '), '') | +| TaintedPath.js:206:29:206:32 | path | TaintedPath.js:206:29:206:85 | path.re ... '), '') | +| TaintedPath.js:206:29:206:32 | path | TaintedPath.js:206:29:206:85 | path.re ... '), '') | +| TaintedPath.js:206:29:206:32 | path | TaintedPath.js:206:29:206:85 | path.re ... '), '') | +| TaintedPath.js:206:29:206:32 | path | TaintedPath.js:206:29:206:85 | path.re ... '), '') | +| TaintedPath.js:206:29:206:32 | path | TaintedPath.js:206:29:206:85 | path.re ... '), '') | +| TaintedPath.js:206:29:206:32 | path | TaintedPath.js:206:29:206:85 | path.re ... '), '') | +| TaintedPath.js:206:29:206:32 | path | TaintedPath.js:206:29:206:85 | path.re ... '), '') | +| TaintedPath.js:206:29:206:32 | path | TaintedPath.js:206:29:206:85 | path.re ... '), '') | +| TaintedPath.js:206:29:206:32 | path | TaintedPath.js:206:29:206:85 | path.re ... '), '') | +| TaintedPath.js:206:29:206:32 | path | TaintedPath.js:206:29:206:85 | path.re ... '), '') | +| TaintedPath.js:206:29:206:32 | path | TaintedPath.js:206:29:206:85 | path.re ... '), '') | +| TaintedPath.js:206:29:206:32 | path | TaintedPath.js:206:29:206:85 | path.re ... '), '') | +| TaintedPath.js:206:29:206:32 | path | TaintedPath.js:206:29:206:85 | path.re ... '), '') | +| TaintedPath.js:206:29:206:32 | path | TaintedPath.js:206:29:206:85 | path.re ... '), '') | +| TaintedPath.js:206:29:206:32 | path | TaintedPath.js:206:29:206:85 | path.re ... '), '') | +| TaintedPath.js:206:29:206:32 | path | TaintedPath.js:206:29:206:85 | path.re ... '), '') | +| TaintedPath.js:206:29:206:32 | path | TaintedPath.js:206:29:206:85 | path.re ... '), '') | +| TaintedPath.js:206:29:206:32 | path | TaintedPath.js:206:29:206:85 | path.re ... '), '') | +| TaintedPath.js:206:29:206:32 | path | TaintedPath.js:206:29:206:85 | path.re ... '), '') | +| TaintedPath.js:206:29:206:32 | path | TaintedPath.js:206:29:206:85 | path.re ... '), '') | +| TaintedPath.js:211:7:211:48 | path | TaintedPath.js:213:29:213:32 | path | +| TaintedPath.js:211:7:211:48 | path | TaintedPath.js:213:29:213:32 | path | +| TaintedPath.js:211:7:211:48 | path | TaintedPath.js:213:29:213:32 | path | +| TaintedPath.js:211:7:211:48 | path | TaintedPath.js:213:29:213:32 | path | +| TaintedPath.js:211:7:211:48 | path | TaintedPath.js:213:29:213:32 | path | +| TaintedPath.js:211:7:211:48 | path | TaintedPath.js:213:29:213:32 | path | +| TaintedPath.js:211:7:211:48 | path | TaintedPath.js:213:29:213:32 | path | +| TaintedPath.js:211:7:211:48 | path | TaintedPath.js:213:29:213:32 | path | +| TaintedPath.js:211:7:211:48 | path | TaintedPath.js:216:31:216:34 | path | +| TaintedPath.js:211:7:211:48 | path | TaintedPath.js:216:31:216:34 | path | +| TaintedPath.js:211:7:211:48 | path | TaintedPath.js:216:31:216:34 | path | +| TaintedPath.js:211:7:211:48 | path | TaintedPath.js:216:31:216:34 | path | +| TaintedPath.js:211:7:211:48 | path | TaintedPath.js:216:31:216:34 | path | +| TaintedPath.js:211:7:211:48 | path | TaintedPath.js:216:31:216:34 | path | +| TaintedPath.js:211:7:211:48 | path | TaintedPath.js:216:31:216:34 | path | +| TaintedPath.js:211:7:211:48 | path | TaintedPath.js:216:31:216:34 | path | +| TaintedPath.js:211:14:211:37 | url.par ... , true) | TaintedPath.js:211:14:211:43 | url.par ... ).query | +| TaintedPath.js:211:14:211:37 | url.par ... , true) | TaintedPath.js:211:14:211:43 | url.par ... ).query | +| TaintedPath.js:211:14:211:37 | url.par ... , true) | TaintedPath.js:211:14:211:43 | url.par ... ).query | +| TaintedPath.js:211:14:211:37 | url.par ... , true) | TaintedPath.js:211:14:211:43 | url.par ... ).query | +| TaintedPath.js:211:14:211:37 | url.par ... , true) | TaintedPath.js:211:14:211:43 | url.par ... ).query | +| TaintedPath.js:211:14:211:37 | url.par ... , true) | TaintedPath.js:211:14:211:43 | url.par ... ).query | +| TaintedPath.js:211:14:211:37 | url.par ... , true) | TaintedPath.js:211:14:211:43 | url.par ... ).query | +| TaintedPath.js:211:14:211:37 | url.par ... , true) | TaintedPath.js:211:14:211:43 | url.par ... ).query | +| TaintedPath.js:211:14:211:37 | url.par ... , true) | TaintedPath.js:211:14:211:43 | url.par ... ).query | +| TaintedPath.js:211:14:211:37 | url.par ... , true) | TaintedPath.js:211:14:211:43 | url.par ... ).query | +| TaintedPath.js:211:14:211:37 | url.par ... , true) | TaintedPath.js:211:14:211:43 | url.par ... ).query | +| TaintedPath.js:211:14:211:37 | url.par ... , true) | TaintedPath.js:211:14:211:43 | url.par ... ).query | +| TaintedPath.js:211:14:211:37 | url.par ... , true) | TaintedPath.js:211:14:211:43 | url.par ... ).query | +| TaintedPath.js:211:14:211:37 | url.par ... , true) | TaintedPath.js:211:14:211:43 | url.par ... ).query | +| TaintedPath.js:211:14:211:37 | url.par ... , true) | TaintedPath.js:211:14:211:43 | url.par ... ).query | +| TaintedPath.js:211:14:211:37 | url.par ... , true) | TaintedPath.js:211:14:211:43 | url.par ... ).query | +| TaintedPath.js:211:14:211:43 | url.par ... ).query | TaintedPath.js:211:14:211:48 | url.par ... ry.path | +| TaintedPath.js:211:14:211:43 | url.par ... ).query | TaintedPath.js:211:14:211:48 | url.par ... ry.path | +| TaintedPath.js:211:14:211:43 | url.par ... ).query | TaintedPath.js:211:14:211:48 | url.par ... ry.path | +| TaintedPath.js:211:14:211:43 | url.par ... ).query | TaintedPath.js:211:14:211:48 | url.par ... ry.path | +| TaintedPath.js:211:14:211:43 | url.par ... ).query | TaintedPath.js:211:14:211:48 | url.par ... ry.path | +| TaintedPath.js:211:14:211:43 | url.par ... ).query | TaintedPath.js:211:14:211:48 | url.par ... ry.path | +| TaintedPath.js:211:14:211:43 | url.par ... ).query | TaintedPath.js:211:14:211:48 | url.par ... ry.path | +| TaintedPath.js:211:14:211:43 | url.par ... ).query | TaintedPath.js:211:14:211:48 | url.par ... ry.path | +| TaintedPath.js:211:14:211:43 | url.par ... ).query | TaintedPath.js:211:14:211:48 | url.par ... ry.path | +| TaintedPath.js:211:14:211:43 | url.par ... ).query | TaintedPath.js:211:14:211:48 | url.par ... ry.path | +| TaintedPath.js:211:14:211:43 | url.par ... ).query | TaintedPath.js:211:14:211:48 | url.par ... ry.path | +| TaintedPath.js:211:14:211:43 | url.par ... ).query | TaintedPath.js:211:14:211:48 | url.par ... ry.path | +| TaintedPath.js:211:14:211:43 | url.par ... ).query | TaintedPath.js:211:14:211:48 | url.par ... ry.path | +| TaintedPath.js:211:14:211:43 | url.par ... ).query | TaintedPath.js:211:14:211:48 | url.par ... ry.path | +| TaintedPath.js:211:14:211:43 | url.par ... ).query | TaintedPath.js:211:14:211:48 | url.par ... ry.path | +| TaintedPath.js:211:14:211:43 | url.par ... ).query | TaintedPath.js:211:14:211:48 | url.par ... ry.path | +| TaintedPath.js:211:14:211:48 | url.par ... ry.path | TaintedPath.js:211:7:211:48 | path | +| TaintedPath.js:211:14:211:48 | url.par ... ry.path | TaintedPath.js:211:7:211:48 | path | +| TaintedPath.js:211:14:211:48 | url.par ... ry.path | TaintedPath.js:211:7:211:48 | path | +| TaintedPath.js:211:14:211:48 | url.par ... ry.path | TaintedPath.js:211:7:211:48 | path | +| TaintedPath.js:211:14:211:48 | url.par ... ry.path | TaintedPath.js:211:7:211:48 | path | +| TaintedPath.js:211:14:211:48 | url.par ... ry.path | TaintedPath.js:211:7:211:48 | path | +| TaintedPath.js:211:14:211:48 | url.par ... ry.path | TaintedPath.js:211:7:211:48 | path | +| TaintedPath.js:211:14:211:48 | url.par ... ry.path | TaintedPath.js:211:7:211:48 | path | +| TaintedPath.js:211:14:211:48 | url.par ... ry.path | TaintedPath.js:211:7:211:48 | path | +| TaintedPath.js:211:14:211:48 | url.par ... ry.path | TaintedPath.js:211:7:211:48 | path | +| TaintedPath.js:211:14:211:48 | url.par ... ry.path | TaintedPath.js:211:7:211:48 | path | +| TaintedPath.js:211:14:211:48 | url.par ... ry.path | TaintedPath.js:211:7:211:48 | path | +| TaintedPath.js:211:14:211:48 | url.par ... ry.path | TaintedPath.js:211:7:211:48 | path | +| TaintedPath.js:211:14:211:48 | url.par ... ry.path | TaintedPath.js:211:7:211:48 | path | +| TaintedPath.js:211:14:211:48 | url.par ... ry.path | TaintedPath.js:211:7:211:48 | path | +| TaintedPath.js:211:14:211:48 | url.par ... ry.path | TaintedPath.js:211:7:211:48 | path | +| TaintedPath.js:211:24:211:30 | req.url | TaintedPath.js:211:14:211:37 | url.par ... , true) | +| TaintedPath.js:211:24:211:30 | req.url | TaintedPath.js:211:14:211:37 | url.par ... , true) | +| TaintedPath.js:211:24:211:30 | req.url | TaintedPath.js:211:14:211:37 | url.par ... , true) | +| TaintedPath.js:211:24:211:30 | req.url | TaintedPath.js:211:14:211:37 | url.par ... , true) | +| TaintedPath.js:211:24:211:30 | req.url | TaintedPath.js:211:14:211:37 | url.par ... , true) | +| TaintedPath.js:211:24:211:30 | req.url | TaintedPath.js:211:14:211:37 | url.par ... , true) | +| TaintedPath.js:211:24:211:30 | req.url | TaintedPath.js:211:14:211:37 | url.par ... , true) | +| TaintedPath.js:211:24:211:30 | req.url | TaintedPath.js:211:14:211:37 | url.par ... , true) | +| TaintedPath.js:211:24:211:30 | req.url | TaintedPath.js:211:14:211:37 | url.par ... , true) | +| TaintedPath.js:211:24:211:30 | req.url | TaintedPath.js:211:14:211:37 | url.par ... , true) | +| TaintedPath.js:211:24:211:30 | req.url | TaintedPath.js:211:14:211:37 | url.par ... , true) | +| TaintedPath.js:211:24:211:30 | req.url | TaintedPath.js:211:14:211:37 | url.par ... , true) | +| TaintedPath.js:211:24:211:30 | req.url | TaintedPath.js:211:14:211:37 | url.par ... , true) | +| TaintedPath.js:211:24:211:30 | req.url | TaintedPath.js:211:14:211:37 | url.par ... , true) | +| TaintedPath.js:211:24:211:30 | req.url | TaintedPath.js:211:14:211:37 | url.par ... , true) | +| TaintedPath.js:211:24:211:30 | req.url | TaintedPath.js:211:14:211:37 | url.par ... , true) | +| TaintedPath.js:211:24:211:30 | req.url | TaintedPath.js:211:14:211:37 | url.par ... , true) | +| TaintedPath.js:211:24:211:30 | req.url | TaintedPath.js:211:14:211:37 | url.par ... , true) | +| TaintedPath.js:211:24:211:30 | req.url | TaintedPath.js:211:14:211:37 | url.par ... , true) | +| TaintedPath.js:211:24:211:30 | req.url | TaintedPath.js:211:14:211:37 | url.par ... , true) | +| TaintedPath.js:211:24:211:30 | req.url | TaintedPath.js:211:14:211:37 | url.par ... , true) | +| TaintedPath.js:211:24:211:30 | req.url | TaintedPath.js:211:14:211:37 | url.par ... , true) | +| TaintedPath.js:211:24:211:30 | req.url | TaintedPath.js:211:14:211:37 | url.par ... , true) | +| TaintedPath.js:211:24:211:30 | req.url | TaintedPath.js:211:14:211:37 | url.par ... , true) | +| TaintedPath.js:211:24:211:30 | req.url | TaintedPath.js:211:14:211:37 | url.par ... , true) | +| TaintedPath.js:211:24:211:30 | req.url | TaintedPath.js:211:14:211:37 | url.par ... , true) | +| TaintedPath.js:211:24:211:30 | req.url | TaintedPath.js:211:14:211:37 | url.par ... , true) | +| TaintedPath.js:211:24:211:30 | req.url | TaintedPath.js:211:14:211:37 | url.par ... , true) | +| TaintedPath.js:211:24:211:30 | req.url | TaintedPath.js:211:14:211:37 | url.par ... , true) | +| TaintedPath.js:211:24:211:30 | req.url | TaintedPath.js:211:14:211:37 | url.par ... , true) | +| TaintedPath.js:211:24:211:30 | req.url | TaintedPath.js:211:14:211:37 | url.par ... , true) | +| TaintedPath.js:211:24:211:30 | req.url | TaintedPath.js:211:14:211:37 | url.par ... , true) | +| TaintedPath.js:213:29:213:32 | path | TaintedPath.js:213:29:213:68 | path.re ... '), '') | +| TaintedPath.js:213:29:213:32 | path | TaintedPath.js:213:29:213:68 | path.re ... '), '') | +| TaintedPath.js:213:29:213:32 | path | TaintedPath.js:213:29:213:68 | path.re ... '), '') | +| TaintedPath.js:213:29:213:32 | path | TaintedPath.js:213:29:213:68 | path.re ... '), '') | +| TaintedPath.js:213:29:213:32 | path | TaintedPath.js:213:29:213:68 | path.re ... '), '') | +| TaintedPath.js:213:29:213:32 | path | TaintedPath.js:213:29:213:68 | path.re ... '), '') | +| TaintedPath.js:213:29:213:32 | path | TaintedPath.js:213:29:213:68 | path.re ... '), '') | +| TaintedPath.js:213:29:213:32 | path | TaintedPath.js:213:29:213:68 | path.re ... '), '') | +| TaintedPath.js:213:29:213:32 | path | TaintedPath.js:213:29:213:68 | path.re ... '), '') | +| TaintedPath.js:213:29:213:32 | path | TaintedPath.js:213:29:213:68 | path.re ... '), '') | +| TaintedPath.js:213:29:213:32 | path | TaintedPath.js:213:29:213:68 | path.re ... '), '') | +| TaintedPath.js:213:29:213:32 | path | TaintedPath.js:213:29:213:68 | path.re ... '), '') | +| TaintedPath.js:213:29:213:32 | path | TaintedPath.js:213:29:213:68 | path.re ... '), '') | +| TaintedPath.js:213:29:213:32 | path | TaintedPath.js:213:29:213:68 | path.re ... '), '') | +| TaintedPath.js:213:29:213:32 | path | TaintedPath.js:213:29:213:68 | path.re ... '), '') | +| TaintedPath.js:213:29:213:32 | path | TaintedPath.js:213:29:213:68 | path.re ... '), '') | +| TaintedPath.js:216:31:216:34 | path | TaintedPath.js:216:31:216:69 | path.re ... '), '') | +| TaintedPath.js:216:31:216:34 | path | TaintedPath.js:216:31:216:69 | path.re ... '), '') | +| TaintedPath.js:216:31:216:34 | path | TaintedPath.js:216:31:216:69 | path.re ... '), '') | +| TaintedPath.js:216:31:216:34 | path | TaintedPath.js:216:31:216:69 | path.re ... '), '') | +| TaintedPath.js:216:31:216:34 | path | TaintedPath.js:216:31:216:69 | path.re ... '), '') | +| TaintedPath.js:216:31:216:34 | path | TaintedPath.js:216:31:216:69 | path.re ... '), '') | +| TaintedPath.js:216:31:216:34 | path | TaintedPath.js:216:31:216:69 | path.re ... '), '') | +| TaintedPath.js:216:31:216:34 | path | TaintedPath.js:216:31:216:69 | path.re ... '), '') | +| TaintedPath.js:216:31:216:34 | path | TaintedPath.js:216:31:216:69 | path.re ... '), '') | +| TaintedPath.js:216:31:216:34 | path | TaintedPath.js:216:31:216:69 | path.re ... '), '') | +| TaintedPath.js:216:31:216:34 | path | TaintedPath.js:216:31:216:69 | path.re ... '), '') | +| TaintedPath.js:216:31:216:34 | path | TaintedPath.js:216:31:216:69 | path.re ... '), '') | +| TaintedPath.js:216:31:216:34 | path | TaintedPath.js:216:31:216:69 | path.re ... '), '') | +| TaintedPath.js:216:31:216:34 | path | TaintedPath.js:216:31:216:69 | path.re ... '), '') | +| TaintedPath.js:216:31:216:34 | path | TaintedPath.js:216:31:216:69 | path.re ... '), '') | +| TaintedPath.js:216:31:216:34 | path | TaintedPath.js:216:31:216:69 | path.re ... '), '') | | examples/TaintedPath.js:8:7:8:52 | filePath | examples/TaintedPath.js:11:36:11:43 | filePath | | examples/TaintedPath.js:8:7:8:52 | filePath | examples/TaintedPath.js:11:36:11:43 | filePath | | examples/TaintedPath.js:8:7:8:52 | filePath | examples/TaintedPath.js:11:36:11:43 | filePath | @@ -10499,6 +10956,9 @@ edges | TaintedPath.js:196:31:196:34 | path | TaintedPath.js:195:24:195:30 | req.url | TaintedPath.js:196:31:196:34 | path | This path depends on a $@. | TaintedPath.js:195:24:195:30 | req.url | user-provided value | | TaintedPath.js:197:45:197:48 | path | TaintedPath.js:195:24:195:30 | req.url | TaintedPath.js:197:45:197:48 | path | This path depends on a $@. | TaintedPath.js:195:24:195:30 | req.url | user-provided value | | TaintedPath.js:198:35:198:38 | path | TaintedPath.js:195:24:195:30 | req.url | TaintedPath.js:198:35:198:38 | path | This path depends on a $@. | TaintedPath.js:195:24:195:30 | req.url | user-provided value | +| TaintedPath.js:206:29:206:85 | path.re ... '), '') | TaintedPath.js:202:24:202:30 | req.url | TaintedPath.js:206:29:206:85 | path.re ... '), '') | This path depends on a $@. | TaintedPath.js:202:24:202:30 | req.url | user-provided value | +| TaintedPath.js:213:29:213:68 | path.re ... '), '') | TaintedPath.js:211:24:211:30 | req.url | TaintedPath.js:213:29:213:68 | path.re ... '), '') | This path depends on a $@. | TaintedPath.js:211:24:211:30 | req.url | user-provided value | +| TaintedPath.js:216:31:216:69 | path.re ... '), '') | TaintedPath.js:211:24:211:30 | req.url | TaintedPath.js:216:31:216:69 | path.re ... '), '') | This path depends on a $@. | TaintedPath.js:211:24:211:30 | req.url | user-provided value | | examples/TaintedPath.js:11:29:11:43 | ROOT + filePath | examples/TaintedPath.js:8:28:8:34 | req.url | examples/TaintedPath.js:11:29:11:43 | ROOT + filePath | This path depends on a $@. | examples/TaintedPath.js:8:28:8:34 | req.url | user-provided value | | express.js:8:20:8:32 | req.query.bar | express.js:8:20:8:32 | req.query.bar | express.js:8:20:8:32 | req.query.bar | This path depends on a $@. | express.js:8:20:8:32 | req.query.bar | user-provided value | | handlebars.js:11:32:11:39 | filePath | handlebars.js:29:46:29:60 | req.params.path | handlebars.js:11:32:11:39 | filePath | This path depends on a $@. | handlebars.js:29:46:29:60 | req.params.path | user-provided value | diff --git a/javascript/ql/test/query-tests/Security/CWE-022/TaintedPath/TaintedPath.js b/javascript/ql/test/query-tests/Security/CWE-022/TaintedPath/TaintedPath.js index d28549da0ec..fd768fecfff 100644 --- a/javascript/ql/test/query-tests/Security/CWE-022/TaintedPath/TaintedPath.js +++ b/javascript/ql/test/query-tests/Security/CWE-022/TaintedPath/TaintedPath.js @@ -197,3 +197,25 @@ var server = http.createServer(function(req, res) { cp.execFileSync("foobar", ["args"], {cwd: path}); // NOT OK cp.execFileSync("foobar", {cwd: path}); // NOT OK }); + +var server = http.createServer(function(req, res) { + let path = url.parse(req.url, true).query.path; + + // Removal of forward-slash or dots. + res.write(fs.readFileSync(path.replace(new RegExp("[\\]\\[*,;'\"`<>\\?/]", 'g'), ''))); // OK + res.write(fs.readFileSync(path.replace(new RegExp("[\\]\\[*,;'\"`<>\\?/]", ''), ''))); // NOT OK. + res.write(fs.readFileSync(path.replace(new RegExp("[\\]\\[*,;'\"`<>\\?/]", unknownFlags()), ''))); // OK -- Might be okay depending on what unknownFlags evaluates to. +}); + +var server = http.createServer(function(req, res) { + let path = url.parse(req.url, true).query.path; + + res.write(fs.readFileSync(path.replace(new RegExp("[.]", 'g'), ''))); // NOT OK (can be absolute) + + if (!pathModule.isAbsolute(path)) { + res.write(fs.readFileSync(path.replace(new RegExp("[.]", ''), ''))); // NOT OK + res.write(fs.readFileSync(path.replace(new RegExp("[.]", 'g'), ''))); // OK + res.write(fs.readFileSync(path.replace(new RegExp("[.]", unknownFlags()), ''))); // OK + } +}); + diff --git a/javascript/ql/test/query-tests/Security/CWE-078/UnsafeShellCommandConstruction/UnsafeShellCommandConstruction.expected b/javascript/ql/test/query-tests/Security/CWE-078/UnsafeShellCommandConstruction/UnsafeShellCommandConstruction.expected index b4022c8550c..f2fa354a305 100644 --- a/javascript/ql/test/query-tests/Security/CWE-078/UnsafeShellCommandConstruction/UnsafeShellCommandConstruction.expected +++ b/javascript/ql/test/query-tests/Security/CWE-078/UnsafeShellCommandConstruction/UnsafeShellCommandConstruction.expected @@ -319,6 +319,15 @@ nodes | lib/lib.js:626:29:626:32 | name | | lib/lib.js:629:25:629:28 | name | | lib/lib.js:629:25:629:28 | name | +| lib/lib.js:632:38:632:41 | name | +| lib/lib.js:632:38:632:41 | name | +| lib/lib.js:633:6:633:68 | sanitized | +| lib/lib.js:633:18:633:68 | "'" + n ... ) + "'" | +| lib/lib.js:633:24:633:27 | name | +| lib/lib.js:633:24:633:62 | name.re ... '\\\\''") | +| lib/lib.js:633:24:633:62 | name.re ... '\\\\''") | +| lib/lib.js:634:22:634:30 | sanitized | +| lib/lib.js:634:22:634:30 | sanitized | | lib/subLib2/compiled-file.ts:3:26:3:29 | name | | lib/subLib2/compiled-file.ts:3:26:3:29 | name | | lib/subLib2/compiled-file.ts:4:25:4:28 | name | @@ -749,6 +758,14 @@ edges | lib/lib.js:608:42:608:45 | name | lib/lib.js:629:25:629:28 | name | | lib/lib.js:608:42:608:45 | name | lib/lib.js:629:25:629:28 | name | | lib/lib.js:608:42:608:45 | name | lib/lib.js:629:25:629:28 | name | +| lib/lib.js:632:38:632:41 | name | lib/lib.js:633:24:633:27 | name | +| lib/lib.js:632:38:632:41 | name | lib/lib.js:633:24:633:27 | name | +| lib/lib.js:633:6:633:68 | sanitized | lib/lib.js:634:22:634:30 | sanitized | +| lib/lib.js:633:6:633:68 | sanitized | lib/lib.js:634:22:634:30 | sanitized | +| lib/lib.js:633:18:633:68 | "'" + n ... ) + "'" | lib/lib.js:633:6:633:68 | sanitized | +| lib/lib.js:633:24:633:27 | name | lib/lib.js:633:24:633:62 | name.re ... '\\\\''") | +| lib/lib.js:633:24:633:27 | name | lib/lib.js:633:24:633:62 | name.re ... '\\\\''") | +| lib/lib.js:633:24:633:62 | name.re ... '\\\\''") | lib/lib.js:633:18:633:68 | "'" + n ... ) + "'" | | lib/subLib2/compiled-file.ts:3:26:3:29 | name | lib/subLib2/compiled-file.ts:4:25:4:28 | name | | lib/subLib2/compiled-file.ts:3:26:3:29 | name | lib/subLib2/compiled-file.ts:4:25:4:28 | name | | lib/subLib2/compiled-file.ts:3:26:3:29 | name | lib/subLib2/compiled-file.ts:4:25:4:28 | name | @@ -879,6 +896,8 @@ edges | lib/lib.js:609:10:609:25 | "rm -rf " + name | lib/lib.js:608:42:608:45 | name | lib/lib.js:609:22:609:25 | name | This string concatenation which depends on $@ is later used in a $@. | lib/lib.js:608:42:608:45 | name | library input | lib/lib.js:609:2:609:26 | cp.exec ... + name) | shell command | | lib/lib.js:626:17:626:32 | "rm -rf " + name | lib/lib.js:608:42:608:45 | name | lib/lib.js:626:29:626:32 | name | This string concatenation which depends on $@ is later used in a $@. | lib/lib.js:608:42:608:45 | name | library input | lib/lib.js:626:9:626:33 | cp.exec ... + name) | shell command | | lib/lib.js:629:13:629:28 | "rm -rf " + name | lib/lib.js:608:42:608:45 | name | lib/lib.js:629:25:629:28 | name | This string concatenation which depends on $@ is later used in a $@. | lib/lib.js:608:42:608:45 | name | library input | lib/lib.js:629:5:629:29 | cp.exec ... + name) | shell command | +| lib/lib.js:633:18:633:68 | "'" + n ... ) + "'" | lib/lib.js:632:38:632:41 | name | lib/lib.js:633:24:633:62 | name.re ... '\\\\''") | This string concatenation which depends on $@ is later used in a $@. | lib/lib.js:632:38:632:41 | name | library input | lib/lib.js:634:2:634:31 | cp.exec ... itized) | shell command | +| lib/lib.js:634:10:634:30 | "rm -rf ... nitized | lib/lib.js:632:38:632:41 | name | lib/lib.js:634:22:634:30 | sanitized | This string concatenation which depends on $@ is later used in a $@. | lib/lib.js:632:38:632:41 | name | library input | lib/lib.js:634:2:634:31 | cp.exec ... itized) | shell command | | lib/subLib2/compiled-file.ts:4:13:4:28 | "rm -rf " + name | lib/subLib2/compiled-file.ts:3:26:3:29 | name | lib/subLib2/compiled-file.ts:4:25:4:28 | name | This string concatenation which depends on $@ is later used in a $@. | lib/subLib2/compiled-file.ts:3:26:3:29 | name | library input | lib/subLib2/compiled-file.ts:4:5:4:29 | cp.exec ... + name) | shell command | | lib/subLib2/special-file.js:4:10:4:25 | "rm -rf " + name | lib/subLib2/special-file.js:3:28:3:31 | name | lib/subLib2/special-file.js:4:22:4:25 | name | This string concatenation which depends on $@ is later used in a $@. | lib/subLib2/special-file.js:3:28:3:31 | name | library input | lib/subLib2/special-file.js:4:2:4:26 | cp.exec ... + name) | shell command | | lib/subLib3/my-file.ts:4:10:4:25 | "rm -rf " + name | lib/subLib3/my-file.ts:3:28:3:31 | name | lib/subLib3/my-file.ts:4:22:4:25 | name | This string concatenation which depends on $@ is later used in a $@. | lib/subLib3/my-file.ts:3:28:3:31 | name | library input | lib/subLib3/my-file.ts:4:2:4:26 | cp.exec ... + name) | shell command | diff --git a/javascript/ql/test/query-tests/Security/CWE-078/UnsafeShellCommandConstruction/lib/lib.js b/javascript/ql/test/query-tests/Security/CWE-078/UnsafeShellCommandConstruction/lib/lib.js index 504de998c1c..09488f0a887 100644 --- a/javascript/ql/test/query-tests/Security/CWE-078/UnsafeShellCommandConstruction/lib/lib.js +++ b/javascript/ql/test/query-tests/Security/CWE-078/UnsafeShellCommandConstruction/lib/lib.js @@ -628,3 +628,14 @@ module.exports.veryIndeirect = function (name) { cp.exec("rm -rf " + name); // NOT OK } + +module.exports.sanitizer = function (name) { + var sanitized = "'" + name.replace(new RegExp("\'"), "'\\''") + "'" + cp.exec("rm -rf " + sanitized); // NOT OK + + var sanitized = "'" + name.replace(new RegExp("\'", 'g'), "'\\''") + "'" + cp.exec("rm -rf " + sanitized); // OK + + var sanitized = "'" + name.replace(new RegExp("\'", unknownFlags()), "'\\''") + "'" + cp.exec("rm -rf " + sanitized); // OK -- Most likely should be okay and not flagged to reduce false positives. +} diff --git a/javascript/ql/test/query-tests/Security/CWE-079/DomBasedXss/Xss.expected b/javascript/ql/test/query-tests/Security/CWE-079/DomBasedXss/Xss.expected index feec74921aa..9b764729c99 100644 --- a/javascript/ql/test/query-tests/Security/CWE-079/DomBasedXss/Xss.expected +++ b/javascript/ql/test/query-tests/Security/CWE-079/DomBasedXss/Xss.expected @@ -1148,6 +1148,12 @@ nodes | tst.js:501:33:501:63 | decodeU ... n.hash) | | tst.js:501:43:501:62 | window.location.hash | | tst.js:501:43:501:62 | window.location.hash | +| tst.js:508:7:508:39 | target | +| tst.js:508:16:508:39 | documen ... .search | +| tst.js:508:16:508:39 | documen ... .search | +| tst.js:509:18:509:23 | target | +| tst.js:509:18:509:54 | target. ... "), '') | +| tst.js:509:18:509:54 | target. ... "), '') | | typeahead.js:20:13:20:45 | target | | typeahead.js:20:22:20:45 | documen ... .search | | typeahead.js:20:22:20:45 | documen ... .search | @@ -2331,6 +2337,11 @@ edges | tst.js:501:43:501:62 | window.location.hash | tst.js:501:33:501:63 | decodeU ... n.hash) | | tst.js:501:43:501:62 | window.location.hash | tst.js:501:33:501:63 | decodeU ... n.hash) | | tst.js:501:43:501:62 | window.location.hash | tst.js:501:33:501:63 | decodeU ... n.hash) | +| tst.js:508:7:508:39 | target | tst.js:509:18:509:23 | target | +| tst.js:508:16:508:39 | documen ... .search | tst.js:508:7:508:39 | target | +| tst.js:508:16:508:39 | documen ... .search | tst.js:508:7:508:39 | target | +| tst.js:509:18:509:23 | target | tst.js:509:18:509:54 | target. ... "), '') | +| tst.js:509:18:509:23 | target | tst.js:509:18:509:54 | target. ... "), '') | | typeahead.js:20:13:20:45 | target | typeahead.js:21:12:21:17 | target | | typeahead.js:20:22:20:45 | documen ... .search | typeahead.js:20:13:20:45 | target | | typeahead.js:20:22:20:45 | documen ... .search | typeahead.js:20:13:20:45 | target | @@ -2623,6 +2634,7 @@ edges | tst.js:491:23:491:45 | locatio ... bstr(1) | tst.js:491:23:491:35 | location.hash | tst.js:491:23:491:45 | locatio ... bstr(1) | Cross-site scripting vulnerability due to $@. | tst.js:491:23:491:35 | location.hash | user-provided value | | tst.js:494:18:494:40 | locatio ... bstr(1) | tst.js:494:18:494:30 | location.hash | tst.js:494:18:494:40 | locatio ... bstr(1) | Cross-site scripting vulnerability due to $@. | tst.js:494:18:494:30 | location.hash | user-provided value | | tst.js:501:33:501:63 | decodeU ... n.hash) | tst.js:501:43:501:62 | window.location.hash | tst.js:501:33:501:63 | decodeU ... n.hash) | Cross-site scripting vulnerability due to $@. | tst.js:501:43:501:62 | window.location.hash | user-provided value | +| tst.js:509:18:509:54 | target. ... "), '') | tst.js:508:16:508:39 | documen ... .search | tst.js:509:18:509:54 | target. ... "), '') | Cross-site scripting vulnerability due to $@. | tst.js:508:16:508:39 | documen ... .search | user-provided value | | typeahead.js:25:18:25:20 | val | typeahead.js:20:22:20:45 | documen ... .search | typeahead.js:25:18:25:20 | val | Cross-site scripting vulnerability due to $@. | typeahead.js:20:22:20:45 | documen ... .search | user-provided value | | v-html.vue:2:8:2:23 | v-html=tainted | v-html.vue:6:42:6:58 | document.location | v-html.vue:2:8:2:23 | v-html=tainted | Cross-site scripting vulnerability due to $@. | v-html.vue:6:42:6:58 | document.location | user-provided value | | various-concat-obfuscations.js:4:4:4:31 | "
" ...
" | various-concat-obfuscations.js:2:16:2:39 | documen ... .search | various-concat-obfuscations.js:4:4:4:31 | "
" ...
" | Cross-site scripting vulnerability due to $@. | various-concat-obfuscations.js:2:16:2:39 | documen ... .search | user-provided value | diff --git a/javascript/ql/test/query-tests/Security/CWE-079/DomBasedXss/XssWithAdditionalSources.expected b/javascript/ql/test/query-tests/Security/CWE-079/DomBasedXss/XssWithAdditionalSources.expected index 3b1d10d5162..185cae0d2d3 100644 --- a/javascript/ql/test/query-tests/Security/CWE-079/DomBasedXss/XssWithAdditionalSources.expected +++ b/javascript/ql/test/query-tests/Security/CWE-079/DomBasedXss/XssWithAdditionalSources.expected @@ -1160,6 +1160,12 @@ nodes | tst.js:501:33:501:63 | decodeU ... n.hash) | | tst.js:501:43:501:62 | window.location.hash | | tst.js:501:43:501:62 | window.location.hash | +| tst.js:508:7:508:39 | target | +| tst.js:508:16:508:39 | documen ... .search | +| tst.js:508:16:508:39 | documen ... .search | +| tst.js:509:18:509:23 | target | +| tst.js:509:18:509:54 | target. ... "), '') | +| tst.js:509:18:509:54 | target. ... "), '') | | typeahead.js:9:28:9:30 | loc | | typeahead.js:9:28:9:30 | loc | | typeahead.js:9:28:9:30 | loc | @@ -2393,6 +2399,11 @@ edges | tst.js:501:43:501:62 | window.location.hash | tst.js:501:33:501:63 | decodeU ... n.hash) | | tst.js:501:43:501:62 | window.location.hash | tst.js:501:33:501:63 | decodeU ... n.hash) | | tst.js:501:43:501:62 | window.location.hash | tst.js:501:33:501:63 | decodeU ... n.hash) | +| tst.js:508:7:508:39 | target | tst.js:509:18:509:23 | target | +| tst.js:508:16:508:39 | documen ... .search | tst.js:508:7:508:39 | target | +| tst.js:508:16:508:39 | documen ... .search | tst.js:508:7:508:39 | target | +| tst.js:509:18:509:23 | target | tst.js:509:18:509:54 | target. ... "), '') | +| tst.js:509:18:509:23 | target | tst.js:509:18:509:54 | target. ... "), '') | | typeahead.js:9:28:9:30 | loc | typeahead.js:10:16:10:18 | loc | | typeahead.js:9:28:9:30 | loc | typeahead.js:10:16:10:18 | loc | | typeahead.js:9:28:9:30 | loc | typeahead.js:10:16:10:18 | loc | diff --git a/javascript/ql/test/query-tests/Security/CWE-079/DomBasedXss/tst.js b/javascript/ql/test/query-tests/Security/CWE-079/DomBasedXss/tst.js index 3a8c5992645..9a110d0bb72 100644 --- a/javascript/ql/test/query-tests/Security/CWE-079/DomBasedXss/tst.js +++ b/javascript/ql/test/query-tests/Security/CWE-079/DomBasedXss/tst.js @@ -503,3 +503,10 @@ function Foo() { }; Object.assign(this, obj); } + +function nonGlobalSanitizer() { + var target = document.location.search + $("#foo").html(target.replace(new RegExp("<|>"), '')); // NOT OK + $("#foo").html(target.replace(new RegExp("<|>", unknownFlags()), '')); // OK -- most likely good. We don't know what the flags are. + $("#foo").html(target.replace(new RegExp("<|>", "g"), '')); // OK +} diff --git a/javascript/ql/test/query-tests/Security/CWE-116/DoubleEscaping/DoubleEscaping.expected b/javascript/ql/test/query-tests/Security/CWE-116/DoubleEscaping/DoubleEscaping.expected index 651e9443b3a..9ec4549b7f6 100644 --- a/javascript/ql/test/query-tests/Security/CWE-116/DoubleEscaping/DoubleEscaping.expected +++ b/javascript/ql/test/query-tests/Security/CWE-116/DoubleEscaping/DoubleEscaping.expected @@ -6,3 +6,4 @@ | tst.js:60:7:60:28 | s.repla ... '%25') | This replacement may double-escape '%' characters from $@. | tst.js:59:7:59:28 | s.repla ... '%26') | here | | tst.js:68:10:70:38 | s.repla ... &") | This replacement may double-escape '&' characters from $@. | tst.js:68:10:69:39 | s.repla ... apos;") | here | | tst.js:79:10:79:66 | s.repla ... &") | This replacement may double-escape '&' characters from $@. | tst.js:79:10:79:43 | s.repla ... epl[c]) | here | +| tst.js:99:10:101:49 | s.repla ... &") | This replacement may double-escape '&' characters from $@. | tst.js:99:10:100:51 | s.repla ... apos;") | here | diff --git a/javascript/ql/test/query-tests/Security/CWE-116/DoubleEscaping/tst.js b/javascript/ql/test/query-tests/Security/CWE-116/DoubleEscaping/tst.js index 76cfe80b238..4fe8c9d6f22 100644 --- a/javascript/ql/test/query-tests/Security/CWE-116/DoubleEscaping/tst.js +++ b/javascript/ql/test/query-tests/Security/CWE-116/DoubleEscaping/tst.js @@ -94,3 +94,21 @@ function testWithCapturedVar(x) { function encodeDecodeEncode(s) { return goodEncode(goodDecode(goodEncode(s))); } + +function badEncode(s) { + return s.replace(new RegExp("\"", "g"), """) + .replace(new RegExp("\'", "g"), "'") + .replace(new RegExp("&", "g"), "&"); // NOT OK +} + +function goodEncode(s) { + return s.replace(new RegExp("\"", ""), """) + .replace(new RegExp("\'", ""), "'") + .replace(new RegExp("&", ""), "&"); // OK +} + +function goodEncode(s) { + return s.replace(new RegExp("\"", unknownFlags()), """) + .replace(new RegExp("\'", unknownFlags()), "'") + .replace(new RegExp("&", unknownFlags()), "&"); // OK +} diff --git a/javascript/ql/test/query-tests/Security/CWE-116/IncompleteSanitization/IncompleteBlacklistSanitizer.expected b/javascript/ql/test/query-tests/Security/CWE-116/IncompleteSanitization/IncompleteBlacklistSanitizer.expected index 4223a4224d3..379ffbdc9c3 100644 --- a/javascript/ql/test/query-tests/Security/CWE-116/IncompleteSanitization/IncompleteBlacklistSanitizer.expected +++ b/javascript/ql/test/query-tests/Security/CWE-116/IncompleteSanitization/IncompleteBlacklistSanitizer.expected @@ -65,3 +65,9 @@ | tst.js:305:10:305:34 | s().rep ... ]/g,'') | This HTML sanitizer does not sanitize double quotes | | tst.js:309:10:318:3 | s().rep ... ;";\\n\\t}) | This HTML sanitizer does not sanitize single quotes | | tst.js:320:9:329:3 | s().rep ... ;";\\n\\t}) | This HTML sanitizer does not sanitize single quotes | +| tst.js:333:2:333:40 | s().rep ... g"),'') | This HTML sanitizer does not sanitize ampersands | +| tst.js:333:2:333:40 | s().rep ... g"),'') | This HTML sanitizer does not sanitize double quotes | +| tst.js:333:2:333:40 | s().rep ... g"),'') | This HTML sanitizer does not sanitize single quotes | +| tst.js:337:2:337:46 | s().rep ... ()),'') | This HTML sanitizer does not sanitize ampersands | +| tst.js:337:2:337:46 | s().rep ... ()),'') | This HTML sanitizer does not sanitize double quotes | +| tst.js:337:2:337:46 | s().rep ... ()),'') | This HTML sanitizer does not sanitize single quotes | diff --git a/javascript/ql/test/query-tests/Security/CWE-116/IncompleteSanitization/IncompleteMultiCharacterSanitization.expected b/javascript/ql/test/query-tests/Security/CWE-116/IncompleteSanitization/IncompleteMultiCharacterSanitization.expected index 32400608814..96a48fec6cb 100644 --- a/javascript/ql/test/query-tests/Security/CWE-116/IncompleteSanitization/IncompleteMultiCharacterSanitization.expected +++ b/javascript/ql/test/query-tests/Security/CWE-116/IncompleteSanitization/IncompleteMultiCharacterSanitization.expected @@ -39,3 +39,4 @@ | tst-multi-character-sanitization.js:145:13:145:90 | content ... /g, '') | This string may still contain $@, which may cause an HTML element injection vulnerability. | tst-multi-character-sanitization.js:145:30:145:30 | < |