mirror of
https://github.com/github/codeql.git
synced 2025-12-24 04:36:35 +01:00
Merge branch 'main' of https://github.com/github/codeql into python-dataflow/flow-summaries-from-scratch
This commit is contained in:
20
.github/workflows/swift-codegen.yml
vendored
20
.github/workflows/swift-codegen.yml
vendored
@@ -15,18 +15,22 @@ jobs:
|
|||||||
- uses: actions/checkout@v3
|
- uses: actions/checkout@v3
|
||||||
- uses: ./.github/actions/fetch-codeql
|
- uses: ./.github/actions/fetch-codeql
|
||||||
- uses: bazelbuild/setup-bazelisk@v2
|
- uses: bazelbuild/setup-bazelisk@v2
|
||||||
|
- uses: actions/setup-python@v3
|
||||||
|
- uses: pre-commit/action@v3.0.0
|
||||||
|
name: Check that python code is properly formatted
|
||||||
|
with:
|
||||||
|
extra_args: autopep8 --all-files
|
||||||
- name: Run unit tests
|
- name: Run unit tests
|
||||||
run: |
|
run: |
|
||||||
bazel test //swift/codegen/test --test_output=errors
|
bazel test //swift/codegen/test --test_output=errors
|
||||||
- name: Check that QL generated code was checked in
|
- uses: pre-commit/action@v3.0.0
|
||||||
run: |
|
name: Check that QL generated code was checked in
|
||||||
bazel run //swift/codegen
|
with:
|
||||||
git add swift
|
extra_args: swift-codegen --all-files
|
||||||
git diff --exit-code HEAD
|
|
||||||
- name: Generate C++ files
|
- name: Generate C++ files
|
||||||
run: |
|
run: |
|
||||||
bazel run //swift/codegen:codegen -- --generate=trap,cpp --cpp-output=$PWD/swift-generated-headers
|
bazel run //swift/codegen:codegen -- --generate=trap,cpp --cpp-output=$PWD/swift-generated-cpp-files
|
||||||
- uses: actions/upload-artifact@v3
|
- uses: actions/upload-artifact@v3
|
||||||
with:
|
with:
|
||||||
name: swift-generated-headers
|
name: swift-generated-cpp-files
|
||||||
path: swift-generated-headers/*.h
|
path: swift-generated-cpp-files/**
|
||||||
|
|||||||
@@ -15,6 +15,12 @@ repos:
|
|||||||
- id: clang-format
|
- id: clang-format
|
||||||
files: ^swift/.*\.(h|c|cpp)$
|
files: ^swift/.*\.(h|c|cpp)$
|
||||||
|
|
||||||
|
- repo: https://github.com/pre-commit/mirrors-autopep8
|
||||||
|
rev: v1.6.0
|
||||||
|
hooks:
|
||||||
|
- id: autopep8
|
||||||
|
files: ^swift/codegen/.*\.py
|
||||||
|
|
||||||
- repo: local
|
- repo: local
|
||||||
hooks:
|
hooks:
|
||||||
- id: codeql-format
|
- id: codeql-format
|
||||||
|
|||||||
@@ -454,11 +454,11 @@
|
|||||||
"python/ql/src/Lexical/CommentedOutCodeReferences.inc.qhelp"
|
"python/ql/src/Lexical/CommentedOutCodeReferences.inc.qhelp"
|
||||||
],
|
],
|
||||||
"IDE Contextual Queries": [
|
"IDE Contextual Queries": [
|
||||||
"cpp/ql/src/IDEContextual.qll",
|
"cpp/ql/lib/IDEContextual.qll",
|
||||||
"csharp/ql/src/IDEContextual.qll",
|
"csharp/ql/lib/IDEContextual.qll",
|
||||||
"java/ql/src/IDEContextual.qll",
|
"java/ql/lib/IDEContextual.qll",
|
||||||
"javascript/ql/src/IDEContextual.qll",
|
"javascript/ql/lib/IDEContextual.qll",
|
||||||
"python/ql/src/analysis/IDEContextual.qll"
|
"python/ql/lib/analysis/IDEContextual.qll"
|
||||||
],
|
],
|
||||||
"SSA C#": [
|
"SSA C#": [
|
||||||
"csharp/ql/lib/semmle/code/csharp/dataflow/internal/SsaImplCommon.qll",
|
"csharp/ql/lib/semmle/code/csharp/dataflow/internal/SsaImplCommon.qll",
|
||||||
|
|||||||
@@ -1,3 +1,13 @@
|
|||||||
|
## 0.3.0
|
||||||
|
|
||||||
|
### Deprecated APIs
|
||||||
|
|
||||||
|
* The `BarrierGuard` class has been deprecated. Such barriers and sanitizers can now instead be created using the new `BarrierGuard` parameterized module.
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* `UserType.getADeclarationEntry()` now yields all forward declarations when the user type is a `class`, `struct`, or `union`.
|
||||||
|
|
||||||
## 0.2.3
|
## 0.2.3
|
||||||
|
|
||||||
### New Features
|
### New Features
|
||||||
|
|||||||
@@ -1,4 +0,0 @@
|
|||||||
---
|
|
||||||
category: feature
|
|
||||||
---
|
|
||||||
* An `isBraced` predicate was added to the `Initializer` class which holds when a C++ braced initializer was used in the initialization.
|
|
||||||
@@ -1,4 +0,0 @@
|
|||||||
---
|
|
||||||
category: fix
|
|
||||||
---
|
|
||||||
* `UserType.getADeclarationEntry()` now yields all forward declarations when the user type is a `class`, `struct`, or `union`.
|
|
||||||
9
cpp/ql/lib/change-notes/released/0.3.0.md
Normal file
9
cpp/ql/lib/change-notes/released/0.3.0.md
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
## 0.3.0
|
||||||
|
|
||||||
|
### Deprecated APIs
|
||||||
|
|
||||||
|
* The `BarrierGuard` class has been deprecated. Such barriers and sanitizers can now instead be created using the new `BarrierGuard` parameterized module.
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* `UserType.getADeclarationEntry()` now yields all forward declarations when the user type is a `class`, `struct`, or `union`.
|
||||||
@@ -1,2 +1,2 @@
|
|||||||
---
|
---
|
||||||
lastReleaseVersion: 0.2.3
|
lastReleaseVersion: 0.3.0
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
name: codeql/cpp-all
|
name: codeql/cpp-all
|
||||||
version: 0.3.0-dev
|
version: 0.3.1-dev
|
||||||
groups: cpp
|
groups: cpp
|
||||||
dbscheme: semmlecode.cpp.dbscheme
|
dbscheme: semmlecode.cpp.dbscheme
|
||||||
extractor: cpp
|
extractor: cpp
|
||||||
|
|||||||
@@ -428,7 +428,7 @@ private predicate localFlowStep(NodeEx node1, NodeEx node2, Configuration config
|
|||||||
exists(Node n1, Node n2 |
|
exists(Node n1, Node n2 |
|
||||||
node1.asNode() = n1 and
|
node1.asNode() = n1 and
|
||||||
node2.asNode() = n2 and
|
node2.asNode() = n2 and
|
||||||
simpleLocalFlowStepExt(n1, n2) and
|
simpleLocalFlowStepExt(pragma[only_bind_into](n1), pragma[only_bind_into](n2)) and
|
||||||
stepFilter(node1, node2, config)
|
stepFilter(node1, node2, config)
|
||||||
)
|
)
|
||||||
or
|
or
|
||||||
@@ -447,7 +447,7 @@ private predicate additionalLocalFlowStep(NodeEx node1, NodeEx node2, Configurat
|
|||||||
exists(Node n1, Node n2 |
|
exists(Node n1, Node n2 |
|
||||||
node1.asNode() = n1 and
|
node1.asNode() = n1 and
|
||||||
node2.asNode() = n2 and
|
node2.asNode() = n2 and
|
||||||
config.isAdditionalFlowStep(n1, n2) and
|
config.isAdditionalFlowStep(pragma[only_bind_into](n1), pragma[only_bind_into](n2)) and
|
||||||
getNodeEnclosingCallable(n1) = getNodeEnclosingCallable(n2) and
|
getNodeEnclosingCallable(n1) = getNodeEnclosingCallable(n2) and
|
||||||
stepFilter(node1, node2, config)
|
stepFilter(node1, node2, config)
|
||||||
)
|
)
|
||||||
@@ -466,7 +466,7 @@ private predicate additionalLocalStateStep(
|
|||||||
exists(Node n1, Node n2 |
|
exists(Node n1, Node n2 |
|
||||||
node1.asNode() = n1 and
|
node1.asNode() = n1 and
|
||||||
node2.asNode() = n2 and
|
node2.asNode() = n2 and
|
||||||
config.isAdditionalFlowStep(n1, s1, n2, s2) and
|
config.isAdditionalFlowStep(pragma[only_bind_into](n1), s1, pragma[only_bind_into](n2), s2) and
|
||||||
getNodeEnclosingCallable(n1) = getNodeEnclosingCallable(n2) and
|
getNodeEnclosingCallable(n1) = getNodeEnclosingCallable(n2) and
|
||||||
stepFilter(node1, node2, config) and
|
stepFilter(node1, node2, config) and
|
||||||
not stateBarrier(node1, s1, config) and
|
not stateBarrier(node1, s1, config) and
|
||||||
@@ -481,7 +481,7 @@ private predicate jumpStep(NodeEx node1, NodeEx node2, Configuration config) {
|
|||||||
exists(Node n1, Node n2 |
|
exists(Node n1, Node n2 |
|
||||||
node1.asNode() = n1 and
|
node1.asNode() = n1 and
|
||||||
node2.asNode() = n2 and
|
node2.asNode() = n2 and
|
||||||
jumpStepCached(n1, n2) and
|
jumpStepCached(pragma[only_bind_into](n1), pragma[only_bind_into](n2)) and
|
||||||
stepFilter(node1, node2, config) and
|
stepFilter(node1, node2, config) and
|
||||||
not config.getAFeature() instanceof FeatureEqualSourceSinkCallContext
|
not config.getAFeature() instanceof FeatureEqualSourceSinkCallContext
|
||||||
)
|
)
|
||||||
@@ -494,7 +494,7 @@ private predicate additionalJumpStep(NodeEx node1, NodeEx node2, Configuration c
|
|||||||
exists(Node n1, Node n2 |
|
exists(Node n1, Node n2 |
|
||||||
node1.asNode() = n1 and
|
node1.asNode() = n1 and
|
||||||
node2.asNode() = n2 and
|
node2.asNode() = n2 and
|
||||||
config.isAdditionalFlowStep(n1, n2) and
|
config.isAdditionalFlowStep(pragma[only_bind_into](n1), pragma[only_bind_into](n2)) and
|
||||||
getNodeEnclosingCallable(n1) != getNodeEnclosingCallable(n2) and
|
getNodeEnclosingCallable(n1) != getNodeEnclosingCallable(n2) and
|
||||||
stepFilter(node1, node2, config) and
|
stepFilter(node1, node2, config) and
|
||||||
not config.getAFeature() instanceof FeatureEqualSourceSinkCallContext
|
not config.getAFeature() instanceof FeatureEqualSourceSinkCallContext
|
||||||
@@ -507,7 +507,7 @@ private predicate additionalJumpStateStep(
|
|||||||
exists(Node n1, Node n2 |
|
exists(Node n1, Node n2 |
|
||||||
node1.asNode() = n1 and
|
node1.asNode() = n1 and
|
||||||
node2.asNode() = n2 and
|
node2.asNode() = n2 and
|
||||||
config.isAdditionalFlowStep(n1, s1, n2, s2) and
|
config.isAdditionalFlowStep(pragma[only_bind_into](n1), s1, pragma[only_bind_into](n2), s2) and
|
||||||
getNodeEnclosingCallable(n1) != getNodeEnclosingCallable(n2) and
|
getNodeEnclosingCallable(n1) != getNodeEnclosingCallable(n2) and
|
||||||
stepFilter(node1, node2, config) and
|
stepFilter(node1, node2, config) and
|
||||||
not stateBarrier(node1, s1, config) and
|
not stateBarrier(node1, s1, config) and
|
||||||
@@ -518,7 +518,7 @@ private predicate additionalJumpStateStep(
|
|||||||
|
|
||||||
pragma[nomagic]
|
pragma[nomagic]
|
||||||
private predicate readSet(NodeEx node1, ContentSet c, NodeEx node2, Configuration config) {
|
private predicate readSet(NodeEx node1, ContentSet c, NodeEx node2, Configuration config) {
|
||||||
readSet(node1.asNode(), c, node2.asNode()) and
|
readSet(pragma[only_bind_into](node1.asNode()), c, pragma[only_bind_into](node2.asNode())) and
|
||||||
stepFilter(node1, node2, config)
|
stepFilter(node1, node2, config)
|
||||||
or
|
or
|
||||||
exists(Node n |
|
exists(Node n |
|
||||||
@@ -562,7 +562,8 @@ pragma[nomagic]
|
|||||||
private predicate store(
|
private predicate store(
|
||||||
NodeEx node1, TypedContent tc, NodeEx node2, DataFlowType contentType, Configuration config
|
NodeEx node1, TypedContent tc, NodeEx node2, DataFlowType contentType, Configuration config
|
||||||
) {
|
) {
|
||||||
store(node1.asNode(), tc, node2.asNode(), contentType) and
|
store(pragma[only_bind_into](node1.asNode()), tc, pragma[only_bind_into](node2.asNode()),
|
||||||
|
contentType) and
|
||||||
read(_, tc.getContent(), _, config) and
|
read(_, tc.getContent(), _, config) and
|
||||||
stepFilter(node1, node2, config)
|
stepFilter(node1, node2, config)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -428,7 +428,7 @@ private predicate localFlowStep(NodeEx node1, NodeEx node2, Configuration config
|
|||||||
exists(Node n1, Node n2 |
|
exists(Node n1, Node n2 |
|
||||||
node1.asNode() = n1 and
|
node1.asNode() = n1 and
|
||||||
node2.asNode() = n2 and
|
node2.asNode() = n2 and
|
||||||
simpleLocalFlowStepExt(n1, n2) and
|
simpleLocalFlowStepExt(pragma[only_bind_into](n1), pragma[only_bind_into](n2)) and
|
||||||
stepFilter(node1, node2, config)
|
stepFilter(node1, node2, config)
|
||||||
)
|
)
|
||||||
or
|
or
|
||||||
@@ -447,7 +447,7 @@ private predicate additionalLocalFlowStep(NodeEx node1, NodeEx node2, Configurat
|
|||||||
exists(Node n1, Node n2 |
|
exists(Node n1, Node n2 |
|
||||||
node1.asNode() = n1 and
|
node1.asNode() = n1 and
|
||||||
node2.asNode() = n2 and
|
node2.asNode() = n2 and
|
||||||
config.isAdditionalFlowStep(n1, n2) and
|
config.isAdditionalFlowStep(pragma[only_bind_into](n1), pragma[only_bind_into](n2)) and
|
||||||
getNodeEnclosingCallable(n1) = getNodeEnclosingCallable(n2) and
|
getNodeEnclosingCallable(n1) = getNodeEnclosingCallable(n2) and
|
||||||
stepFilter(node1, node2, config)
|
stepFilter(node1, node2, config)
|
||||||
)
|
)
|
||||||
@@ -466,7 +466,7 @@ private predicate additionalLocalStateStep(
|
|||||||
exists(Node n1, Node n2 |
|
exists(Node n1, Node n2 |
|
||||||
node1.asNode() = n1 and
|
node1.asNode() = n1 and
|
||||||
node2.asNode() = n2 and
|
node2.asNode() = n2 and
|
||||||
config.isAdditionalFlowStep(n1, s1, n2, s2) and
|
config.isAdditionalFlowStep(pragma[only_bind_into](n1), s1, pragma[only_bind_into](n2), s2) and
|
||||||
getNodeEnclosingCallable(n1) = getNodeEnclosingCallable(n2) and
|
getNodeEnclosingCallable(n1) = getNodeEnclosingCallable(n2) and
|
||||||
stepFilter(node1, node2, config) and
|
stepFilter(node1, node2, config) and
|
||||||
not stateBarrier(node1, s1, config) and
|
not stateBarrier(node1, s1, config) and
|
||||||
@@ -481,7 +481,7 @@ private predicate jumpStep(NodeEx node1, NodeEx node2, Configuration config) {
|
|||||||
exists(Node n1, Node n2 |
|
exists(Node n1, Node n2 |
|
||||||
node1.asNode() = n1 and
|
node1.asNode() = n1 and
|
||||||
node2.asNode() = n2 and
|
node2.asNode() = n2 and
|
||||||
jumpStepCached(n1, n2) and
|
jumpStepCached(pragma[only_bind_into](n1), pragma[only_bind_into](n2)) and
|
||||||
stepFilter(node1, node2, config) and
|
stepFilter(node1, node2, config) and
|
||||||
not config.getAFeature() instanceof FeatureEqualSourceSinkCallContext
|
not config.getAFeature() instanceof FeatureEqualSourceSinkCallContext
|
||||||
)
|
)
|
||||||
@@ -494,7 +494,7 @@ private predicate additionalJumpStep(NodeEx node1, NodeEx node2, Configuration c
|
|||||||
exists(Node n1, Node n2 |
|
exists(Node n1, Node n2 |
|
||||||
node1.asNode() = n1 and
|
node1.asNode() = n1 and
|
||||||
node2.asNode() = n2 and
|
node2.asNode() = n2 and
|
||||||
config.isAdditionalFlowStep(n1, n2) and
|
config.isAdditionalFlowStep(pragma[only_bind_into](n1), pragma[only_bind_into](n2)) and
|
||||||
getNodeEnclosingCallable(n1) != getNodeEnclosingCallable(n2) and
|
getNodeEnclosingCallable(n1) != getNodeEnclosingCallable(n2) and
|
||||||
stepFilter(node1, node2, config) and
|
stepFilter(node1, node2, config) and
|
||||||
not config.getAFeature() instanceof FeatureEqualSourceSinkCallContext
|
not config.getAFeature() instanceof FeatureEqualSourceSinkCallContext
|
||||||
@@ -507,7 +507,7 @@ private predicate additionalJumpStateStep(
|
|||||||
exists(Node n1, Node n2 |
|
exists(Node n1, Node n2 |
|
||||||
node1.asNode() = n1 and
|
node1.asNode() = n1 and
|
||||||
node2.asNode() = n2 and
|
node2.asNode() = n2 and
|
||||||
config.isAdditionalFlowStep(n1, s1, n2, s2) and
|
config.isAdditionalFlowStep(pragma[only_bind_into](n1), s1, pragma[only_bind_into](n2), s2) and
|
||||||
getNodeEnclosingCallable(n1) != getNodeEnclosingCallable(n2) and
|
getNodeEnclosingCallable(n1) != getNodeEnclosingCallable(n2) and
|
||||||
stepFilter(node1, node2, config) and
|
stepFilter(node1, node2, config) and
|
||||||
not stateBarrier(node1, s1, config) and
|
not stateBarrier(node1, s1, config) and
|
||||||
@@ -518,7 +518,7 @@ private predicate additionalJumpStateStep(
|
|||||||
|
|
||||||
pragma[nomagic]
|
pragma[nomagic]
|
||||||
private predicate readSet(NodeEx node1, ContentSet c, NodeEx node2, Configuration config) {
|
private predicate readSet(NodeEx node1, ContentSet c, NodeEx node2, Configuration config) {
|
||||||
readSet(node1.asNode(), c, node2.asNode()) and
|
readSet(pragma[only_bind_into](node1.asNode()), c, pragma[only_bind_into](node2.asNode())) and
|
||||||
stepFilter(node1, node2, config)
|
stepFilter(node1, node2, config)
|
||||||
or
|
or
|
||||||
exists(Node n |
|
exists(Node n |
|
||||||
@@ -562,7 +562,8 @@ pragma[nomagic]
|
|||||||
private predicate store(
|
private predicate store(
|
||||||
NodeEx node1, TypedContent tc, NodeEx node2, DataFlowType contentType, Configuration config
|
NodeEx node1, TypedContent tc, NodeEx node2, DataFlowType contentType, Configuration config
|
||||||
) {
|
) {
|
||||||
store(node1.asNode(), tc, node2.asNode(), contentType) and
|
store(pragma[only_bind_into](node1.asNode()), tc, pragma[only_bind_into](node2.asNode()),
|
||||||
|
contentType) and
|
||||||
read(_, tc.getContent(), _, config) and
|
read(_, tc.getContent(), _, config) and
|
||||||
stepFilter(node1, node2, config)
|
stepFilter(node1, node2, config)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -428,7 +428,7 @@ private predicate localFlowStep(NodeEx node1, NodeEx node2, Configuration config
|
|||||||
exists(Node n1, Node n2 |
|
exists(Node n1, Node n2 |
|
||||||
node1.asNode() = n1 and
|
node1.asNode() = n1 and
|
||||||
node2.asNode() = n2 and
|
node2.asNode() = n2 and
|
||||||
simpleLocalFlowStepExt(n1, n2) and
|
simpleLocalFlowStepExt(pragma[only_bind_into](n1), pragma[only_bind_into](n2)) and
|
||||||
stepFilter(node1, node2, config)
|
stepFilter(node1, node2, config)
|
||||||
)
|
)
|
||||||
or
|
or
|
||||||
@@ -447,7 +447,7 @@ private predicate additionalLocalFlowStep(NodeEx node1, NodeEx node2, Configurat
|
|||||||
exists(Node n1, Node n2 |
|
exists(Node n1, Node n2 |
|
||||||
node1.asNode() = n1 and
|
node1.asNode() = n1 and
|
||||||
node2.asNode() = n2 and
|
node2.asNode() = n2 and
|
||||||
config.isAdditionalFlowStep(n1, n2) and
|
config.isAdditionalFlowStep(pragma[only_bind_into](n1), pragma[only_bind_into](n2)) and
|
||||||
getNodeEnclosingCallable(n1) = getNodeEnclosingCallable(n2) and
|
getNodeEnclosingCallable(n1) = getNodeEnclosingCallable(n2) and
|
||||||
stepFilter(node1, node2, config)
|
stepFilter(node1, node2, config)
|
||||||
)
|
)
|
||||||
@@ -466,7 +466,7 @@ private predicate additionalLocalStateStep(
|
|||||||
exists(Node n1, Node n2 |
|
exists(Node n1, Node n2 |
|
||||||
node1.asNode() = n1 and
|
node1.asNode() = n1 and
|
||||||
node2.asNode() = n2 and
|
node2.asNode() = n2 and
|
||||||
config.isAdditionalFlowStep(n1, s1, n2, s2) and
|
config.isAdditionalFlowStep(pragma[only_bind_into](n1), s1, pragma[only_bind_into](n2), s2) and
|
||||||
getNodeEnclosingCallable(n1) = getNodeEnclosingCallable(n2) and
|
getNodeEnclosingCallable(n1) = getNodeEnclosingCallable(n2) and
|
||||||
stepFilter(node1, node2, config) and
|
stepFilter(node1, node2, config) and
|
||||||
not stateBarrier(node1, s1, config) and
|
not stateBarrier(node1, s1, config) and
|
||||||
@@ -481,7 +481,7 @@ private predicate jumpStep(NodeEx node1, NodeEx node2, Configuration config) {
|
|||||||
exists(Node n1, Node n2 |
|
exists(Node n1, Node n2 |
|
||||||
node1.asNode() = n1 and
|
node1.asNode() = n1 and
|
||||||
node2.asNode() = n2 and
|
node2.asNode() = n2 and
|
||||||
jumpStepCached(n1, n2) and
|
jumpStepCached(pragma[only_bind_into](n1), pragma[only_bind_into](n2)) and
|
||||||
stepFilter(node1, node2, config) and
|
stepFilter(node1, node2, config) and
|
||||||
not config.getAFeature() instanceof FeatureEqualSourceSinkCallContext
|
not config.getAFeature() instanceof FeatureEqualSourceSinkCallContext
|
||||||
)
|
)
|
||||||
@@ -494,7 +494,7 @@ private predicate additionalJumpStep(NodeEx node1, NodeEx node2, Configuration c
|
|||||||
exists(Node n1, Node n2 |
|
exists(Node n1, Node n2 |
|
||||||
node1.asNode() = n1 and
|
node1.asNode() = n1 and
|
||||||
node2.asNode() = n2 and
|
node2.asNode() = n2 and
|
||||||
config.isAdditionalFlowStep(n1, n2) and
|
config.isAdditionalFlowStep(pragma[only_bind_into](n1), pragma[only_bind_into](n2)) and
|
||||||
getNodeEnclosingCallable(n1) != getNodeEnclosingCallable(n2) and
|
getNodeEnclosingCallable(n1) != getNodeEnclosingCallable(n2) and
|
||||||
stepFilter(node1, node2, config) and
|
stepFilter(node1, node2, config) and
|
||||||
not config.getAFeature() instanceof FeatureEqualSourceSinkCallContext
|
not config.getAFeature() instanceof FeatureEqualSourceSinkCallContext
|
||||||
@@ -507,7 +507,7 @@ private predicate additionalJumpStateStep(
|
|||||||
exists(Node n1, Node n2 |
|
exists(Node n1, Node n2 |
|
||||||
node1.asNode() = n1 and
|
node1.asNode() = n1 and
|
||||||
node2.asNode() = n2 and
|
node2.asNode() = n2 and
|
||||||
config.isAdditionalFlowStep(n1, s1, n2, s2) and
|
config.isAdditionalFlowStep(pragma[only_bind_into](n1), s1, pragma[only_bind_into](n2), s2) and
|
||||||
getNodeEnclosingCallable(n1) != getNodeEnclosingCallable(n2) and
|
getNodeEnclosingCallable(n1) != getNodeEnclosingCallable(n2) and
|
||||||
stepFilter(node1, node2, config) and
|
stepFilter(node1, node2, config) and
|
||||||
not stateBarrier(node1, s1, config) and
|
not stateBarrier(node1, s1, config) and
|
||||||
@@ -518,7 +518,7 @@ private predicate additionalJumpStateStep(
|
|||||||
|
|
||||||
pragma[nomagic]
|
pragma[nomagic]
|
||||||
private predicate readSet(NodeEx node1, ContentSet c, NodeEx node2, Configuration config) {
|
private predicate readSet(NodeEx node1, ContentSet c, NodeEx node2, Configuration config) {
|
||||||
readSet(node1.asNode(), c, node2.asNode()) and
|
readSet(pragma[only_bind_into](node1.asNode()), c, pragma[only_bind_into](node2.asNode())) and
|
||||||
stepFilter(node1, node2, config)
|
stepFilter(node1, node2, config)
|
||||||
or
|
or
|
||||||
exists(Node n |
|
exists(Node n |
|
||||||
@@ -562,7 +562,8 @@ pragma[nomagic]
|
|||||||
private predicate store(
|
private predicate store(
|
||||||
NodeEx node1, TypedContent tc, NodeEx node2, DataFlowType contentType, Configuration config
|
NodeEx node1, TypedContent tc, NodeEx node2, DataFlowType contentType, Configuration config
|
||||||
) {
|
) {
|
||||||
store(node1.asNode(), tc, node2.asNode(), contentType) and
|
store(pragma[only_bind_into](node1.asNode()), tc, pragma[only_bind_into](node2.asNode()),
|
||||||
|
contentType) and
|
||||||
read(_, tc.getContent(), _, config) and
|
read(_, tc.getContent(), _, config) and
|
||||||
stepFilter(node1, node2, config)
|
stepFilter(node1, node2, config)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -428,7 +428,7 @@ private predicate localFlowStep(NodeEx node1, NodeEx node2, Configuration config
|
|||||||
exists(Node n1, Node n2 |
|
exists(Node n1, Node n2 |
|
||||||
node1.asNode() = n1 and
|
node1.asNode() = n1 and
|
||||||
node2.asNode() = n2 and
|
node2.asNode() = n2 and
|
||||||
simpleLocalFlowStepExt(n1, n2) and
|
simpleLocalFlowStepExt(pragma[only_bind_into](n1), pragma[only_bind_into](n2)) and
|
||||||
stepFilter(node1, node2, config)
|
stepFilter(node1, node2, config)
|
||||||
)
|
)
|
||||||
or
|
or
|
||||||
@@ -447,7 +447,7 @@ private predicate additionalLocalFlowStep(NodeEx node1, NodeEx node2, Configurat
|
|||||||
exists(Node n1, Node n2 |
|
exists(Node n1, Node n2 |
|
||||||
node1.asNode() = n1 and
|
node1.asNode() = n1 and
|
||||||
node2.asNode() = n2 and
|
node2.asNode() = n2 and
|
||||||
config.isAdditionalFlowStep(n1, n2) and
|
config.isAdditionalFlowStep(pragma[only_bind_into](n1), pragma[only_bind_into](n2)) and
|
||||||
getNodeEnclosingCallable(n1) = getNodeEnclosingCallable(n2) and
|
getNodeEnclosingCallable(n1) = getNodeEnclosingCallable(n2) and
|
||||||
stepFilter(node1, node2, config)
|
stepFilter(node1, node2, config)
|
||||||
)
|
)
|
||||||
@@ -466,7 +466,7 @@ private predicate additionalLocalStateStep(
|
|||||||
exists(Node n1, Node n2 |
|
exists(Node n1, Node n2 |
|
||||||
node1.asNode() = n1 and
|
node1.asNode() = n1 and
|
||||||
node2.asNode() = n2 and
|
node2.asNode() = n2 and
|
||||||
config.isAdditionalFlowStep(n1, s1, n2, s2) and
|
config.isAdditionalFlowStep(pragma[only_bind_into](n1), s1, pragma[only_bind_into](n2), s2) and
|
||||||
getNodeEnclosingCallable(n1) = getNodeEnclosingCallable(n2) and
|
getNodeEnclosingCallable(n1) = getNodeEnclosingCallable(n2) and
|
||||||
stepFilter(node1, node2, config) and
|
stepFilter(node1, node2, config) and
|
||||||
not stateBarrier(node1, s1, config) and
|
not stateBarrier(node1, s1, config) and
|
||||||
@@ -481,7 +481,7 @@ private predicate jumpStep(NodeEx node1, NodeEx node2, Configuration config) {
|
|||||||
exists(Node n1, Node n2 |
|
exists(Node n1, Node n2 |
|
||||||
node1.asNode() = n1 and
|
node1.asNode() = n1 and
|
||||||
node2.asNode() = n2 and
|
node2.asNode() = n2 and
|
||||||
jumpStepCached(n1, n2) and
|
jumpStepCached(pragma[only_bind_into](n1), pragma[only_bind_into](n2)) and
|
||||||
stepFilter(node1, node2, config) and
|
stepFilter(node1, node2, config) and
|
||||||
not config.getAFeature() instanceof FeatureEqualSourceSinkCallContext
|
not config.getAFeature() instanceof FeatureEqualSourceSinkCallContext
|
||||||
)
|
)
|
||||||
@@ -494,7 +494,7 @@ private predicate additionalJumpStep(NodeEx node1, NodeEx node2, Configuration c
|
|||||||
exists(Node n1, Node n2 |
|
exists(Node n1, Node n2 |
|
||||||
node1.asNode() = n1 and
|
node1.asNode() = n1 and
|
||||||
node2.asNode() = n2 and
|
node2.asNode() = n2 and
|
||||||
config.isAdditionalFlowStep(n1, n2) and
|
config.isAdditionalFlowStep(pragma[only_bind_into](n1), pragma[only_bind_into](n2)) and
|
||||||
getNodeEnclosingCallable(n1) != getNodeEnclosingCallable(n2) and
|
getNodeEnclosingCallable(n1) != getNodeEnclosingCallable(n2) and
|
||||||
stepFilter(node1, node2, config) and
|
stepFilter(node1, node2, config) and
|
||||||
not config.getAFeature() instanceof FeatureEqualSourceSinkCallContext
|
not config.getAFeature() instanceof FeatureEqualSourceSinkCallContext
|
||||||
@@ -507,7 +507,7 @@ private predicate additionalJumpStateStep(
|
|||||||
exists(Node n1, Node n2 |
|
exists(Node n1, Node n2 |
|
||||||
node1.asNode() = n1 and
|
node1.asNode() = n1 and
|
||||||
node2.asNode() = n2 and
|
node2.asNode() = n2 and
|
||||||
config.isAdditionalFlowStep(n1, s1, n2, s2) and
|
config.isAdditionalFlowStep(pragma[only_bind_into](n1), s1, pragma[only_bind_into](n2), s2) and
|
||||||
getNodeEnclosingCallable(n1) != getNodeEnclosingCallable(n2) and
|
getNodeEnclosingCallable(n1) != getNodeEnclosingCallable(n2) and
|
||||||
stepFilter(node1, node2, config) and
|
stepFilter(node1, node2, config) and
|
||||||
not stateBarrier(node1, s1, config) and
|
not stateBarrier(node1, s1, config) and
|
||||||
@@ -518,7 +518,7 @@ private predicate additionalJumpStateStep(
|
|||||||
|
|
||||||
pragma[nomagic]
|
pragma[nomagic]
|
||||||
private predicate readSet(NodeEx node1, ContentSet c, NodeEx node2, Configuration config) {
|
private predicate readSet(NodeEx node1, ContentSet c, NodeEx node2, Configuration config) {
|
||||||
readSet(node1.asNode(), c, node2.asNode()) and
|
readSet(pragma[only_bind_into](node1.asNode()), c, pragma[only_bind_into](node2.asNode())) and
|
||||||
stepFilter(node1, node2, config)
|
stepFilter(node1, node2, config)
|
||||||
or
|
or
|
||||||
exists(Node n |
|
exists(Node n |
|
||||||
@@ -562,7 +562,8 @@ pragma[nomagic]
|
|||||||
private predicate store(
|
private predicate store(
|
||||||
NodeEx node1, TypedContent tc, NodeEx node2, DataFlowType contentType, Configuration config
|
NodeEx node1, TypedContent tc, NodeEx node2, DataFlowType contentType, Configuration config
|
||||||
) {
|
) {
|
||||||
store(node1.asNode(), tc, node2.asNode(), contentType) and
|
store(pragma[only_bind_into](node1.asNode()), tc, pragma[only_bind_into](node2.asNode()),
|
||||||
|
contentType) and
|
||||||
read(_, tc.getContent(), _, config) and
|
read(_, tc.getContent(), _, config) and
|
||||||
stepFilter(node1, node2, config)
|
stepFilter(node1, node2, config)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -428,7 +428,7 @@ private predicate localFlowStep(NodeEx node1, NodeEx node2, Configuration config
|
|||||||
exists(Node n1, Node n2 |
|
exists(Node n1, Node n2 |
|
||||||
node1.asNode() = n1 and
|
node1.asNode() = n1 and
|
||||||
node2.asNode() = n2 and
|
node2.asNode() = n2 and
|
||||||
simpleLocalFlowStepExt(n1, n2) and
|
simpleLocalFlowStepExt(pragma[only_bind_into](n1), pragma[only_bind_into](n2)) and
|
||||||
stepFilter(node1, node2, config)
|
stepFilter(node1, node2, config)
|
||||||
)
|
)
|
||||||
or
|
or
|
||||||
@@ -447,7 +447,7 @@ private predicate additionalLocalFlowStep(NodeEx node1, NodeEx node2, Configurat
|
|||||||
exists(Node n1, Node n2 |
|
exists(Node n1, Node n2 |
|
||||||
node1.asNode() = n1 and
|
node1.asNode() = n1 and
|
||||||
node2.asNode() = n2 and
|
node2.asNode() = n2 and
|
||||||
config.isAdditionalFlowStep(n1, n2) and
|
config.isAdditionalFlowStep(pragma[only_bind_into](n1), pragma[only_bind_into](n2)) and
|
||||||
getNodeEnclosingCallable(n1) = getNodeEnclosingCallable(n2) and
|
getNodeEnclosingCallable(n1) = getNodeEnclosingCallable(n2) and
|
||||||
stepFilter(node1, node2, config)
|
stepFilter(node1, node2, config)
|
||||||
)
|
)
|
||||||
@@ -466,7 +466,7 @@ private predicate additionalLocalStateStep(
|
|||||||
exists(Node n1, Node n2 |
|
exists(Node n1, Node n2 |
|
||||||
node1.asNode() = n1 and
|
node1.asNode() = n1 and
|
||||||
node2.asNode() = n2 and
|
node2.asNode() = n2 and
|
||||||
config.isAdditionalFlowStep(n1, s1, n2, s2) and
|
config.isAdditionalFlowStep(pragma[only_bind_into](n1), s1, pragma[only_bind_into](n2), s2) and
|
||||||
getNodeEnclosingCallable(n1) = getNodeEnclosingCallable(n2) and
|
getNodeEnclosingCallable(n1) = getNodeEnclosingCallable(n2) and
|
||||||
stepFilter(node1, node2, config) and
|
stepFilter(node1, node2, config) and
|
||||||
not stateBarrier(node1, s1, config) and
|
not stateBarrier(node1, s1, config) and
|
||||||
@@ -481,7 +481,7 @@ private predicate jumpStep(NodeEx node1, NodeEx node2, Configuration config) {
|
|||||||
exists(Node n1, Node n2 |
|
exists(Node n1, Node n2 |
|
||||||
node1.asNode() = n1 and
|
node1.asNode() = n1 and
|
||||||
node2.asNode() = n2 and
|
node2.asNode() = n2 and
|
||||||
jumpStepCached(n1, n2) and
|
jumpStepCached(pragma[only_bind_into](n1), pragma[only_bind_into](n2)) and
|
||||||
stepFilter(node1, node2, config) and
|
stepFilter(node1, node2, config) and
|
||||||
not config.getAFeature() instanceof FeatureEqualSourceSinkCallContext
|
not config.getAFeature() instanceof FeatureEqualSourceSinkCallContext
|
||||||
)
|
)
|
||||||
@@ -494,7 +494,7 @@ private predicate additionalJumpStep(NodeEx node1, NodeEx node2, Configuration c
|
|||||||
exists(Node n1, Node n2 |
|
exists(Node n1, Node n2 |
|
||||||
node1.asNode() = n1 and
|
node1.asNode() = n1 and
|
||||||
node2.asNode() = n2 and
|
node2.asNode() = n2 and
|
||||||
config.isAdditionalFlowStep(n1, n2) and
|
config.isAdditionalFlowStep(pragma[only_bind_into](n1), pragma[only_bind_into](n2)) and
|
||||||
getNodeEnclosingCallable(n1) != getNodeEnclosingCallable(n2) and
|
getNodeEnclosingCallable(n1) != getNodeEnclosingCallable(n2) and
|
||||||
stepFilter(node1, node2, config) and
|
stepFilter(node1, node2, config) and
|
||||||
not config.getAFeature() instanceof FeatureEqualSourceSinkCallContext
|
not config.getAFeature() instanceof FeatureEqualSourceSinkCallContext
|
||||||
@@ -507,7 +507,7 @@ private predicate additionalJumpStateStep(
|
|||||||
exists(Node n1, Node n2 |
|
exists(Node n1, Node n2 |
|
||||||
node1.asNode() = n1 and
|
node1.asNode() = n1 and
|
||||||
node2.asNode() = n2 and
|
node2.asNode() = n2 and
|
||||||
config.isAdditionalFlowStep(n1, s1, n2, s2) and
|
config.isAdditionalFlowStep(pragma[only_bind_into](n1), s1, pragma[only_bind_into](n2), s2) and
|
||||||
getNodeEnclosingCallable(n1) != getNodeEnclosingCallable(n2) and
|
getNodeEnclosingCallable(n1) != getNodeEnclosingCallable(n2) and
|
||||||
stepFilter(node1, node2, config) and
|
stepFilter(node1, node2, config) and
|
||||||
not stateBarrier(node1, s1, config) and
|
not stateBarrier(node1, s1, config) and
|
||||||
@@ -518,7 +518,7 @@ private predicate additionalJumpStateStep(
|
|||||||
|
|
||||||
pragma[nomagic]
|
pragma[nomagic]
|
||||||
private predicate readSet(NodeEx node1, ContentSet c, NodeEx node2, Configuration config) {
|
private predicate readSet(NodeEx node1, ContentSet c, NodeEx node2, Configuration config) {
|
||||||
readSet(node1.asNode(), c, node2.asNode()) and
|
readSet(pragma[only_bind_into](node1.asNode()), c, pragma[only_bind_into](node2.asNode())) and
|
||||||
stepFilter(node1, node2, config)
|
stepFilter(node1, node2, config)
|
||||||
or
|
or
|
||||||
exists(Node n |
|
exists(Node n |
|
||||||
@@ -562,7 +562,8 @@ pragma[nomagic]
|
|||||||
private predicate store(
|
private predicate store(
|
||||||
NodeEx node1, TypedContent tc, NodeEx node2, DataFlowType contentType, Configuration config
|
NodeEx node1, TypedContent tc, NodeEx node2, DataFlowType contentType, Configuration config
|
||||||
) {
|
) {
|
||||||
store(node1.asNode(), tc, node2.asNode(), contentType) and
|
store(pragma[only_bind_into](node1.asNode()), tc, pragma[only_bind_into](node2.asNode()),
|
||||||
|
contentType) and
|
||||||
read(_, tc.getContent(), _, config) and
|
read(_, tc.getContent(), _, config) and
|
||||||
stepFilter(node1, node2, config)
|
stepFilter(node1, node2, config)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -428,7 +428,7 @@ private predicate localFlowStep(NodeEx node1, NodeEx node2, Configuration config
|
|||||||
exists(Node n1, Node n2 |
|
exists(Node n1, Node n2 |
|
||||||
node1.asNode() = n1 and
|
node1.asNode() = n1 and
|
||||||
node2.asNode() = n2 and
|
node2.asNode() = n2 and
|
||||||
simpleLocalFlowStepExt(n1, n2) and
|
simpleLocalFlowStepExt(pragma[only_bind_into](n1), pragma[only_bind_into](n2)) and
|
||||||
stepFilter(node1, node2, config)
|
stepFilter(node1, node2, config)
|
||||||
)
|
)
|
||||||
or
|
or
|
||||||
@@ -447,7 +447,7 @@ private predicate additionalLocalFlowStep(NodeEx node1, NodeEx node2, Configurat
|
|||||||
exists(Node n1, Node n2 |
|
exists(Node n1, Node n2 |
|
||||||
node1.asNode() = n1 and
|
node1.asNode() = n1 and
|
||||||
node2.asNode() = n2 and
|
node2.asNode() = n2 and
|
||||||
config.isAdditionalFlowStep(n1, n2) and
|
config.isAdditionalFlowStep(pragma[only_bind_into](n1), pragma[only_bind_into](n2)) and
|
||||||
getNodeEnclosingCallable(n1) = getNodeEnclosingCallable(n2) and
|
getNodeEnclosingCallable(n1) = getNodeEnclosingCallable(n2) and
|
||||||
stepFilter(node1, node2, config)
|
stepFilter(node1, node2, config)
|
||||||
)
|
)
|
||||||
@@ -466,7 +466,7 @@ private predicate additionalLocalStateStep(
|
|||||||
exists(Node n1, Node n2 |
|
exists(Node n1, Node n2 |
|
||||||
node1.asNode() = n1 and
|
node1.asNode() = n1 and
|
||||||
node2.asNode() = n2 and
|
node2.asNode() = n2 and
|
||||||
config.isAdditionalFlowStep(n1, s1, n2, s2) and
|
config.isAdditionalFlowStep(pragma[only_bind_into](n1), s1, pragma[only_bind_into](n2), s2) and
|
||||||
getNodeEnclosingCallable(n1) = getNodeEnclosingCallable(n2) and
|
getNodeEnclosingCallable(n1) = getNodeEnclosingCallable(n2) and
|
||||||
stepFilter(node1, node2, config) and
|
stepFilter(node1, node2, config) and
|
||||||
not stateBarrier(node1, s1, config) and
|
not stateBarrier(node1, s1, config) and
|
||||||
@@ -481,7 +481,7 @@ private predicate jumpStep(NodeEx node1, NodeEx node2, Configuration config) {
|
|||||||
exists(Node n1, Node n2 |
|
exists(Node n1, Node n2 |
|
||||||
node1.asNode() = n1 and
|
node1.asNode() = n1 and
|
||||||
node2.asNode() = n2 and
|
node2.asNode() = n2 and
|
||||||
jumpStepCached(n1, n2) and
|
jumpStepCached(pragma[only_bind_into](n1), pragma[only_bind_into](n2)) and
|
||||||
stepFilter(node1, node2, config) and
|
stepFilter(node1, node2, config) and
|
||||||
not config.getAFeature() instanceof FeatureEqualSourceSinkCallContext
|
not config.getAFeature() instanceof FeatureEqualSourceSinkCallContext
|
||||||
)
|
)
|
||||||
@@ -494,7 +494,7 @@ private predicate additionalJumpStep(NodeEx node1, NodeEx node2, Configuration c
|
|||||||
exists(Node n1, Node n2 |
|
exists(Node n1, Node n2 |
|
||||||
node1.asNode() = n1 and
|
node1.asNode() = n1 and
|
||||||
node2.asNode() = n2 and
|
node2.asNode() = n2 and
|
||||||
config.isAdditionalFlowStep(n1, n2) and
|
config.isAdditionalFlowStep(pragma[only_bind_into](n1), pragma[only_bind_into](n2)) and
|
||||||
getNodeEnclosingCallable(n1) != getNodeEnclosingCallable(n2) and
|
getNodeEnclosingCallable(n1) != getNodeEnclosingCallable(n2) and
|
||||||
stepFilter(node1, node2, config) and
|
stepFilter(node1, node2, config) and
|
||||||
not config.getAFeature() instanceof FeatureEqualSourceSinkCallContext
|
not config.getAFeature() instanceof FeatureEqualSourceSinkCallContext
|
||||||
@@ -507,7 +507,7 @@ private predicate additionalJumpStateStep(
|
|||||||
exists(Node n1, Node n2 |
|
exists(Node n1, Node n2 |
|
||||||
node1.asNode() = n1 and
|
node1.asNode() = n1 and
|
||||||
node2.asNode() = n2 and
|
node2.asNode() = n2 and
|
||||||
config.isAdditionalFlowStep(n1, s1, n2, s2) and
|
config.isAdditionalFlowStep(pragma[only_bind_into](n1), s1, pragma[only_bind_into](n2), s2) and
|
||||||
getNodeEnclosingCallable(n1) != getNodeEnclosingCallable(n2) and
|
getNodeEnclosingCallable(n1) != getNodeEnclosingCallable(n2) and
|
||||||
stepFilter(node1, node2, config) and
|
stepFilter(node1, node2, config) and
|
||||||
not stateBarrier(node1, s1, config) and
|
not stateBarrier(node1, s1, config) and
|
||||||
@@ -518,7 +518,7 @@ private predicate additionalJumpStateStep(
|
|||||||
|
|
||||||
pragma[nomagic]
|
pragma[nomagic]
|
||||||
private predicate readSet(NodeEx node1, ContentSet c, NodeEx node2, Configuration config) {
|
private predicate readSet(NodeEx node1, ContentSet c, NodeEx node2, Configuration config) {
|
||||||
readSet(node1.asNode(), c, node2.asNode()) and
|
readSet(pragma[only_bind_into](node1.asNode()), c, pragma[only_bind_into](node2.asNode())) and
|
||||||
stepFilter(node1, node2, config)
|
stepFilter(node1, node2, config)
|
||||||
or
|
or
|
||||||
exists(Node n |
|
exists(Node n |
|
||||||
@@ -562,7 +562,8 @@ pragma[nomagic]
|
|||||||
private predicate store(
|
private predicate store(
|
||||||
NodeEx node1, TypedContent tc, NodeEx node2, DataFlowType contentType, Configuration config
|
NodeEx node1, TypedContent tc, NodeEx node2, DataFlowType contentType, Configuration config
|
||||||
) {
|
) {
|
||||||
store(node1.asNode(), tc, node2.asNode(), contentType) and
|
store(pragma[only_bind_into](node1.asNode()), tc, pragma[only_bind_into](node2.asNode()),
|
||||||
|
contentType) and
|
||||||
read(_, tc.getContent(), _, config) and
|
read(_, tc.getContent(), _, config) and
|
||||||
stepFilter(node1, node2, config)
|
stepFilter(node1, node2, config)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -428,7 +428,7 @@ private predicate localFlowStep(NodeEx node1, NodeEx node2, Configuration config
|
|||||||
exists(Node n1, Node n2 |
|
exists(Node n1, Node n2 |
|
||||||
node1.asNode() = n1 and
|
node1.asNode() = n1 and
|
||||||
node2.asNode() = n2 and
|
node2.asNode() = n2 and
|
||||||
simpleLocalFlowStepExt(n1, n2) and
|
simpleLocalFlowStepExt(pragma[only_bind_into](n1), pragma[only_bind_into](n2)) and
|
||||||
stepFilter(node1, node2, config)
|
stepFilter(node1, node2, config)
|
||||||
)
|
)
|
||||||
or
|
or
|
||||||
@@ -447,7 +447,7 @@ private predicate additionalLocalFlowStep(NodeEx node1, NodeEx node2, Configurat
|
|||||||
exists(Node n1, Node n2 |
|
exists(Node n1, Node n2 |
|
||||||
node1.asNode() = n1 and
|
node1.asNode() = n1 and
|
||||||
node2.asNode() = n2 and
|
node2.asNode() = n2 and
|
||||||
config.isAdditionalFlowStep(n1, n2) and
|
config.isAdditionalFlowStep(pragma[only_bind_into](n1), pragma[only_bind_into](n2)) and
|
||||||
getNodeEnclosingCallable(n1) = getNodeEnclosingCallable(n2) and
|
getNodeEnclosingCallable(n1) = getNodeEnclosingCallable(n2) and
|
||||||
stepFilter(node1, node2, config)
|
stepFilter(node1, node2, config)
|
||||||
)
|
)
|
||||||
@@ -466,7 +466,7 @@ private predicate additionalLocalStateStep(
|
|||||||
exists(Node n1, Node n2 |
|
exists(Node n1, Node n2 |
|
||||||
node1.asNode() = n1 and
|
node1.asNode() = n1 and
|
||||||
node2.asNode() = n2 and
|
node2.asNode() = n2 and
|
||||||
config.isAdditionalFlowStep(n1, s1, n2, s2) and
|
config.isAdditionalFlowStep(pragma[only_bind_into](n1), s1, pragma[only_bind_into](n2), s2) and
|
||||||
getNodeEnclosingCallable(n1) = getNodeEnclosingCallable(n2) and
|
getNodeEnclosingCallable(n1) = getNodeEnclosingCallable(n2) and
|
||||||
stepFilter(node1, node2, config) and
|
stepFilter(node1, node2, config) and
|
||||||
not stateBarrier(node1, s1, config) and
|
not stateBarrier(node1, s1, config) and
|
||||||
@@ -481,7 +481,7 @@ private predicate jumpStep(NodeEx node1, NodeEx node2, Configuration config) {
|
|||||||
exists(Node n1, Node n2 |
|
exists(Node n1, Node n2 |
|
||||||
node1.asNode() = n1 and
|
node1.asNode() = n1 and
|
||||||
node2.asNode() = n2 and
|
node2.asNode() = n2 and
|
||||||
jumpStepCached(n1, n2) and
|
jumpStepCached(pragma[only_bind_into](n1), pragma[only_bind_into](n2)) and
|
||||||
stepFilter(node1, node2, config) and
|
stepFilter(node1, node2, config) and
|
||||||
not config.getAFeature() instanceof FeatureEqualSourceSinkCallContext
|
not config.getAFeature() instanceof FeatureEqualSourceSinkCallContext
|
||||||
)
|
)
|
||||||
@@ -494,7 +494,7 @@ private predicate additionalJumpStep(NodeEx node1, NodeEx node2, Configuration c
|
|||||||
exists(Node n1, Node n2 |
|
exists(Node n1, Node n2 |
|
||||||
node1.asNode() = n1 and
|
node1.asNode() = n1 and
|
||||||
node2.asNode() = n2 and
|
node2.asNode() = n2 and
|
||||||
config.isAdditionalFlowStep(n1, n2) and
|
config.isAdditionalFlowStep(pragma[only_bind_into](n1), pragma[only_bind_into](n2)) and
|
||||||
getNodeEnclosingCallable(n1) != getNodeEnclosingCallable(n2) and
|
getNodeEnclosingCallable(n1) != getNodeEnclosingCallable(n2) and
|
||||||
stepFilter(node1, node2, config) and
|
stepFilter(node1, node2, config) and
|
||||||
not config.getAFeature() instanceof FeatureEqualSourceSinkCallContext
|
not config.getAFeature() instanceof FeatureEqualSourceSinkCallContext
|
||||||
@@ -507,7 +507,7 @@ private predicate additionalJumpStateStep(
|
|||||||
exists(Node n1, Node n2 |
|
exists(Node n1, Node n2 |
|
||||||
node1.asNode() = n1 and
|
node1.asNode() = n1 and
|
||||||
node2.asNode() = n2 and
|
node2.asNode() = n2 and
|
||||||
config.isAdditionalFlowStep(n1, s1, n2, s2) and
|
config.isAdditionalFlowStep(pragma[only_bind_into](n1), s1, pragma[only_bind_into](n2), s2) and
|
||||||
getNodeEnclosingCallable(n1) != getNodeEnclosingCallable(n2) and
|
getNodeEnclosingCallable(n1) != getNodeEnclosingCallable(n2) and
|
||||||
stepFilter(node1, node2, config) and
|
stepFilter(node1, node2, config) and
|
||||||
not stateBarrier(node1, s1, config) and
|
not stateBarrier(node1, s1, config) and
|
||||||
@@ -518,7 +518,7 @@ private predicate additionalJumpStateStep(
|
|||||||
|
|
||||||
pragma[nomagic]
|
pragma[nomagic]
|
||||||
private predicate readSet(NodeEx node1, ContentSet c, NodeEx node2, Configuration config) {
|
private predicate readSet(NodeEx node1, ContentSet c, NodeEx node2, Configuration config) {
|
||||||
readSet(node1.asNode(), c, node2.asNode()) and
|
readSet(pragma[only_bind_into](node1.asNode()), c, pragma[only_bind_into](node2.asNode())) and
|
||||||
stepFilter(node1, node2, config)
|
stepFilter(node1, node2, config)
|
||||||
or
|
or
|
||||||
exists(Node n |
|
exists(Node n |
|
||||||
@@ -562,7 +562,8 @@ pragma[nomagic]
|
|||||||
private predicate store(
|
private predicate store(
|
||||||
NodeEx node1, TypedContent tc, NodeEx node2, DataFlowType contentType, Configuration config
|
NodeEx node1, TypedContent tc, NodeEx node2, DataFlowType contentType, Configuration config
|
||||||
) {
|
) {
|
||||||
store(node1.asNode(), tc, node2.asNode(), contentType) and
|
store(pragma[only_bind_into](node1.asNode()), tc, pragma[only_bind_into](node2.asNode()),
|
||||||
|
contentType) and
|
||||||
read(_, tc.getContent(), _, config) and
|
read(_, tc.getContent(), _, config) and
|
||||||
stepFilter(node1, node2, config)
|
stepFilter(node1, node2, config)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -428,7 +428,7 @@ private predicate localFlowStep(NodeEx node1, NodeEx node2, Configuration config
|
|||||||
exists(Node n1, Node n2 |
|
exists(Node n1, Node n2 |
|
||||||
node1.asNode() = n1 and
|
node1.asNode() = n1 and
|
||||||
node2.asNode() = n2 and
|
node2.asNode() = n2 and
|
||||||
simpleLocalFlowStepExt(n1, n2) and
|
simpleLocalFlowStepExt(pragma[only_bind_into](n1), pragma[only_bind_into](n2)) and
|
||||||
stepFilter(node1, node2, config)
|
stepFilter(node1, node2, config)
|
||||||
)
|
)
|
||||||
or
|
or
|
||||||
@@ -447,7 +447,7 @@ private predicate additionalLocalFlowStep(NodeEx node1, NodeEx node2, Configurat
|
|||||||
exists(Node n1, Node n2 |
|
exists(Node n1, Node n2 |
|
||||||
node1.asNode() = n1 and
|
node1.asNode() = n1 and
|
||||||
node2.asNode() = n2 and
|
node2.asNode() = n2 and
|
||||||
config.isAdditionalFlowStep(n1, n2) and
|
config.isAdditionalFlowStep(pragma[only_bind_into](n1), pragma[only_bind_into](n2)) and
|
||||||
getNodeEnclosingCallable(n1) = getNodeEnclosingCallable(n2) and
|
getNodeEnclosingCallable(n1) = getNodeEnclosingCallable(n2) and
|
||||||
stepFilter(node1, node2, config)
|
stepFilter(node1, node2, config)
|
||||||
)
|
)
|
||||||
@@ -466,7 +466,7 @@ private predicate additionalLocalStateStep(
|
|||||||
exists(Node n1, Node n2 |
|
exists(Node n1, Node n2 |
|
||||||
node1.asNode() = n1 and
|
node1.asNode() = n1 and
|
||||||
node2.asNode() = n2 and
|
node2.asNode() = n2 and
|
||||||
config.isAdditionalFlowStep(n1, s1, n2, s2) and
|
config.isAdditionalFlowStep(pragma[only_bind_into](n1), s1, pragma[only_bind_into](n2), s2) and
|
||||||
getNodeEnclosingCallable(n1) = getNodeEnclosingCallable(n2) and
|
getNodeEnclosingCallable(n1) = getNodeEnclosingCallable(n2) and
|
||||||
stepFilter(node1, node2, config) and
|
stepFilter(node1, node2, config) and
|
||||||
not stateBarrier(node1, s1, config) and
|
not stateBarrier(node1, s1, config) and
|
||||||
@@ -481,7 +481,7 @@ private predicate jumpStep(NodeEx node1, NodeEx node2, Configuration config) {
|
|||||||
exists(Node n1, Node n2 |
|
exists(Node n1, Node n2 |
|
||||||
node1.asNode() = n1 and
|
node1.asNode() = n1 and
|
||||||
node2.asNode() = n2 and
|
node2.asNode() = n2 and
|
||||||
jumpStepCached(n1, n2) and
|
jumpStepCached(pragma[only_bind_into](n1), pragma[only_bind_into](n2)) and
|
||||||
stepFilter(node1, node2, config) and
|
stepFilter(node1, node2, config) and
|
||||||
not config.getAFeature() instanceof FeatureEqualSourceSinkCallContext
|
not config.getAFeature() instanceof FeatureEqualSourceSinkCallContext
|
||||||
)
|
)
|
||||||
@@ -494,7 +494,7 @@ private predicate additionalJumpStep(NodeEx node1, NodeEx node2, Configuration c
|
|||||||
exists(Node n1, Node n2 |
|
exists(Node n1, Node n2 |
|
||||||
node1.asNode() = n1 and
|
node1.asNode() = n1 and
|
||||||
node2.asNode() = n2 and
|
node2.asNode() = n2 and
|
||||||
config.isAdditionalFlowStep(n1, n2) and
|
config.isAdditionalFlowStep(pragma[only_bind_into](n1), pragma[only_bind_into](n2)) and
|
||||||
getNodeEnclosingCallable(n1) != getNodeEnclosingCallable(n2) and
|
getNodeEnclosingCallable(n1) != getNodeEnclosingCallable(n2) and
|
||||||
stepFilter(node1, node2, config) and
|
stepFilter(node1, node2, config) and
|
||||||
not config.getAFeature() instanceof FeatureEqualSourceSinkCallContext
|
not config.getAFeature() instanceof FeatureEqualSourceSinkCallContext
|
||||||
@@ -507,7 +507,7 @@ private predicate additionalJumpStateStep(
|
|||||||
exists(Node n1, Node n2 |
|
exists(Node n1, Node n2 |
|
||||||
node1.asNode() = n1 and
|
node1.asNode() = n1 and
|
||||||
node2.asNode() = n2 and
|
node2.asNode() = n2 and
|
||||||
config.isAdditionalFlowStep(n1, s1, n2, s2) and
|
config.isAdditionalFlowStep(pragma[only_bind_into](n1), s1, pragma[only_bind_into](n2), s2) and
|
||||||
getNodeEnclosingCallable(n1) != getNodeEnclosingCallable(n2) and
|
getNodeEnclosingCallable(n1) != getNodeEnclosingCallable(n2) and
|
||||||
stepFilter(node1, node2, config) and
|
stepFilter(node1, node2, config) and
|
||||||
not stateBarrier(node1, s1, config) and
|
not stateBarrier(node1, s1, config) and
|
||||||
@@ -518,7 +518,7 @@ private predicate additionalJumpStateStep(
|
|||||||
|
|
||||||
pragma[nomagic]
|
pragma[nomagic]
|
||||||
private predicate readSet(NodeEx node1, ContentSet c, NodeEx node2, Configuration config) {
|
private predicate readSet(NodeEx node1, ContentSet c, NodeEx node2, Configuration config) {
|
||||||
readSet(node1.asNode(), c, node2.asNode()) and
|
readSet(pragma[only_bind_into](node1.asNode()), c, pragma[only_bind_into](node2.asNode())) and
|
||||||
stepFilter(node1, node2, config)
|
stepFilter(node1, node2, config)
|
||||||
or
|
or
|
||||||
exists(Node n |
|
exists(Node n |
|
||||||
@@ -562,7 +562,8 @@ pragma[nomagic]
|
|||||||
private predicate store(
|
private predicate store(
|
||||||
NodeEx node1, TypedContent tc, NodeEx node2, DataFlowType contentType, Configuration config
|
NodeEx node1, TypedContent tc, NodeEx node2, DataFlowType contentType, Configuration config
|
||||||
) {
|
) {
|
||||||
store(node1.asNode(), tc, node2.asNode(), contentType) and
|
store(pragma[only_bind_into](node1.asNode()), tc, pragma[only_bind_into](node2.asNode()),
|
||||||
|
contentType) and
|
||||||
read(_, tc.getContent(), _, config) and
|
read(_, tc.getContent(), _, config) and
|
||||||
stepFilter(node1, node2, config)
|
stepFilter(node1, node2, config)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -428,7 +428,7 @@ private predicate localFlowStep(NodeEx node1, NodeEx node2, Configuration config
|
|||||||
exists(Node n1, Node n2 |
|
exists(Node n1, Node n2 |
|
||||||
node1.asNode() = n1 and
|
node1.asNode() = n1 and
|
||||||
node2.asNode() = n2 and
|
node2.asNode() = n2 and
|
||||||
simpleLocalFlowStepExt(n1, n2) and
|
simpleLocalFlowStepExt(pragma[only_bind_into](n1), pragma[only_bind_into](n2)) and
|
||||||
stepFilter(node1, node2, config)
|
stepFilter(node1, node2, config)
|
||||||
)
|
)
|
||||||
or
|
or
|
||||||
@@ -447,7 +447,7 @@ private predicate additionalLocalFlowStep(NodeEx node1, NodeEx node2, Configurat
|
|||||||
exists(Node n1, Node n2 |
|
exists(Node n1, Node n2 |
|
||||||
node1.asNode() = n1 and
|
node1.asNode() = n1 and
|
||||||
node2.asNode() = n2 and
|
node2.asNode() = n2 and
|
||||||
config.isAdditionalFlowStep(n1, n2) and
|
config.isAdditionalFlowStep(pragma[only_bind_into](n1), pragma[only_bind_into](n2)) and
|
||||||
getNodeEnclosingCallable(n1) = getNodeEnclosingCallable(n2) and
|
getNodeEnclosingCallable(n1) = getNodeEnclosingCallable(n2) and
|
||||||
stepFilter(node1, node2, config)
|
stepFilter(node1, node2, config)
|
||||||
)
|
)
|
||||||
@@ -466,7 +466,7 @@ private predicate additionalLocalStateStep(
|
|||||||
exists(Node n1, Node n2 |
|
exists(Node n1, Node n2 |
|
||||||
node1.asNode() = n1 and
|
node1.asNode() = n1 and
|
||||||
node2.asNode() = n2 and
|
node2.asNode() = n2 and
|
||||||
config.isAdditionalFlowStep(n1, s1, n2, s2) and
|
config.isAdditionalFlowStep(pragma[only_bind_into](n1), s1, pragma[only_bind_into](n2), s2) and
|
||||||
getNodeEnclosingCallable(n1) = getNodeEnclosingCallable(n2) and
|
getNodeEnclosingCallable(n1) = getNodeEnclosingCallable(n2) and
|
||||||
stepFilter(node1, node2, config) and
|
stepFilter(node1, node2, config) and
|
||||||
not stateBarrier(node1, s1, config) and
|
not stateBarrier(node1, s1, config) and
|
||||||
@@ -481,7 +481,7 @@ private predicate jumpStep(NodeEx node1, NodeEx node2, Configuration config) {
|
|||||||
exists(Node n1, Node n2 |
|
exists(Node n1, Node n2 |
|
||||||
node1.asNode() = n1 and
|
node1.asNode() = n1 and
|
||||||
node2.asNode() = n2 and
|
node2.asNode() = n2 and
|
||||||
jumpStepCached(n1, n2) and
|
jumpStepCached(pragma[only_bind_into](n1), pragma[only_bind_into](n2)) and
|
||||||
stepFilter(node1, node2, config) and
|
stepFilter(node1, node2, config) and
|
||||||
not config.getAFeature() instanceof FeatureEqualSourceSinkCallContext
|
not config.getAFeature() instanceof FeatureEqualSourceSinkCallContext
|
||||||
)
|
)
|
||||||
@@ -494,7 +494,7 @@ private predicate additionalJumpStep(NodeEx node1, NodeEx node2, Configuration c
|
|||||||
exists(Node n1, Node n2 |
|
exists(Node n1, Node n2 |
|
||||||
node1.asNode() = n1 and
|
node1.asNode() = n1 and
|
||||||
node2.asNode() = n2 and
|
node2.asNode() = n2 and
|
||||||
config.isAdditionalFlowStep(n1, n2) and
|
config.isAdditionalFlowStep(pragma[only_bind_into](n1), pragma[only_bind_into](n2)) and
|
||||||
getNodeEnclosingCallable(n1) != getNodeEnclosingCallable(n2) and
|
getNodeEnclosingCallable(n1) != getNodeEnclosingCallable(n2) and
|
||||||
stepFilter(node1, node2, config) and
|
stepFilter(node1, node2, config) and
|
||||||
not config.getAFeature() instanceof FeatureEqualSourceSinkCallContext
|
not config.getAFeature() instanceof FeatureEqualSourceSinkCallContext
|
||||||
@@ -507,7 +507,7 @@ private predicate additionalJumpStateStep(
|
|||||||
exists(Node n1, Node n2 |
|
exists(Node n1, Node n2 |
|
||||||
node1.asNode() = n1 and
|
node1.asNode() = n1 and
|
||||||
node2.asNode() = n2 and
|
node2.asNode() = n2 and
|
||||||
config.isAdditionalFlowStep(n1, s1, n2, s2) and
|
config.isAdditionalFlowStep(pragma[only_bind_into](n1), s1, pragma[only_bind_into](n2), s2) and
|
||||||
getNodeEnclosingCallable(n1) != getNodeEnclosingCallable(n2) and
|
getNodeEnclosingCallable(n1) != getNodeEnclosingCallable(n2) and
|
||||||
stepFilter(node1, node2, config) and
|
stepFilter(node1, node2, config) and
|
||||||
not stateBarrier(node1, s1, config) and
|
not stateBarrier(node1, s1, config) and
|
||||||
@@ -518,7 +518,7 @@ private predicate additionalJumpStateStep(
|
|||||||
|
|
||||||
pragma[nomagic]
|
pragma[nomagic]
|
||||||
private predicate readSet(NodeEx node1, ContentSet c, NodeEx node2, Configuration config) {
|
private predicate readSet(NodeEx node1, ContentSet c, NodeEx node2, Configuration config) {
|
||||||
readSet(node1.asNode(), c, node2.asNode()) and
|
readSet(pragma[only_bind_into](node1.asNode()), c, pragma[only_bind_into](node2.asNode())) and
|
||||||
stepFilter(node1, node2, config)
|
stepFilter(node1, node2, config)
|
||||||
or
|
or
|
||||||
exists(Node n |
|
exists(Node n |
|
||||||
@@ -562,7 +562,8 @@ pragma[nomagic]
|
|||||||
private predicate store(
|
private predicate store(
|
||||||
NodeEx node1, TypedContent tc, NodeEx node2, DataFlowType contentType, Configuration config
|
NodeEx node1, TypedContent tc, NodeEx node2, DataFlowType contentType, Configuration config
|
||||||
) {
|
) {
|
||||||
store(node1.asNode(), tc, node2.asNode(), contentType) and
|
store(pragma[only_bind_into](node1.asNode()), tc, pragma[only_bind_into](node2.asNode()),
|
||||||
|
contentType) and
|
||||||
read(_, tc.getContent(), _, config) and
|
read(_, tc.getContent(), _, config) and
|
||||||
stepFilter(node1, node2, config)
|
stepFilter(node1, node2, config)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,3 +1,5 @@
|
|||||||
|
## 0.2.0
|
||||||
|
|
||||||
## 0.1.4
|
## 0.1.4
|
||||||
|
|
||||||
## 0.1.3
|
## 0.1.3
|
||||||
|
|||||||
@@ -18,7 +18,7 @@ import semmle.code.cpp.ir.IR
|
|||||||
import semmle.code.cpp.ir.dataflow.MustFlow
|
import semmle.code.cpp.ir.dataflow.MustFlow
|
||||||
import PathGraph
|
import PathGraph
|
||||||
|
|
||||||
/** Holds if `f` has a name that we intrepret as evidence of intentionally returning the value of the stack pointer. */
|
/** Holds if `f` has a name that we interpret as evidence of intentionally returning the value of the stack pointer. */
|
||||||
predicate intentionallyReturnsStackPointer(Function f) {
|
predicate intentionallyReturnsStackPointer(Function f) {
|
||||||
f.getName().toLowerCase().matches(["%stack%", "%sp%"])
|
f.getName().toLowerCase().matches(["%stack%", "%sp%"])
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -133,7 +133,9 @@ TGlobalAddress globalAddress(Instruction instr) {
|
|||||||
)
|
)
|
||||||
or
|
or
|
||||||
exists(FieldAddressInstruction fai | instr = fai |
|
exists(FieldAddressInstruction fai | instr = fai |
|
||||||
result = TFieldAddress(globalAddress(fai.getObjectAddress()), fai.getField())
|
result =
|
||||||
|
TFieldAddress(globalAddress(pragma[only_bind_into](fai.getObjectAddress())),
|
||||||
|
pragma[only_bind_out](fai.getField()))
|
||||||
)
|
)
|
||||||
or
|
or
|
||||||
result = globalAddress(instr.(PointerOffsetInstruction).getLeft())
|
result = globalAddress(instr.(PointerOffsetInstruction).getLeft())
|
||||||
|
|||||||
@@ -0,0 +1,4 @@
|
|||||||
|
---
|
||||||
|
category: breaking
|
||||||
|
---
|
||||||
|
* Contextual queries and the query libraries they depend on have been moved to the `codeql/cpp-all` package.
|
||||||
1
cpp/ql/src/change-notes/released/0.2.0.md
Normal file
1
cpp/ql/src/change-notes/released/0.2.0.md
Normal file
@@ -0,0 +1 @@
|
|||||||
|
## 0.2.0
|
||||||
@@ -1,2 +1,2 @@
|
|||||||
---
|
---
|
||||||
lastReleaseVersion: 0.1.4
|
lastReleaseVersion: 0.2.0
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
name: codeql/cpp-queries
|
name: codeql/cpp-queries
|
||||||
version: 0.2.0-dev
|
version: 0.2.1-dev
|
||||||
groups:
|
groups:
|
||||||
- cpp
|
- cpp
|
||||||
- queries
|
- queries
|
||||||
|
|||||||
@@ -1,3 +1,5 @@
|
|||||||
|
## 1.2.0
|
||||||
|
|
||||||
## 1.1.4
|
## 1.1.4
|
||||||
|
|
||||||
## 1.1.3
|
## 1.1.3
|
||||||
|
|||||||
@@ -0,0 +1 @@
|
|||||||
|
## 1.2.0
|
||||||
@@ -1,2 +1,2 @@
|
|||||||
---
|
---
|
||||||
lastReleaseVersion: 1.1.4
|
lastReleaseVersion: 1.2.0
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
name: codeql/csharp-solorigate-all
|
name: codeql/csharp-solorigate-all
|
||||||
version: 1.2.0-dev
|
version: 1.2.1-dev
|
||||||
groups:
|
groups:
|
||||||
- csharp
|
- csharp
|
||||||
- solorigate
|
- solorigate
|
||||||
|
|||||||
@@ -1,3 +1,5 @@
|
|||||||
|
## 1.2.0
|
||||||
|
|
||||||
## 1.1.4
|
## 1.1.4
|
||||||
|
|
||||||
## 1.1.3
|
## 1.1.3
|
||||||
|
|||||||
@@ -0,0 +1 @@
|
|||||||
|
## 1.2.0
|
||||||
@@ -1,2 +1,2 @@
|
|||||||
---
|
---
|
||||||
lastReleaseVersion: 1.1.4
|
lastReleaseVersion: 1.2.0
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
name: codeql/csharp-solorigate-queries
|
name: codeql/csharp-solorigate-queries
|
||||||
version: 1.2.0-dev
|
version: 1.2.1-dev
|
||||||
groups:
|
groups:
|
||||||
- csharp
|
- csharp
|
||||||
- solorigate
|
- solorigate
|
||||||
|
|||||||
@@ -1,3 +1,9 @@
|
|||||||
|
## 0.3.0
|
||||||
|
|
||||||
|
### Deprecated APIs
|
||||||
|
|
||||||
|
* The `BarrierGuard` class has been deprecated. Such barriers and sanitizers can now instead be created using the new `BarrierGuard` parameterized module.
|
||||||
|
|
||||||
## 0.2.3
|
## 0.2.3
|
||||||
|
|
||||||
## 0.2.2
|
## 0.2.2
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
---
|
## 0.3.0
|
||||||
category: deprecated
|
|
||||||
---
|
### Deprecated APIs
|
||||||
|
|
||||||
* The `BarrierGuard` class has been deprecated. Such barriers and sanitizers can now instead be created using the new `BarrierGuard` parameterized module.
|
* The `BarrierGuard` class has been deprecated. Such barriers and sanitizers can now instead be created using the new `BarrierGuard` parameterized module.
|
||||||
@@ -1,2 +1,2 @@
|
|||||||
---
|
---
|
||||||
lastReleaseVersion: 0.2.3
|
lastReleaseVersion: 0.3.0
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
name: codeql/csharp-all
|
name: codeql/csharp-all
|
||||||
version: 0.3.0-dev
|
version: 0.3.1-dev
|
||||||
groups: csharp
|
groups: csharp
|
||||||
dbscheme: semmlecode.csharp.dbscheme
|
dbscheme: semmlecode.csharp.dbscheme
|
||||||
extractor: csharp
|
extractor: csharp
|
||||||
|
|||||||
@@ -428,7 +428,7 @@ private predicate localFlowStep(NodeEx node1, NodeEx node2, Configuration config
|
|||||||
exists(Node n1, Node n2 |
|
exists(Node n1, Node n2 |
|
||||||
node1.asNode() = n1 and
|
node1.asNode() = n1 and
|
||||||
node2.asNode() = n2 and
|
node2.asNode() = n2 and
|
||||||
simpleLocalFlowStepExt(n1, n2) and
|
simpleLocalFlowStepExt(pragma[only_bind_into](n1), pragma[only_bind_into](n2)) and
|
||||||
stepFilter(node1, node2, config)
|
stepFilter(node1, node2, config)
|
||||||
)
|
)
|
||||||
or
|
or
|
||||||
@@ -447,7 +447,7 @@ private predicate additionalLocalFlowStep(NodeEx node1, NodeEx node2, Configurat
|
|||||||
exists(Node n1, Node n2 |
|
exists(Node n1, Node n2 |
|
||||||
node1.asNode() = n1 and
|
node1.asNode() = n1 and
|
||||||
node2.asNode() = n2 and
|
node2.asNode() = n2 and
|
||||||
config.isAdditionalFlowStep(n1, n2) and
|
config.isAdditionalFlowStep(pragma[only_bind_into](n1), pragma[only_bind_into](n2)) and
|
||||||
getNodeEnclosingCallable(n1) = getNodeEnclosingCallable(n2) and
|
getNodeEnclosingCallable(n1) = getNodeEnclosingCallable(n2) and
|
||||||
stepFilter(node1, node2, config)
|
stepFilter(node1, node2, config)
|
||||||
)
|
)
|
||||||
@@ -466,7 +466,7 @@ private predicate additionalLocalStateStep(
|
|||||||
exists(Node n1, Node n2 |
|
exists(Node n1, Node n2 |
|
||||||
node1.asNode() = n1 and
|
node1.asNode() = n1 and
|
||||||
node2.asNode() = n2 and
|
node2.asNode() = n2 and
|
||||||
config.isAdditionalFlowStep(n1, s1, n2, s2) and
|
config.isAdditionalFlowStep(pragma[only_bind_into](n1), s1, pragma[only_bind_into](n2), s2) and
|
||||||
getNodeEnclosingCallable(n1) = getNodeEnclosingCallable(n2) and
|
getNodeEnclosingCallable(n1) = getNodeEnclosingCallable(n2) and
|
||||||
stepFilter(node1, node2, config) and
|
stepFilter(node1, node2, config) and
|
||||||
not stateBarrier(node1, s1, config) and
|
not stateBarrier(node1, s1, config) and
|
||||||
@@ -481,7 +481,7 @@ private predicate jumpStep(NodeEx node1, NodeEx node2, Configuration config) {
|
|||||||
exists(Node n1, Node n2 |
|
exists(Node n1, Node n2 |
|
||||||
node1.asNode() = n1 and
|
node1.asNode() = n1 and
|
||||||
node2.asNode() = n2 and
|
node2.asNode() = n2 and
|
||||||
jumpStepCached(n1, n2) and
|
jumpStepCached(pragma[only_bind_into](n1), pragma[only_bind_into](n2)) and
|
||||||
stepFilter(node1, node2, config) and
|
stepFilter(node1, node2, config) and
|
||||||
not config.getAFeature() instanceof FeatureEqualSourceSinkCallContext
|
not config.getAFeature() instanceof FeatureEqualSourceSinkCallContext
|
||||||
)
|
)
|
||||||
@@ -494,7 +494,7 @@ private predicate additionalJumpStep(NodeEx node1, NodeEx node2, Configuration c
|
|||||||
exists(Node n1, Node n2 |
|
exists(Node n1, Node n2 |
|
||||||
node1.asNode() = n1 and
|
node1.asNode() = n1 and
|
||||||
node2.asNode() = n2 and
|
node2.asNode() = n2 and
|
||||||
config.isAdditionalFlowStep(n1, n2) and
|
config.isAdditionalFlowStep(pragma[only_bind_into](n1), pragma[only_bind_into](n2)) and
|
||||||
getNodeEnclosingCallable(n1) != getNodeEnclosingCallable(n2) and
|
getNodeEnclosingCallable(n1) != getNodeEnclosingCallable(n2) and
|
||||||
stepFilter(node1, node2, config) and
|
stepFilter(node1, node2, config) and
|
||||||
not config.getAFeature() instanceof FeatureEqualSourceSinkCallContext
|
not config.getAFeature() instanceof FeatureEqualSourceSinkCallContext
|
||||||
@@ -507,7 +507,7 @@ private predicate additionalJumpStateStep(
|
|||||||
exists(Node n1, Node n2 |
|
exists(Node n1, Node n2 |
|
||||||
node1.asNode() = n1 and
|
node1.asNode() = n1 and
|
||||||
node2.asNode() = n2 and
|
node2.asNode() = n2 and
|
||||||
config.isAdditionalFlowStep(n1, s1, n2, s2) and
|
config.isAdditionalFlowStep(pragma[only_bind_into](n1), s1, pragma[only_bind_into](n2), s2) and
|
||||||
getNodeEnclosingCallable(n1) != getNodeEnclosingCallable(n2) and
|
getNodeEnclosingCallable(n1) != getNodeEnclosingCallable(n2) and
|
||||||
stepFilter(node1, node2, config) and
|
stepFilter(node1, node2, config) and
|
||||||
not stateBarrier(node1, s1, config) and
|
not stateBarrier(node1, s1, config) and
|
||||||
@@ -518,7 +518,7 @@ private predicate additionalJumpStateStep(
|
|||||||
|
|
||||||
pragma[nomagic]
|
pragma[nomagic]
|
||||||
private predicate readSet(NodeEx node1, ContentSet c, NodeEx node2, Configuration config) {
|
private predicate readSet(NodeEx node1, ContentSet c, NodeEx node2, Configuration config) {
|
||||||
readSet(node1.asNode(), c, node2.asNode()) and
|
readSet(pragma[only_bind_into](node1.asNode()), c, pragma[only_bind_into](node2.asNode())) and
|
||||||
stepFilter(node1, node2, config)
|
stepFilter(node1, node2, config)
|
||||||
or
|
or
|
||||||
exists(Node n |
|
exists(Node n |
|
||||||
@@ -562,7 +562,8 @@ pragma[nomagic]
|
|||||||
private predicate store(
|
private predicate store(
|
||||||
NodeEx node1, TypedContent tc, NodeEx node2, DataFlowType contentType, Configuration config
|
NodeEx node1, TypedContent tc, NodeEx node2, DataFlowType contentType, Configuration config
|
||||||
) {
|
) {
|
||||||
store(node1.asNode(), tc, node2.asNode(), contentType) and
|
store(pragma[only_bind_into](node1.asNode()), tc, pragma[only_bind_into](node2.asNode()),
|
||||||
|
contentType) and
|
||||||
read(_, tc.getContent(), _, config) and
|
read(_, tc.getContent(), _, config) and
|
||||||
stepFilter(node1, node2, config)
|
stepFilter(node1, node2, config)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -428,7 +428,7 @@ private predicate localFlowStep(NodeEx node1, NodeEx node2, Configuration config
|
|||||||
exists(Node n1, Node n2 |
|
exists(Node n1, Node n2 |
|
||||||
node1.asNode() = n1 and
|
node1.asNode() = n1 and
|
||||||
node2.asNode() = n2 and
|
node2.asNode() = n2 and
|
||||||
simpleLocalFlowStepExt(n1, n2) and
|
simpleLocalFlowStepExt(pragma[only_bind_into](n1), pragma[only_bind_into](n2)) and
|
||||||
stepFilter(node1, node2, config)
|
stepFilter(node1, node2, config)
|
||||||
)
|
)
|
||||||
or
|
or
|
||||||
@@ -447,7 +447,7 @@ private predicate additionalLocalFlowStep(NodeEx node1, NodeEx node2, Configurat
|
|||||||
exists(Node n1, Node n2 |
|
exists(Node n1, Node n2 |
|
||||||
node1.asNode() = n1 and
|
node1.asNode() = n1 and
|
||||||
node2.asNode() = n2 and
|
node2.asNode() = n2 and
|
||||||
config.isAdditionalFlowStep(n1, n2) and
|
config.isAdditionalFlowStep(pragma[only_bind_into](n1), pragma[only_bind_into](n2)) and
|
||||||
getNodeEnclosingCallable(n1) = getNodeEnclosingCallable(n2) and
|
getNodeEnclosingCallable(n1) = getNodeEnclosingCallable(n2) and
|
||||||
stepFilter(node1, node2, config)
|
stepFilter(node1, node2, config)
|
||||||
)
|
)
|
||||||
@@ -466,7 +466,7 @@ private predicate additionalLocalStateStep(
|
|||||||
exists(Node n1, Node n2 |
|
exists(Node n1, Node n2 |
|
||||||
node1.asNode() = n1 and
|
node1.asNode() = n1 and
|
||||||
node2.asNode() = n2 and
|
node2.asNode() = n2 and
|
||||||
config.isAdditionalFlowStep(n1, s1, n2, s2) and
|
config.isAdditionalFlowStep(pragma[only_bind_into](n1), s1, pragma[only_bind_into](n2), s2) and
|
||||||
getNodeEnclosingCallable(n1) = getNodeEnclosingCallable(n2) and
|
getNodeEnclosingCallable(n1) = getNodeEnclosingCallable(n2) and
|
||||||
stepFilter(node1, node2, config) and
|
stepFilter(node1, node2, config) and
|
||||||
not stateBarrier(node1, s1, config) and
|
not stateBarrier(node1, s1, config) and
|
||||||
@@ -481,7 +481,7 @@ private predicate jumpStep(NodeEx node1, NodeEx node2, Configuration config) {
|
|||||||
exists(Node n1, Node n2 |
|
exists(Node n1, Node n2 |
|
||||||
node1.asNode() = n1 and
|
node1.asNode() = n1 and
|
||||||
node2.asNode() = n2 and
|
node2.asNode() = n2 and
|
||||||
jumpStepCached(n1, n2) and
|
jumpStepCached(pragma[only_bind_into](n1), pragma[only_bind_into](n2)) and
|
||||||
stepFilter(node1, node2, config) and
|
stepFilter(node1, node2, config) and
|
||||||
not config.getAFeature() instanceof FeatureEqualSourceSinkCallContext
|
not config.getAFeature() instanceof FeatureEqualSourceSinkCallContext
|
||||||
)
|
)
|
||||||
@@ -494,7 +494,7 @@ private predicate additionalJumpStep(NodeEx node1, NodeEx node2, Configuration c
|
|||||||
exists(Node n1, Node n2 |
|
exists(Node n1, Node n2 |
|
||||||
node1.asNode() = n1 and
|
node1.asNode() = n1 and
|
||||||
node2.asNode() = n2 and
|
node2.asNode() = n2 and
|
||||||
config.isAdditionalFlowStep(n1, n2) and
|
config.isAdditionalFlowStep(pragma[only_bind_into](n1), pragma[only_bind_into](n2)) and
|
||||||
getNodeEnclosingCallable(n1) != getNodeEnclosingCallable(n2) and
|
getNodeEnclosingCallable(n1) != getNodeEnclosingCallable(n2) and
|
||||||
stepFilter(node1, node2, config) and
|
stepFilter(node1, node2, config) and
|
||||||
not config.getAFeature() instanceof FeatureEqualSourceSinkCallContext
|
not config.getAFeature() instanceof FeatureEqualSourceSinkCallContext
|
||||||
@@ -507,7 +507,7 @@ private predicate additionalJumpStateStep(
|
|||||||
exists(Node n1, Node n2 |
|
exists(Node n1, Node n2 |
|
||||||
node1.asNode() = n1 and
|
node1.asNode() = n1 and
|
||||||
node2.asNode() = n2 and
|
node2.asNode() = n2 and
|
||||||
config.isAdditionalFlowStep(n1, s1, n2, s2) and
|
config.isAdditionalFlowStep(pragma[only_bind_into](n1), s1, pragma[only_bind_into](n2), s2) and
|
||||||
getNodeEnclosingCallable(n1) != getNodeEnclosingCallable(n2) and
|
getNodeEnclosingCallable(n1) != getNodeEnclosingCallable(n2) and
|
||||||
stepFilter(node1, node2, config) and
|
stepFilter(node1, node2, config) and
|
||||||
not stateBarrier(node1, s1, config) and
|
not stateBarrier(node1, s1, config) and
|
||||||
@@ -518,7 +518,7 @@ private predicate additionalJumpStateStep(
|
|||||||
|
|
||||||
pragma[nomagic]
|
pragma[nomagic]
|
||||||
private predicate readSet(NodeEx node1, ContentSet c, NodeEx node2, Configuration config) {
|
private predicate readSet(NodeEx node1, ContentSet c, NodeEx node2, Configuration config) {
|
||||||
readSet(node1.asNode(), c, node2.asNode()) and
|
readSet(pragma[only_bind_into](node1.asNode()), c, pragma[only_bind_into](node2.asNode())) and
|
||||||
stepFilter(node1, node2, config)
|
stepFilter(node1, node2, config)
|
||||||
or
|
or
|
||||||
exists(Node n |
|
exists(Node n |
|
||||||
@@ -562,7 +562,8 @@ pragma[nomagic]
|
|||||||
private predicate store(
|
private predicate store(
|
||||||
NodeEx node1, TypedContent tc, NodeEx node2, DataFlowType contentType, Configuration config
|
NodeEx node1, TypedContent tc, NodeEx node2, DataFlowType contentType, Configuration config
|
||||||
) {
|
) {
|
||||||
store(node1.asNode(), tc, node2.asNode(), contentType) and
|
store(pragma[only_bind_into](node1.asNode()), tc, pragma[only_bind_into](node2.asNode()),
|
||||||
|
contentType) and
|
||||||
read(_, tc.getContent(), _, config) and
|
read(_, tc.getContent(), _, config) and
|
||||||
stepFilter(node1, node2, config)
|
stepFilter(node1, node2, config)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -428,7 +428,7 @@ private predicate localFlowStep(NodeEx node1, NodeEx node2, Configuration config
|
|||||||
exists(Node n1, Node n2 |
|
exists(Node n1, Node n2 |
|
||||||
node1.asNode() = n1 and
|
node1.asNode() = n1 and
|
||||||
node2.asNode() = n2 and
|
node2.asNode() = n2 and
|
||||||
simpleLocalFlowStepExt(n1, n2) and
|
simpleLocalFlowStepExt(pragma[only_bind_into](n1), pragma[only_bind_into](n2)) and
|
||||||
stepFilter(node1, node2, config)
|
stepFilter(node1, node2, config)
|
||||||
)
|
)
|
||||||
or
|
or
|
||||||
@@ -447,7 +447,7 @@ private predicate additionalLocalFlowStep(NodeEx node1, NodeEx node2, Configurat
|
|||||||
exists(Node n1, Node n2 |
|
exists(Node n1, Node n2 |
|
||||||
node1.asNode() = n1 and
|
node1.asNode() = n1 and
|
||||||
node2.asNode() = n2 and
|
node2.asNode() = n2 and
|
||||||
config.isAdditionalFlowStep(n1, n2) and
|
config.isAdditionalFlowStep(pragma[only_bind_into](n1), pragma[only_bind_into](n2)) and
|
||||||
getNodeEnclosingCallable(n1) = getNodeEnclosingCallable(n2) and
|
getNodeEnclosingCallable(n1) = getNodeEnclosingCallable(n2) and
|
||||||
stepFilter(node1, node2, config)
|
stepFilter(node1, node2, config)
|
||||||
)
|
)
|
||||||
@@ -466,7 +466,7 @@ private predicate additionalLocalStateStep(
|
|||||||
exists(Node n1, Node n2 |
|
exists(Node n1, Node n2 |
|
||||||
node1.asNode() = n1 and
|
node1.asNode() = n1 and
|
||||||
node2.asNode() = n2 and
|
node2.asNode() = n2 and
|
||||||
config.isAdditionalFlowStep(n1, s1, n2, s2) and
|
config.isAdditionalFlowStep(pragma[only_bind_into](n1), s1, pragma[only_bind_into](n2), s2) and
|
||||||
getNodeEnclosingCallable(n1) = getNodeEnclosingCallable(n2) and
|
getNodeEnclosingCallable(n1) = getNodeEnclosingCallable(n2) and
|
||||||
stepFilter(node1, node2, config) and
|
stepFilter(node1, node2, config) and
|
||||||
not stateBarrier(node1, s1, config) and
|
not stateBarrier(node1, s1, config) and
|
||||||
@@ -481,7 +481,7 @@ private predicate jumpStep(NodeEx node1, NodeEx node2, Configuration config) {
|
|||||||
exists(Node n1, Node n2 |
|
exists(Node n1, Node n2 |
|
||||||
node1.asNode() = n1 and
|
node1.asNode() = n1 and
|
||||||
node2.asNode() = n2 and
|
node2.asNode() = n2 and
|
||||||
jumpStepCached(n1, n2) and
|
jumpStepCached(pragma[only_bind_into](n1), pragma[only_bind_into](n2)) and
|
||||||
stepFilter(node1, node2, config) and
|
stepFilter(node1, node2, config) and
|
||||||
not config.getAFeature() instanceof FeatureEqualSourceSinkCallContext
|
not config.getAFeature() instanceof FeatureEqualSourceSinkCallContext
|
||||||
)
|
)
|
||||||
@@ -494,7 +494,7 @@ private predicate additionalJumpStep(NodeEx node1, NodeEx node2, Configuration c
|
|||||||
exists(Node n1, Node n2 |
|
exists(Node n1, Node n2 |
|
||||||
node1.asNode() = n1 and
|
node1.asNode() = n1 and
|
||||||
node2.asNode() = n2 and
|
node2.asNode() = n2 and
|
||||||
config.isAdditionalFlowStep(n1, n2) and
|
config.isAdditionalFlowStep(pragma[only_bind_into](n1), pragma[only_bind_into](n2)) and
|
||||||
getNodeEnclosingCallable(n1) != getNodeEnclosingCallable(n2) and
|
getNodeEnclosingCallable(n1) != getNodeEnclosingCallable(n2) and
|
||||||
stepFilter(node1, node2, config) and
|
stepFilter(node1, node2, config) and
|
||||||
not config.getAFeature() instanceof FeatureEqualSourceSinkCallContext
|
not config.getAFeature() instanceof FeatureEqualSourceSinkCallContext
|
||||||
@@ -507,7 +507,7 @@ private predicate additionalJumpStateStep(
|
|||||||
exists(Node n1, Node n2 |
|
exists(Node n1, Node n2 |
|
||||||
node1.asNode() = n1 and
|
node1.asNode() = n1 and
|
||||||
node2.asNode() = n2 and
|
node2.asNode() = n2 and
|
||||||
config.isAdditionalFlowStep(n1, s1, n2, s2) and
|
config.isAdditionalFlowStep(pragma[only_bind_into](n1), s1, pragma[only_bind_into](n2), s2) and
|
||||||
getNodeEnclosingCallable(n1) != getNodeEnclosingCallable(n2) and
|
getNodeEnclosingCallable(n1) != getNodeEnclosingCallable(n2) and
|
||||||
stepFilter(node1, node2, config) and
|
stepFilter(node1, node2, config) and
|
||||||
not stateBarrier(node1, s1, config) and
|
not stateBarrier(node1, s1, config) and
|
||||||
@@ -518,7 +518,7 @@ private predicate additionalJumpStateStep(
|
|||||||
|
|
||||||
pragma[nomagic]
|
pragma[nomagic]
|
||||||
private predicate readSet(NodeEx node1, ContentSet c, NodeEx node2, Configuration config) {
|
private predicate readSet(NodeEx node1, ContentSet c, NodeEx node2, Configuration config) {
|
||||||
readSet(node1.asNode(), c, node2.asNode()) and
|
readSet(pragma[only_bind_into](node1.asNode()), c, pragma[only_bind_into](node2.asNode())) and
|
||||||
stepFilter(node1, node2, config)
|
stepFilter(node1, node2, config)
|
||||||
or
|
or
|
||||||
exists(Node n |
|
exists(Node n |
|
||||||
@@ -562,7 +562,8 @@ pragma[nomagic]
|
|||||||
private predicate store(
|
private predicate store(
|
||||||
NodeEx node1, TypedContent tc, NodeEx node2, DataFlowType contentType, Configuration config
|
NodeEx node1, TypedContent tc, NodeEx node2, DataFlowType contentType, Configuration config
|
||||||
) {
|
) {
|
||||||
store(node1.asNode(), tc, node2.asNode(), contentType) and
|
store(pragma[only_bind_into](node1.asNode()), tc, pragma[only_bind_into](node2.asNode()),
|
||||||
|
contentType) and
|
||||||
read(_, tc.getContent(), _, config) and
|
read(_, tc.getContent(), _, config) and
|
||||||
stepFilter(node1, node2, config)
|
stepFilter(node1, node2, config)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -428,7 +428,7 @@ private predicate localFlowStep(NodeEx node1, NodeEx node2, Configuration config
|
|||||||
exists(Node n1, Node n2 |
|
exists(Node n1, Node n2 |
|
||||||
node1.asNode() = n1 and
|
node1.asNode() = n1 and
|
||||||
node2.asNode() = n2 and
|
node2.asNode() = n2 and
|
||||||
simpleLocalFlowStepExt(n1, n2) and
|
simpleLocalFlowStepExt(pragma[only_bind_into](n1), pragma[only_bind_into](n2)) and
|
||||||
stepFilter(node1, node2, config)
|
stepFilter(node1, node2, config)
|
||||||
)
|
)
|
||||||
or
|
or
|
||||||
@@ -447,7 +447,7 @@ private predicate additionalLocalFlowStep(NodeEx node1, NodeEx node2, Configurat
|
|||||||
exists(Node n1, Node n2 |
|
exists(Node n1, Node n2 |
|
||||||
node1.asNode() = n1 and
|
node1.asNode() = n1 and
|
||||||
node2.asNode() = n2 and
|
node2.asNode() = n2 and
|
||||||
config.isAdditionalFlowStep(n1, n2) and
|
config.isAdditionalFlowStep(pragma[only_bind_into](n1), pragma[only_bind_into](n2)) and
|
||||||
getNodeEnclosingCallable(n1) = getNodeEnclosingCallable(n2) and
|
getNodeEnclosingCallable(n1) = getNodeEnclosingCallable(n2) and
|
||||||
stepFilter(node1, node2, config)
|
stepFilter(node1, node2, config)
|
||||||
)
|
)
|
||||||
@@ -466,7 +466,7 @@ private predicate additionalLocalStateStep(
|
|||||||
exists(Node n1, Node n2 |
|
exists(Node n1, Node n2 |
|
||||||
node1.asNode() = n1 and
|
node1.asNode() = n1 and
|
||||||
node2.asNode() = n2 and
|
node2.asNode() = n2 and
|
||||||
config.isAdditionalFlowStep(n1, s1, n2, s2) and
|
config.isAdditionalFlowStep(pragma[only_bind_into](n1), s1, pragma[only_bind_into](n2), s2) and
|
||||||
getNodeEnclosingCallable(n1) = getNodeEnclosingCallable(n2) and
|
getNodeEnclosingCallable(n1) = getNodeEnclosingCallable(n2) and
|
||||||
stepFilter(node1, node2, config) and
|
stepFilter(node1, node2, config) and
|
||||||
not stateBarrier(node1, s1, config) and
|
not stateBarrier(node1, s1, config) and
|
||||||
@@ -481,7 +481,7 @@ private predicate jumpStep(NodeEx node1, NodeEx node2, Configuration config) {
|
|||||||
exists(Node n1, Node n2 |
|
exists(Node n1, Node n2 |
|
||||||
node1.asNode() = n1 and
|
node1.asNode() = n1 and
|
||||||
node2.asNode() = n2 and
|
node2.asNode() = n2 and
|
||||||
jumpStepCached(n1, n2) and
|
jumpStepCached(pragma[only_bind_into](n1), pragma[only_bind_into](n2)) and
|
||||||
stepFilter(node1, node2, config) and
|
stepFilter(node1, node2, config) and
|
||||||
not config.getAFeature() instanceof FeatureEqualSourceSinkCallContext
|
not config.getAFeature() instanceof FeatureEqualSourceSinkCallContext
|
||||||
)
|
)
|
||||||
@@ -494,7 +494,7 @@ private predicate additionalJumpStep(NodeEx node1, NodeEx node2, Configuration c
|
|||||||
exists(Node n1, Node n2 |
|
exists(Node n1, Node n2 |
|
||||||
node1.asNode() = n1 and
|
node1.asNode() = n1 and
|
||||||
node2.asNode() = n2 and
|
node2.asNode() = n2 and
|
||||||
config.isAdditionalFlowStep(n1, n2) and
|
config.isAdditionalFlowStep(pragma[only_bind_into](n1), pragma[only_bind_into](n2)) and
|
||||||
getNodeEnclosingCallable(n1) != getNodeEnclosingCallable(n2) and
|
getNodeEnclosingCallable(n1) != getNodeEnclosingCallable(n2) and
|
||||||
stepFilter(node1, node2, config) and
|
stepFilter(node1, node2, config) and
|
||||||
not config.getAFeature() instanceof FeatureEqualSourceSinkCallContext
|
not config.getAFeature() instanceof FeatureEqualSourceSinkCallContext
|
||||||
@@ -507,7 +507,7 @@ private predicate additionalJumpStateStep(
|
|||||||
exists(Node n1, Node n2 |
|
exists(Node n1, Node n2 |
|
||||||
node1.asNode() = n1 and
|
node1.asNode() = n1 and
|
||||||
node2.asNode() = n2 and
|
node2.asNode() = n2 and
|
||||||
config.isAdditionalFlowStep(n1, s1, n2, s2) and
|
config.isAdditionalFlowStep(pragma[only_bind_into](n1), s1, pragma[only_bind_into](n2), s2) and
|
||||||
getNodeEnclosingCallable(n1) != getNodeEnclosingCallable(n2) and
|
getNodeEnclosingCallable(n1) != getNodeEnclosingCallable(n2) and
|
||||||
stepFilter(node1, node2, config) and
|
stepFilter(node1, node2, config) and
|
||||||
not stateBarrier(node1, s1, config) and
|
not stateBarrier(node1, s1, config) and
|
||||||
@@ -518,7 +518,7 @@ private predicate additionalJumpStateStep(
|
|||||||
|
|
||||||
pragma[nomagic]
|
pragma[nomagic]
|
||||||
private predicate readSet(NodeEx node1, ContentSet c, NodeEx node2, Configuration config) {
|
private predicate readSet(NodeEx node1, ContentSet c, NodeEx node2, Configuration config) {
|
||||||
readSet(node1.asNode(), c, node2.asNode()) and
|
readSet(pragma[only_bind_into](node1.asNode()), c, pragma[only_bind_into](node2.asNode())) and
|
||||||
stepFilter(node1, node2, config)
|
stepFilter(node1, node2, config)
|
||||||
or
|
or
|
||||||
exists(Node n |
|
exists(Node n |
|
||||||
@@ -562,7 +562,8 @@ pragma[nomagic]
|
|||||||
private predicate store(
|
private predicate store(
|
||||||
NodeEx node1, TypedContent tc, NodeEx node2, DataFlowType contentType, Configuration config
|
NodeEx node1, TypedContent tc, NodeEx node2, DataFlowType contentType, Configuration config
|
||||||
) {
|
) {
|
||||||
store(node1.asNode(), tc, node2.asNode(), contentType) and
|
store(pragma[only_bind_into](node1.asNode()), tc, pragma[only_bind_into](node2.asNode()),
|
||||||
|
contentType) and
|
||||||
read(_, tc.getContent(), _, config) and
|
read(_, tc.getContent(), _, config) and
|
||||||
stepFilter(node1, node2, config)
|
stepFilter(node1, node2, config)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -428,7 +428,7 @@ private predicate localFlowStep(NodeEx node1, NodeEx node2, Configuration config
|
|||||||
exists(Node n1, Node n2 |
|
exists(Node n1, Node n2 |
|
||||||
node1.asNode() = n1 and
|
node1.asNode() = n1 and
|
||||||
node2.asNode() = n2 and
|
node2.asNode() = n2 and
|
||||||
simpleLocalFlowStepExt(n1, n2) and
|
simpleLocalFlowStepExt(pragma[only_bind_into](n1), pragma[only_bind_into](n2)) and
|
||||||
stepFilter(node1, node2, config)
|
stepFilter(node1, node2, config)
|
||||||
)
|
)
|
||||||
or
|
or
|
||||||
@@ -447,7 +447,7 @@ private predicate additionalLocalFlowStep(NodeEx node1, NodeEx node2, Configurat
|
|||||||
exists(Node n1, Node n2 |
|
exists(Node n1, Node n2 |
|
||||||
node1.asNode() = n1 and
|
node1.asNode() = n1 and
|
||||||
node2.asNode() = n2 and
|
node2.asNode() = n2 and
|
||||||
config.isAdditionalFlowStep(n1, n2) and
|
config.isAdditionalFlowStep(pragma[only_bind_into](n1), pragma[only_bind_into](n2)) and
|
||||||
getNodeEnclosingCallable(n1) = getNodeEnclosingCallable(n2) and
|
getNodeEnclosingCallable(n1) = getNodeEnclosingCallable(n2) and
|
||||||
stepFilter(node1, node2, config)
|
stepFilter(node1, node2, config)
|
||||||
)
|
)
|
||||||
@@ -466,7 +466,7 @@ private predicate additionalLocalStateStep(
|
|||||||
exists(Node n1, Node n2 |
|
exists(Node n1, Node n2 |
|
||||||
node1.asNode() = n1 and
|
node1.asNode() = n1 and
|
||||||
node2.asNode() = n2 and
|
node2.asNode() = n2 and
|
||||||
config.isAdditionalFlowStep(n1, s1, n2, s2) and
|
config.isAdditionalFlowStep(pragma[only_bind_into](n1), s1, pragma[only_bind_into](n2), s2) and
|
||||||
getNodeEnclosingCallable(n1) = getNodeEnclosingCallable(n2) and
|
getNodeEnclosingCallable(n1) = getNodeEnclosingCallable(n2) and
|
||||||
stepFilter(node1, node2, config) and
|
stepFilter(node1, node2, config) and
|
||||||
not stateBarrier(node1, s1, config) and
|
not stateBarrier(node1, s1, config) and
|
||||||
@@ -481,7 +481,7 @@ private predicate jumpStep(NodeEx node1, NodeEx node2, Configuration config) {
|
|||||||
exists(Node n1, Node n2 |
|
exists(Node n1, Node n2 |
|
||||||
node1.asNode() = n1 and
|
node1.asNode() = n1 and
|
||||||
node2.asNode() = n2 and
|
node2.asNode() = n2 and
|
||||||
jumpStepCached(n1, n2) and
|
jumpStepCached(pragma[only_bind_into](n1), pragma[only_bind_into](n2)) and
|
||||||
stepFilter(node1, node2, config) and
|
stepFilter(node1, node2, config) and
|
||||||
not config.getAFeature() instanceof FeatureEqualSourceSinkCallContext
|
not config.getAFeature() instanceof FeatureEqualSourceSinkCallContext
|
||||||
)
|
)
|
||||||
@@ -494,7 +494,7 @@ private predicate additionalJumpStep(NodeEx node1, NodeEx node2, Configuration c
|
|||||||
exists(Node n1, Node n2 |
|
exists(Node n1, Node n2 |
|
||||||
node1.asNode() = n1 and
|
node1.asNode() = n1 and
|
||||||
node2.asNode() = n2 and
|
node2.asNode() = n2 and
|
||||||
config.isAdditionalFlowStep(n1, n2) and
|
config.isAdditionalFlowStep(pragma[only_bind_into](n1), pragma[only_bind_into](n2)) and
|
||||||
getNodeEnclosingCallable(n1) != getNodeEnclosingCallable(n2) and
|
getNodeEnclosingCallable(n1) != getNodeEnclosingCallable(n2) and
|
||||||
stepFilter(node1, node2, config) and
|
stepFilter(node1, node2, config) and
|
||||||
not config.getAFeature() instanceof FeatureEqualSourceSinkCallContext
|
not config.getAFeature() instanceof FeatureEqualSourceSinkCallContext
|
||||||
@@ -507,7 +507,7 @@ private predicate additionalJumpStateStep(
|
|||||||
exists(Node n1, Node n2 |
|
exists(Node n1, Node n2 |
|
||||||
node1.asNode() = n1 and
|
node1.asNode() = n1 and
|
||||||
node2.asNode() = n2 and
|
node2.asNode() = n2 and
|
||||||
config.isAdditionalFlowStep(n1, s1, n2, s2) and
|
config.isAdditionalFlowStep(pragma[only_bind_into](n1), s1, pragma[only_bind_into](n2), s2) and
|
||||||
getNodeEnclosingCallable(n1) != getNodeEnclosingCallable(n2) and
|
getNodeEnclosingCallable(n1) != getNodeEnclosingCallable(n2) and
|
||||||
stepFilter(node1, node2, config) and
|
stepFilter(node1, node2, config) and
|
||||||
not stateBarrier(node1, s1, config) and
|
not stateBarrier(node1, s1, config) and
|
||||||
@@ -518,7 +518,7 @@ private predicate additionalJumpStateStep(
|
|||||||
|
|
||||||
pragma[nomagic]
|
pragma[nomagic]
|
||||||
private predicate readSet(NodeEx node1, ContentSet c, NodeEx node2, Configuration config) {
|
private predicate readSet(NodeEx node1, ContentSet c, NodeEx node2, Configuration config) {
|
||||||
readSet(node1.asNode(), c, node2.asNode()) and
|
readSet(pragma[only_bind_into](node1.asNode()), c, pragma[only_bind_into](node2.asNode())) and
|
||||||
stepFilter(node1, node2, config)
|
stepFilter(node1, node2, config)
|
||||||
or
|
or
|
||||||
exists(Node n |
|
exists(Node n |
|
||||||
@@ -562,7 +562,8 @@ pragma[nomagic]
|
|||||||
private predicate store(
|
private predicate store(
|
||||||
NodeEx node1, TypedContent tc, NodeEx node2, DataFlowType contentType, Configuration config
|
NodeEx node1, TypedContent tc, NodeEx node2, DataFlowType contentType, Configuration config
|
||||||
) {
|
) {
|
||||||
store(node1.asNode(), tc, node2.asNode(), contentType) and
|
store(pragma[only_bind_into](node1.asNode()), tc, pragma[only_bind_into](node2.asNode()),
|
||||||
|
contentType) and
|
||||||
read(_, tc.getContent(), _, config) and
|
read(_, tc.getContent(), _, config) and
|
||||||
stepFilter(node1, node2, config)
|
stepFilter(node1, node2, config)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -428,7 +428,7 @@ private predicate localFlowStep(NodeEx node1, NodeEx node2, Configuration config
|
|||||||
exists(Node n1, Node n2 |
|
exists(Node n1, Node n2 |
|
||||||
node1.asNode() = n1 and
|
node1.asNode() = n1 and
|
||||||
node2.asNode() = n2 and
|
node2.asNode() = n2 and
|
||||||
simpleLocalFlowStepExt(n1, n2) and
|
simpleLocalFlowStepExt(pragma[only_bind_into](n1), pragma[only_bind_into](n2)) and
|
||||||
stepFilter(node1, node2, config)
|
stepFilter(node1, node2, config)
|
||||||
)
|
)
|
||||||
or
|
or
|
||||||
@@ -447,7 +447,7 @@ private predicate additionalLocalFlowStep(NodeEx node1, NodeEx node2, Configurat
|
|||||||
exists(Node n1, Node n2 |
|
exists(Node n1, Node n2 |
|
||||||
node1.asNode() = n1 and
|
node1.asNode() = n1 and
|
||||||
node2.asNode() = n2 and
|
node2.asNode() = n2 and
|
||||||
config.isAdditionalFlowStep(n1, n2) and
|
config.isAdditionalFlowStep(pragma[only_bind_into](n1), pragma[only_bind_into](n2)) and
|
||||||
getNodeEnclosingCallable(n1) = getNodeEnclosingCallable(n2) and
|
getNodeEnclosingCallable(n1) = getNodeEnclosingCallable(n2) and
|
||||||
stepFilter(node1, node2, config)
|
stepFilter(node1, node2, config)
|
||||||
)
|
)
|
||||||
@@ -466,7 +466,7 @@ private predicate additionalLocalStateStep(
|
|||||||
exists(Node n1, Node n2 |
|
exists(Node n1, Node n2 |
|
||||||
node1.asNode() = n1 and
|
node1.asNode() = n1 and
|
||||||
node2.asNode() = n2 and
|
node2.asNode() = n2 and
|
||||||
config.isAdditionalFlowStep(n1, s1, n2, s2) and
|
config.isAdditionalFlowStep(pragma[only_bind_into](n1), s1, pragma[only_bind_into](n2), s2) and
|
||||||
getNodeEnclosingCallable(n1) = getNodeEnclosingCallable(n2) and
|
getNodeEnclosingCallable(n1) = getNodeEnclosingCallable(n2) and
|
||||||
stepFilter(node1, node2, config) and
|
stepFilter(node1, node2, config) and
|
||||||
not stateBarrier(node1, s1, config) and
|
not stateBarrier(node1, s1, config) and
|
||||||
@@ -481,7 +481,7 @@ private predicate jumpStep(NodeEx node1, NodeEx node2, Configuration config) {
|
|||||||
exists(Node n1, Node n2 |
|
exists(Node n1, Node n2 |
|
||||||
node1.asNode() = n1 and
|
node1.asNode() = n1 and
|
||||||
node2.asNode() = n2 and
|
node2.asNode() = n2 and
|
||||||
jumpStepCached(n1, n2) and
|
jumpStepCached(pragma[only_bind_into](n1), pragma[only_bind_into](n2)) and
|
||||||
stepFilter(node1, node2, config) and
|
stepFilter(node1, node2, config) and
|
||||||
not config.getAFeature() instanceof FeatureEqualSourceSinkCallContext
|
not config.getAFeature() instanceof FeatureEqualSourceSinkCallContext
|
||||||
)
|
)
|
||||||
@@ -494,7 +494,7 @@ private predicate additionalJumpStep(NodeEx node1, NodeEx node2, Configuration c
|
|||||||
exists(Node n1, Node n2 |
|
exists(Node n1, Node n2 |
|
||||||
node1.asNode() = n1 and
|
node1.asNode() = n1 and
|
||||||
node2.asNode() = n2 and
|
node2.asNode() = n2 and
|
||||||
config.isAdditionalFlowStep(n1, n2) and
|
config.isAdditionalFlowStep(pragma[only_bind_into](n1), pragma[only_bind_into](n2)) and
|
||||||
getNodeEnclosingCallable(n1) != getNodeEnclosingCallable(n2) and
|
getNodeEnclosingCallable(n1) != getNodeEnclosingCallable(n2) and
|
||||||
stepFilter(node1, node2, config) and
|
stepFilter(node1, node2, config) and
|
||||||
not config.getAFeature() instanceof FeatureEqualSourceSinkCallContext
|
not config.getAFeature() instanceof FeatureEqualSourceSinkCallContext
|
||||||
@@ -507,7 +507,7 @@ private predicate additionalJumpStateStep(
|
|||||||
exists(Node n1, Node n2 |
|
exists(Node n1, Node n2 |
|
||||||
node1.asNode() = n1 and
|
node1.asNode() = n1 and
|
||||||
node2.asNode() = n2 and
|
node2.asNode() = n2 and
|
||||||
config.isAdditionalFlowStep(n1, s1, n2, s2) and
|
config.isAdditionalFlowStep(pragma[only_bind_into](n1), s1, pragma[only_bind_into](n2), s2) and
|
||||||
getNodeEnclosingCallable(n1) != getNodeEnclosingCallable(n2) and
|
getNodeEnclosingCallable(n1) != getNodeEnclosingCallable(n2) and
|
||||||
stepFilter(node1, node2, config) and
|
stepFilter(node1, node2, config) and
|
||||||
not stateBarrier(node1, s1, config) and
|
not stateBarrier(node1, s1, config) and
|
||||||
@@ -518,7 +518,7 @@ private predicate additionalJumpStateStep(
|
|||||||
|
|
||||||
pragma[nomagic]
|
pragma[nomagic]
|
||||||
private predicate readSet(NodeEx node1, ContentSet c, NodeEx node2, Configuration config) {
|
private predicate readSet(NodeEx node1, ContentSet c, NodeEx node2, Configuration config) {
|
||||||
readSet(node1.asNode(), c, node2.asNode()) and
|
readSet(pragma[only_bind_into](node1.asNode()), c, pragma[only_bind_into](node2.asNode())) and
|
||||||
stepFilter(node1, node2, config)
|
stepFilter(node1, node2, config)
|
||||||
or
|
or
|
||||||
exists(Node n |
|
exists(Node n |
|
||||||
@@ -562,7 +562,8 @@ pragma[nomagic]
|
|||||||
private predicate store(
|
private predicate store(
|
||||||
NodeEx node1, TypedContent tc, NodeEx node2, DataFlowType contentType, Configuration config
|
NodeEx node1, TypedContent tc, NodeEx node2, DataFlowType contentType, Configuration config
|
||||||
) {
|
) {
|
||||||
store(node1.asNode(), tc, node2.asNode(), contentType) and
|
store(pragma[only_bind_into](node1.asNode()), tc, pragma[only_bind_into](node2.asNode()),
|
||||||
|
contentType) and
|
||||||
read(_, tc.getContent(), _, config) and
|
read(_, tc.getContent(), _, config) and
|
||||||
stepFilter(node1, node2, config)
|
stepFilter(node1, node2, config)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,3 +1,14 @@
|
|||||||
|
## 0.2.0
|
||||||
|
|
||||||
|
### Query Metadata Changes
|
||||||
|
|
||||||
|
* The `kind` query metadata was changed to `diagnostic` on `cs/compilation-error`, `cs/compilation-message`, `cs/extraction-error`, and `cs/extraction-message`.
|
||||||
|
|
||||||
|
### Minor Analysis Improvements
|
||||||
|
|
||||||
|
* The syntax of the (source|sink|summary)model CSV format has been changed slightly for Java and C#. A new column called `provenance` has been introduced, where the allowed values are `manual` and `generated`. The value used to indicate whether a model as been written by hand (`manual`) or create by the CSV model generator (`generated`).
|
||||||
|
* All auto implemented public properties with public getters and setters on ASP.NET Core remote flow sources are now also considered to be tainted.
|
||||||
|
|
||||||
## 0.1.4
|
## 0.1.4
|
||||||
|
|
||||||
## 0.1.3
|
## 0.1.3
|
||||||
|
|||||||
@@ -1,4 +0,0 @@
|
|||||||
---
|
|
||||||
category: minorAnalysis
|
|
||||||
---
|
|
||||||
* All auto implemented public properties with public getters and setters on ASP.NET Core remote flow sources are now also considered to be tainted.
|
|
||||||
@@ -1,4 +0,0 @@
|
|||||||
---
|
|
||||||
category: minorAnalysis
|
|
||||||
---
|
|
||||||
* The syntax of the (source|sink|summary)model CSV format has been changed slightly for Java and C#. A new column called `provenance` has been introduced, where the allowed values are `manual` and `generated`. The value used to indicate whether a model as been written by hand (`manual`) or create by the CSV model generator (`generated`).
|
|
||||||
@@ -1,4 +0,0 @@
|
|||||||
---
|
|
||||||
category: queryMetadata
|
|
||||||
---
|
|
||||||
* The `kind` query metadata was changed to `diagnostic` on `cs/compilation-error`, `cs/compilation-message`, `cs/extraction-error`, and `cs/extraction-message`.
|
|
||||||
@@ -0,0 +1,4 @@
|
|||||||
|
---
|
||||||
|
category: breaking
|
||||||
|
---
|
||||||
|
* Contextual queries and the query libraries they depend on have been moved to the `codeql/csharp-all` package.
|
||||||
10
csharp/ql/src/change-notes/released/0.2.0.md
Normal file
10
csharp/ql/src/change-notes/released/0.2.0.md
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
## 0.2.0
|
||||||
|
|
||||||
|
### Query Metadata Changes
|
||||||
|
|
||||||
|
* The `kind` query metadata was changed to `diagnostic` on `cs/compilation-error`, `cs/compilation-message`, `cs/extraction-error`, and `cs/extraction-message`.
|
||||||
|
|
||||||
|
### Minor Analysis Improvements
|
||||||
|
|
||||||
|
* The syntax of the (source|sink|summary)model CSV format has been changed slightly for Java and C#. A new column called `provenance` has been introduced, where the allowed values are `manual` and `generated`. The value used to indicate whether a model as been written by hand (`manual`) or create by the CSV model generator (`generated`).
|
||||||
|
* All auto implemented public properties with public getters and setters on ASP.NET Core remote flow sources are now also considered to be tainted.
|
||||||
@@ -1,2 +1,2 @@
|
|||||||
---
|
---
|
||||||
lastReleaseVersion: 0.1.4
|
lastReleaseVersion: 0.2.0
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
name: codeql/csharp-queries
|
name: codeql/csharp-queries
|
||||||
version: 0.2.0-dev
|
version: 0.2.1-dev
|
||||||
groups:
|
groups:
|
||||||
- csharp
|
- csharp
|
||||||
- queries
|
- queries
|
||||||
|
|||||||
@@ -2,4 +2,4 @@
|
|||||||
|
|
||||||
Note
|
Note
|
||||||
|
|
||||||
The CodeQL package management functionality, including CodeQL packs, is currently available as a beta release and is subject to change. During the beta release, CodeQL packs are available only using GitHub Packages - the GitHub Container registry. To use this beta functionality, install version 2.6.0 or higher of the CodeQL CLI bundle from: https://github.com/github/codeql-action/releases.
|
The CodeQL package management functionality, including CodeQL packs, is currently available as a beta release and is subject to change. During the beta release, CodeQL packs are available only using GitHub Packages - the GitHub Container registry. To use this beta functionality, install the latest version of the CodeQL CLI bundle from: https://github.com/github/codeql-action/releases.
|
||||||
|
|||||||
@@ -1,3 +1,9 @@
|
|||||||
|
## 0.2.0
|
||||||
|
|
||||||
|
### Deprecated APIs
|
||||||
|
|
||||||
|
* The `BarrierGuard` class has been deprecated. Such barriers and sanitizers can now instead be created using the new `BarrierGuard` parameterized module.
|
||||||
|
|
||||||
## 0.1.4
|
## 0.1.4
|
||||||
|
|
||||||
## 0.1.3
|
## 0.1.3
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
---
|
## 0.2.0
|
||||||
category: deprecated
|
|
||||||
---
|
### Deprecated APIs
|
||||||
|
|
||||||
* The `BarrierGuard` class has been deprecated. Such barriers and sanitizers can now instead be created using the new `BarrierGuard` parameterized module.
|
* The `BarrierGuard` class has been deprecated. Such barriers and sanitizers can now instead be created using the new `BarrierGuard` parameterized module.
|
||||||
@@ -1,2 +1,2 @@
|
|||||||
---
|
---
|
||||||
lastReleaseVersion: 0.1.4
|
lastReleaseVersion: 0.2.0
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
name: codeql/go-all
|
name: codeql/go-all
|
||||||
version: 0.2.0-dev
|
version: 0.2.1-dev
|
||||||
groups: go
|
groups: go
|
||||||
dbscheme: go.dbscheme
|
dbscheme: go.dbscheme
|
||||||
extractor: go
|
extractor: go
|
||||||
|
|||||||
@@ -1,3 +1,5 @@
|
|||||||
|
## 0.2.0
|
||||||
|
|
||||||
## 0.1.4
|
## 0.1.4
|
||||||
|
|
||||||
## 0.1.3
|
## 0.1.3
|
||||||
|
|||||||
1
go/ql/src/change-notes/released/0.2.0.md
Normal file
1
go/ql/src/change-notes/released/0.2.0.md
Normal file
@@ -0,0 +1 @@
|
|||||||
|
## 0.2.0
|
||||||
@@ -1,2 +1,2 @@
|
|||||||
---
|
---
|
||||||
lastReleaseVersion: 0.1.4
|
lastReleaseVersion: 0.2.0
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
name: codeql/go-queries
|
name: codeql/go-queries
|
||||||
version: 0.2.0-dev
|
version: 0.2.1-dev
|
||||||
groups:
|
groups:
|
||||||
- go
|
- go
|
||||||
- queries
|
- queries
|
||||||
|
|||||||
@@ -1,121 +1,121 @@
|
|||||||
package,sink,source,summary,sink:bean-validation,sink:create-file,sink:groovy,sink:header-splitting,sink:information-leak,sink:intent-start,sink:jdbc-url,sink:jexl,sink:jndi-injection,sink:ldap,sink:logging,sink:mvel,sink:ognl-injection,sink:open-url,sink:pending-intent-sent,sink:regex-use[-1],sink:regex-use[0],sink:regex-use[],sink:regex-use[f-1],sink:regex-use[f1],sink:regex-use[f],sink:set-hostname-verifier,sink:sql,sink:url-open-stream,sink:url-redirect,sink:write-file,sink:xpath,sink:xslt,sink:xss,source:android-widget,source:contentprovider,source:remote,summary:taint,summary:value
|
package,sink,source,summary,sink:bean-validation,sink:create-file,sink:groovy,sink:header-splitting,sink:information-leak,sink:intent-start,sink:jdbc-url,sink:jexl,sink:jndi-injection,sink:ldap,sink:logging,sink:mvel,sink:ognl-injection,sink:open-url,sink:pending-intent-sent,sink:regex-use[-1],sink:regex-use[0],sink:regex-use[],sink:regex-use[f-1],sink:regex-use[f1],sink:regex-use[f],sink:set-hostname-verifier,sink:sql,sink:url-open-stream,sink:url-redirect,sink:write-file,sink:xpath,sink:xslt,sink:xss,source:android-external-storage-dir,source:android-widget,source:contentprovider,source:remote,summary:taint,summary:value
|
||||||
android.app,16,,103,,,,,,7,,,,,,,,,9,,,,,,,,,,,,,,,,,,18,85
|
android.app,16,,103,,,,,,7,,,,,,,,,9,,,,,,,,,,,,,,,,,,,18,85
|
||||||
android.content,24,27,108,,,,,,16,,,,,,,,,,,,,,,,,8,,,,,,,,27,,31,77
|
android.content,24,31,108,,,,,,16,,,,,,,,,,,,,,,,,8,,,,,,,4,,27,,31,77
|
||||||
android.database,59,,30,,,,,,,,,,,,,,,,,,,,,,,59,,,,,,,,,,30,
|
android.database,59,,30,,,,,,,,,,,,,,,,,,,,,,,59,,,,,,,,,,,30,
|
||||||
android.net,,,60,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,45,15
|
android.net,,,60,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,45,15
|
||||||
android.os,,,122,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,41,81
|
android.os,,2,122,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,2,,,,41,81
|
||||||
android.util,6,16,,,,,,,,,,,,6,,,,,,,,,,,,,,,,,,,,,16,,
|
android.util,6,16,,,,,,,,,,,,6,,,,,,,,,,,,,,,,,,,,,,16,,
|
||||||
android.webkit,3,2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,3,,,2,,
|
android.webkit,3,2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,3,,,,2,,
|
||||||
android.widget,,1,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1,,,1,
|
android.widget,,1,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1,,,1,
|
||||||
androidx.slice,2,5,88,,,,,,,,,,,,,,,2,,,,,,,,,,,,,,,,5,,27,61
|
androidx.slice,2,5,88,,,,,,,,,,,,,,,2,,,,,,,,,,,,,,,,,5,,27,61
|
||||||
cn.hutool.core.codec,,,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1,
|
cn.hutool.core.codec,,,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1,
|
||||||
com.esotericsoftware.kryo.io,,,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1,
|
com.esotericsoftware.kryo.io,,,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1,
|
||||||
com.esotericsoftware.kryo5.io,,,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1,
|
com.esotericsoftware.kryo5.io,,,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1,
|
||||||
com.fasterxml.jackson.core,,,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1,
|
com.fasterxml.jackson.core,,,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1,
|
||||||
com.fasterxml.jackson.databind,,,6,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,6,
|
com.fasterxml.jackson.databind,,,6,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,6,
|
||||||
com.google.common.base,4,,85,,,,,,,,,,,,,,,,,3,1,,,,,,,,,,,,,,,62,23
|
com.google.common.base,4,,85,,,,,,,,,,,,,,,,,3,1,,,,,,,,,,,,,,,,62,23
|
||||||
com.google.common.cache,,,17,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,17
|
com.google.common.cache,,,17,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,17
|
||||||
com.google.common.collect,,,553,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,2,551
|
com.google.common.collect,,,553,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,2,551
|
||||||
com.google.common.flogger,29,,,,,,,,,,,,,29,,,,,,,,,,,,,,,,,,,,,,,
|
com.google.common.flogger,29,,,,,,,,,,,,,29,,,,,,,,,,,,,,,,,,,,,,,,
|
||||||
com.google.common.io,6,,73,,,,,,,,,,,,,,,,,,,,,,,,6,,,,,,,,,72,1
|
com.google.common.io,6,,73,,,,,,,,,,,,,,,,,,,,,,,,6,,,,,,,,,,72,1
|
||||||
com.opensymphony.xwork2.ognl,3,,,,,,,,,,,,,,,3,,,,,,,,,,,,,,,,,,,,,
|
com.opensymphony.xwork2.ognl,3,,,,,,,,,,,,,,,3,,,,,,,,,,,,,,,,,,,,,,
|
||||||
com.rabbitmq.client,,21,7,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,21,7,
|
com.rabbitmq.client,,21,7,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,21,7,
|
||||||
com.unboundid.ldap.sdk,17,,,,,,,,,,,,17,,,,,,,,,,,,,,,,,,,,,,,,
|
com.unboundid.ldap.sdk,17,,,,,,,,,,,,17,,,,,,,,,,,,,,,,,,,,,,,,,
|
||||||
com.zaxxer.hikari,2,,,,,,,,,2,,,,,,,,,,,,,,,,,,,,,,,,,,,
|
com.zaxxer.hikari,2,,,,,,,,,2,,,,,,,,,,,,,,,,,,,,,,,,,,,,
|
||||||
flexjson,,,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1
|
flexjson,,,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1
|
||||||
groovy.lang,26,,,,,26,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
|
groovy.lang,26,,,,,26,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
|
||||||
groovy.util,5,,,,,5,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
|
groovy.util,5,,,,,5,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
|
||||||
jakarta.faces.context,2,7,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,2,,,7,,
|
jakarta.faces.context,2,7,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,2,,,,7,,
|
||||||
jakarta.json,,,123,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,100,23
|
jakarta.json,,,123,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,100,23
|
||||||
jakarta.ws.rs.client,1,,,,,,,,,,,,,,,,1,,,,,,,,,,,,,,,,,,,,
|
jakarta.ws.rs.client,1,,,,,,,,,,,,,,,,1,,,,,,,,,,,,,,,,,,,,,
|
||||||
jakarta.ws.rs.container,,9,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,9,,
|
jakarta.ws.rs.container,,9,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,9,,
|
||||||
jakarta.ws.rs.core,2,,149,,,,,,,,,,,,,,,,,,,,,,,,,2,,,,,,,,94,55
|
jakarta.ws.rs.core,2,,149,,,,,,,,,,,,,,,,,,,,,,,,,2,,,,,,,,,94,55
|
||||||
java.beans,,,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1,
|
java.beans,,,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1,
|
||||||
java.io,37,,39,,15,,,,,,,,,,,,,,,,,,,,,,,,22,,,,,,,39,
|
java.io,37,,39,,15,,,,,,,,,,,,,,,,,,,,,,,,22,,,,,,,,39,
|
||||||
java.lang,13,,58,,,,,,,,,,,8,,,,,4,,,1,,,,,,,,,,,,,,46,12
|
java.lang,13,,58,,,,,,,,,,,8,,,,,4,,,1,,,,,,,,,,,,,,,46,12
|
||||||
java.net,10,3,7,,,,,,,,,,,,,,10,,,,,,,,,,,,,,,,,,3,7,
|
java.net,10,3,7,,,,,,,,,,,,,,10,,,,,,,,,,,,,,,,,,,3,7,
|
||||||
java.nio,15,,6,,13,,,,,,,,,,,,,,,,,,,,,,,,2,,,,,,,6,
|
java.nio,15,,6,,13,,,,,,,,,,,,,,,,,,,,,,,,2,,,,,,,,6,
|
||||||
java.sql,11,,,,,,,,,4,,,,,,,,,,,,,,,,7,,,,,,,,,,,
|
java.sql,11,,,,,,,,,4,,,,,,,,,,,,,,,,7,,,,,,,,,,,,
|
||||||
java.util,44,,438,,,,,,,,,,,34,,,,,,5,2,,1,2,,,,,,,,,,,,24,414
|
java.util,44,,438,,,,,,,,,,,34,,,,,,5,2,,1,2,,,,,,,,,,,,,24,414
|
||||||
javax.faces.context,2,7,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,2,,,7,,
|
javax.faces.context,2,7,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,2,,,,7,,
|
||||||
javax.jms,,9,57,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,9,57,
|
javax.jms,,9,57,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,9,57,
|
||||||
javax.json,,,123,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,100,23
|
javax.json,,,123,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,100,23
|
||||||
javax.management.remote,2,,,,,,,,,,,2,,,,,,,,,,,,,,,,,,,,,,,,,
|
javax.management.remote,2,,,,,,,,,,,2,,,,,,,,,,,,,,,,,,,,,,,,,,
|
||||||
javax.naming,7,,,,,,,,,,,6,1,,,,,,,,,,,,,,,,,,,,,,,,
|
javax.naming,7,,,,,,,,,,,6,1,,,,,,,,,,,,,,,,,,,,,,,,,
|
||||||
javax.net.ssl,2,,,,,,,,,,,,,,,,,,,,,,,,2,,,,,,,,,,,,
|
javax.net.ssl,2,,,,,,,,,,,,,,,,,,,,,,,,2,,,,,,,,,,,,,
|
||||||
javax.script,1,,,,,,,,,,,,,,1,,,,,,,,,,,,,,,,,,,,,,
|
javax.script,1,,,,,,,,,,,,,,1,,,,,,,,,,,,,,,,,,,,,,,
|
||||||
javax.servlet,4,21,2,,,,3,1,,,,,,,,,,,,,,,,,,,,,,,,,,,21,2,
|
javax.servlet,4,21,2,,,,3,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,21,2,
|
||||||
javax.validation,1,1,,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1,,
|
javax.validation,1,1,,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1,,
|
||||||
javax.ws.rs.client,1,,,,,,,,,,,,,,,,1,,,,,,,,,,,,,,,,,,,,
|
javax.ws.rs.client,1,,,,,,,,,,,,,,,,1,,,,,,,,,,,,,,,,,,,,,
|
||||||
javax.ws.rs.container,,9,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,9,,
|
javax.ws.rs.container,,9,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,9,,
|
||||||
javax.ws.rs.core,3,,149,,,,1,,,,,,,,,,,,,,,,,,,,,2,,,,,,,,94,55
|
javax.ws.rs.core,3,,149,,,,1,,,,,,,,,,,,,,,,,,,,,2,,,,,,,,,94,55
|
||||||
javax.xml.transform,1,,6,,,,,,,,,,,,,,,,,,,,,,,,,,,,1,,,,,6,
|
javax.xml.transform,1,,6,,,,,,,,,,,,,,,,,,,,,,,,,,,,1,,,,,,6,
|
||||||
javax.xml.xpath,3,,,,,,,,,,,,,,,,,,,,,,,,,,,,,3,,,,,,,
|
javax.xml.xpath,3,,,,,,,,,,,,,,,,,,,,,,,,,,,,,3,,,,,,,,
|
||||||
jodd.json,,,10,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,10
|
jodd.json,,,10,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,10
|
||||||
kotlin.jvm.internal,,,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1
|
kotlin.jvm.internal,,,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1
|
||||||
net.sf.saxon.s9api,5,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,5,,,,,,
|
net.sf.saxon.s9api,5,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,5,,,,,,,
|
||||||
ognl,6,,,,,,,,,,,,,,,6,,,,,,,,,,,,,,,,,,,,,
|
ognl,6,,,,,,,,,,,,,,,6,,,,,,,,,,,,,,,,,,,,,,
|
||||||
okhttp3,2,,47,,,,,,,,,,,,,,2,,,,,,,,,,,,,,,,,,,22,25
|
okhttp3,2,,47,,,,,,,,,,,,,,2,,,,,,,,,,,,,,,,,,,,22,25
|
||||||
org.apache.commons.codec,,,6,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,6,
|
org.apache.commons.codec,,,6,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,6,
|
||||||
org.apache.commons.collections,,,800,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,17,783
|
org.apache.commons.collections,,,800,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,17,783
|
||||||
org.apache.commons.collections4,,,800,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,17,783
|
org.apache.commons.collections4,,,800,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,17,783
|
||||||
org.apache.commons.io,104,,561,,89,,,,,,,,,,,,15,,,,,,,,,,,,,,,,,,,547,14
|
org.apache.commons.io,104,,561,,89,,,,,,,,,,,,15,,,,,,,,,,,,,,,,,,,,547,14
|
||||||
org.apache.commons.jexl2,15,,,,,,,,,,15,,,,,,,,,,,,,,,,,,,,,,,,,,
|
org.apache.commons.jexl2,15,,,,,,,,,,15,,,,,,,,,,,,,,,,,,,,,,,,,,,
|
||||||
org.apache.commons.jexl3,15,,,,,,,,,,15,,,,,,,,,,,,,,,,,,,,,,,,,,
|
org.apache.commons.jexl3,15,,,,,,,,,,15,,,,,,,,,,,,,,,,,,,,,,,,,,,
|
||||||
org.apache.commons.lang3,,,424,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,293,131
|
org.apache.commons.lang3,,,424,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,293,131
|
||||||
org.apache.commons.logging,6,,,,,,,,,,,,,6,,,,,,,,,,,,,,,,,,,,,,,
|
org.apache.commons.logging,6,,,,,,,,,,,,,6,,,,,,,,,,,,,,,,,,,,,,,,
|
||||||
org.apache.commons.ognl,6,,,,,,,,,,,,,,,6,,,,,,,,,,,,,,,,,,,,,
|
org.apache.commons.ognl,6,,,,,,,,,,,,,,,6,,,,,,,,,,,,,,,,,,,,,,
|
||||||
org.apache.commons.text,,,272,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,220,52
|
org.apache.commons.text,,,272,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,220,52
|
||||||
org.apache.directory.ldap.client.api,1,,,,,,,,,,,,1,,,,,,,,,,,,,,,,,,,,,,,,
|
org.apache.directory.ldap.client.api,1,,,,,,,,,,,,1,,,,,,,,,,,,,,,,,,,,,,,,,
|
||||||
org.apache.hc.core5.function,,,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1,
|
org.apache.hc.core5.function,,,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1,
|
||||||
org.apache.hc.core5.http,1,2,39,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1,,,2,39,
|
org.apache.hc.core5.http,1,2,39,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1,,,,2,39,
|
||||||
org.apache.hc.core5.net,,,2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,2,
|
org.apache.hc.core5.net,,,2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,2,
|
||||||
org.apache.hc.core5.util,,,24,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,18,6
|
org.apache.hc.core5.util,,,24,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,18,6
|
||||||
org.apache.http,27,3,70,,,,,,,,,,,,,,25,,,,,,,,,,,,,,,2,,,3,62,8
|
org.apache.http,27,3,70,,,,,,,,,,,,,,25,,,,,,,,,,,,,,,2,,,,3,62,8
|
||||||
org.apache.ibatis.jdbc,6,,57,,,,,,,,,,,,,,,,,,,,,,,6,,,,,,,,,,57,
|
org.apache.ibatis.jdbc,6,,57,,,,,,,,,,,,,,,,,,,,,,,6,,,,,,,,,,,57,
|
||||||
org.apache.log4j,11,,,,,,,,,,,,,11,,,,,,,,,,,,,,,,,,,,,,,
|
org.apache.log4j,11,,,,,,,,,,,,,11,,,,,,,,,,,,,,,,,,,,,,,,
|
||||||
org.apache.logging.log4j,359,,8,,,,,,,,,,,359,,,,,,,,,,,,,,,,,,,,,,4,4
|
org.apache.logging.log4j,359,,8,,,,,,,,,,,359,,,,,,,,,,,,,,,,,,,,,,,4,4
|
||||||
org.apache.shiro.codec,,,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1,
|
org.apache.shiro.codec,,,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1,
|
||||||
org.apache.shiro.jndi,1,,,,,,,,,,,1,,,,,,,,,,,,,,,,,,,,,,,,,
|
org.apache.shiro.jndi,1,,,,,,,,,,,1,,,,,,,,,,,,,,,,,,,,,,,,,,
|
||||||
org.codehaus.groovy.control,1,,,,,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
|
org.codehaus.groovy.control,1,,,,,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
|
||||||
org.dom4j,20,,,,,,,,,,,,,,,,,,,,,,,,,,,,,20,,,,,,,
|
org.dom4j,20,,,,,,,,,,,,,,,,,,,,,,,,,,,,,20,,,,,,,,
|
||||||
org.hibernate,7,,,,,,,,,,,,,,,,,,,,,,,,,7,,,,,,,,,,,
|
org.hibernate,7,,,,,,,,,,,,,,,,,,,,,,,,,7,,,,,,,,,,,,
|
||||||
org.jboss.logging,324,,,,,,,,,,,,,324,,,,,,,,,,,,,,,,,,,,,,,
|
org.jboss.logging,324,,,,,,,,,,,,,324,,,,,,,,,,,,,,,,,,,,,,,,
|
||||||
org.jdbi.v3.core,6,,,,,,,,,6,,,,,,,,,,,,,,,,,,,,,,,,,,,
|
org.jdbi.v3.core,6,,,,,,,,,6,,,,,,,,,,,,,,,,,,,,,,,,,,,,
|
||||||
org.jooq,1,,,,,,,,,,,,,,,,,,,,,,,,,1,,,,,,,,,,,
|
org.jooq,1,,,,,,,,,,,,,,,,,,,,,,,,,1,,,,,,,,,,,,
|
||||||
org.json,,,236,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,198,38
|
org.json,,,236,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,198,38
|
||||||
org.mvel2,16,,,,,,,,,,,,,,16,,,,,,,,,,,,,,,,,,,,,,
|
org.mvel2,16,,,,,,,,,,,,,,16,,,,,,,,,,,,,,,,,,,,,,,
|
||||||
org.scijava.log,13,,,,,,,,,,,,,13,,,,,,,,,,,,,,,,,,,,,,,
|
org.scijava.log,13,,,,,,,,,,,,,13,,,,,,,,,,,,,,,,,,,,,,,,
|
||||||
org.slf4j,55,,6,,,,,,,,,,,55,,,,,,,,,,,,,,,,,,,,,,2,4
|
org.slf4j,55,,6,,,,,,,,,,,55,,,,,,,,,,,,,,,,,,,,,,,2,4
|
||||||
org.springframework.beans,,,30,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,30
|
org.springframework.beans,,,30,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,30
|
||||||
org.springframework.boot.jdbc,1,,,,,,,,,1,,,,,,,,,,,,,,,,,,,,,,,,,,,
|
org.springframework.boot.jdbc,1,,,,,,,,,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,
|
||||||
org.springframework.cache,,,13,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,13
|
org.springframework.cache,,,13,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,13
|
||||||
org.springframework.context,,,3,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,3,
|
org.springframework.context,,,3,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,3,
|
||||||
org.springframework.http,14,,70,,,,,,,,,,,,,,14,,,,,,,,,,,,,,,,,,,60,10
|
org.springframework.http,14,,70,,,,,,,,,,,,,,14,,,,,,,,,,,,,,,,,,,,60,10
|
||||||
org.springframework.jdbc.core,10,,,,,,,,,,,,,,,,,,,,,,,,,10,,,,,,,,,,,
|
org.springframework.jdbc.core,10,,,,,,,,,,,,,,,,,,,,,,,,,10,,,,,,,,,,,,
|
||||||
org.springframework.jdbc.datasource,4,,,,,,,,,4,,,,,,,,,,,,,,,,,,,,,,,,,,,
|
org.springframework.jdbc.datasource,4,,,,,,,,,4,,,,,,,,,,,,,,,,,,,,,,,,,,,,
|
||||||
org.springframework.jdbc.object,9,,,,,,,,,,,,,,,,,,,,,,,,,9,,,,,,,,,,,
|
org.springframework.jdbc.object,9,,,,,,,,,,,,,,,,,,,,,,,,,9,,,,,,,,,,,,
|
||||||
org.springframework.jndi,1,,,,,,,,,,,1,,,,,,,,,,,,,,,,,,,,,,,,,
|
org.springframework.jndi,1,,,,,,,,,,,1,,,,,,,,,,,,,,,,,,,,,,,,,,
|
||||||
org.springframework.ldap,47,,,,,,,,,,,33,14,,,,,,,,,,,,,,,,,,,,,,,,
|
org.springframework.ldap,47,,,,,,,,,,,33,14,,,,,,,,,,,,,,,,,,,,,,,,,
|
||||||
org.springframework.security.web.savedrequest,,6,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,6,,
|
org.springframework.security.web.savedrequest,,6,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,6,,
|
||||||
org.springframework.ui,,,32,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,32
|
org.springframework.ui,,,32,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,32
|
||||||
org.springframework.util,,,139,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,87,52
|
org.springframework.util,,,139,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,87,52
|
||||||
org.springframework.validation,,,13,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,13,
|
org.springframework.validation,,,13,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,13,
|
||||||
org.springframework.web.client,13,3,,,,,,,,,,,,,,,13,,,,,,,,,,,,,,,,,,3,,
|
org.springframework.web.client,13,3,,,,,,,,,,,,,,,13,,,,,,,,,,,,,,,,,,,3,,
|
||||||
org.springframework.web.context.request,,8,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,8,,
|
org.springframework.web.context.request,,8,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,8,,
|
||||||
org.springframework.web.multipart,,12,13,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,12,13,
|
org.springframework.web.multipart,,12,13,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,12,13,
|
||||||
org.springframework.web.reactive.function.client,2,,,,,,,,,,,,,,,,2,,,,,,,,,,,,,,,,,,,,
|
org.springframework.web.reactive.function.client,2,,,,,,,,,,,,,,,,2,,,,,,,,,,,,,,,,,,,,,
|
||||||
org.springframework.web.util,,,163,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,138,25
|
org.springframework.web.util,,,163,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,138,25
|
||||||
org.xml.sax,,,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1,
|
org.xml.sax,,,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1,
|
||||||
org.xmlpull.v1,,3,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,3,,
|
org.xmlpull.v1,,3,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,3,,
|
||||||
play.mvc,,4,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,4,,
|
play.mvc,,4,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,4,,
|
||||||
ratpack.core.form,,,3,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,3,
|
ratpack.core.form,,,3,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,3,
|
||||||
ratpack.core.handling,,6,4,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,6,4,
|
ratpack.core.handling,,6,4,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,6,4,
|
||||||
ratpack.core.http,,10,10,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,10,10,
|
ratpack.core.http,,10,10,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,10,10,
|
||||||
ratpack.exec,,,48,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,48
|
ratpack.exec,,,48,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,48
|
||||||
ratpack.form,,,3,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,3,
|
ratpack.form,,,3,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,3,
|
||||||
ratpack.func,,,35,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,35
|
ratpack.func,,,35,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,35
|
||||||
ratpack.handling,,6,4,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,6,4,
|
ratpack.handling,,6,4,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,6,4,
|
||||||
ratpack.http,,10,10,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,10,10,
|
ratpack.http,,10,10,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,10,10,
|
||||||
ratpack.util,,,35,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,35
|
ratpack.util,,,35,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,35
|
||||||
retrofit2,1,,,,,,,,,,,,,,,,1,,,,,,,,,,,,,,,,,,,,
|
retrofit2,1,,,,,,,,,,,,,,,,1,,,,,,,,,,,,,,,,,,,,,
|
||||||
|
|||||||
|
@@ -7,7 +7,7 @@ Java framework & library support
|
|||||||
:widths: auto
|
:widths: auto
|
||||||
|
|
||||||
Framework / library,Package,Flow sources,Taint & value steps,Sinks (total),`CWE‑022` :sub:`Path injection`,`CWE‑036` :sub:`Path traversal`,`CWE‑079` :sub:`Cross-site scripting`,`CWE‑089` :sub:`SQL injection`,`CWE‑090` :sub:`LDAP injection`,`CWE‑094` :sub:`Code injection`,`CWE‑319` :sub:`Cleartext transmission`
|
Framework / library,Package,Flow sources,Taint & value steps,Sinks (total),`CWE‑022` :sub:`Path injection`,`CWE‑036` :sub:`Path traversal`,`CWE‑079` :sub:`Cross-site scripting`,`CWE‑089` :sub:`SQL injection`,`CWE‑090` :sub:`LDAP injection`,`CWE‑094` :sub:`Code injection`,`CWE‑319` :sub:`Cleartext transmission`
|
||||||
Android,``android.*``,46,424,108,,,3,67,,,
|
Android,``android.*``,52,424,108,,,3,67,,,
|
||||||
`Apache Commons Collections <https://commons.apache.org/proper/commons-collections/>`_,"``org.apache.commons.collections``, ``org.apache.commons.collections4``",,1600,,,,,,,,
|
`Apache Commons Collections <https://commons.apache.org/proper/commons-collections/>`_,"``org.apache.commons.collections``, ``org.apache.commons.collections4``",,1600,,,,,,,,
|
||||||
`Apache Commons IO <https://commons.apache.org/proper/commons-io/>`_,``org.apache.commons.io``,,561,104,89,,,,,,15
|
`Apache Commons IO <https://commons.apache.org/proper/commons-io/>`_,``org.apache.commons.io``,,561,104,89,,,,,,15
|
||||||
`Apache Commons Lang <https://commons.apache.org/proper/commons-lang/>`_,``org.apache.commons.lang3``,,424,,,,,,,,
|
`Apache Commons Lang <https://commons.apache.org/proper/commons-lang/>`_,``org.apache.commons.lang3``,,424,,,,,,,,
|
||||||
@@ -19,5 +19,5 @@ Java framework & library support
|
|||||||
Java extensions,"``javax.*``, ``jakarta.*``",63,609,32,,,4,,1,1,2
|
Java extensions,"``javax.*``, ``jakarta.*``",63,609,32,,,4,,1,1,2
|
||||||
`Spring <https://spring.io/>`_,``org.springframework.*``,29,476,101,,,,19,14,,29
|
`Spring <https://spring.io/>`_,``org.springframework.*``,29,476,101,,,,19,14,,29
|
||||||
Others,"``androidx.slice``, ``cn.hutool.core.codec``, ``com.esotericsoftware.kryo.io``, ``com.esotericsoftware.kryo5.io``, ``com.fasterxml.jackson.core``, ``com.fasterxml.jackson.databind``, ``com.opensymphony.xwork2.ognl``, ``com.rabbitmq.client``, ``com.unboundid.ldap.sdk``, ``com.zaxxer.hikari``, ``flexjson``, ``groovy.lang``, ``groovy.util``, ``jodd.json``, ``kotlin.jvm.internal``, ``net.sf.saxon.s9api``, ``ognl``, ``okhttp3``, ``org.apache.commons.codec``, ``org.apache.commons.jexl2``, ``org.apache.commons.jexl3``, ``org.apache.commons.logging``, ``org.apache.commons.ognl``, ``org.apache.directory.ldap.client.api``, ``org.apache.ibatis.jdbc``, ``org.apache.log4j``, ``org.apache.logging.log4j``, ``org.apache.shiro.codec``, ``org.apache.shiro.jndi``, ``org.codehaus.groovy.control``, ``org.dom4j``, ``org.hibernate``, ``org.jboss.logging``, ``org.jdbi.v3.core``, ``org.jooq``, ``org.mvel2``, ``org.scijava.log``, ``org.slf4j``, ``org.xml.sax``, ``org.xmlpull.v1``, ``play.mvc``, ``ratpack.core.form``, ``ratpack.core.handling``, ``ratpack.core.http``, ``ratpack.exec``, ``ratpack.form``, ``ratpack.func``, ``ratpack.handling``, ``ratpack.http``, ``ratpack.util``, ``retrofit2``",65,395,932,,,,14,18,,3
|
Others,"``androidx.slice``, ``cn.hutool.core.codec``, ``com.esotericsoftware.kryo.io``, ``com.esotericsoftware.kryo5.io``, ``com.fasterxml.jackson.core``, ``com.fasterxml.jackson.databind``, ``com.opensymphony.xwork2.ognl``, ``com.rabbitmq.client``, ``com.unboundid.ldap.sdk``, ``com.zaxxer.hikari``, ``flexjson``, ``groovy.lang``, ``groovy.util``, ``jodd.json``, ``kotlin.jvm.internal``, ``net.sf.saxon.s9api``, ``ognl``, ``okhttp3``, ``org.apache.commons.codec``, ``org.apache.commons.jexl2``, ``org.apache.commons.jexl3``, ``org.apache.commons.logging``, ``org.apache.commons.ognl``, ``org.apache.directory.ldap.client.api``, ``org.apache.ibatis.jdbc``, ``org.apache.log4j``, ``org.apache.logging.log4j``, ``org.apache.shiro.codec``, ``org.apache.shiro.jndi``, ``org.codehaus.groovy.control``, ``org.dom4j``, ``org.hibernate``, ``org.jboss.logging``, ``org.jdbi.v3.core``, ``org.jooq``, ``org.mvel2``, ``org.scijava.log``, ``org.slf4j``, ``org.xml.sax``, ``org.xmlpull.v1``, ``play.mvc``, ``ratpack.core.form``, ``ratpack.core.handling``, ``ratpack.core.http``, ``ratpack.exec``, ``ratpack.form``, ``ratpack.func``, ``ratpack.handling``, ``ratpack.http``, ``ratpack.util``, ``retrofit2``",65,395,932,,,,14,18,,3
|
||||||
Totals,,211,6410,1474,117,6,10,107,33,1,84
|
Totals,,217,6410,1474,117,6,10,107,33,1,84
|
||||||
|
|
||||||
|
|||||||
@@ -35,8 +35,8 @@ sourceSets {
|
|||||||
"utils/versions/v_1_5_21/*.kt",
|
"utils/versions/v_1_5_21/*.kt",
|
||||||
"utils/versions/v_1_5_31/*.kt",
|
"utils/versions/v_1_5_31/*.kt",
|
||||||
"utils/versions/v_1_6_10/*.kt",
|
"utils/versions/v_1_6_10/*.kt",
|
||||||
"utils/versions/v_1_7_0-RC/*.kt",
|
"utils/versions/v_1_6_20/*.kt",
|
||||||
// "utils/versions/v_1_6_20/*.kt",
|
// "utils/versions/v_1_7_0/*.kt",
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
kotlin.code.style=official
|
kotlin.code.style=official
|
||||||
kotlinVersion=1.6.20
|
kotlinVersion=1.7.0
|
||||||
|
|
||||||
GROUP=com.github.codeql
|
GROUP=com.github.codeql
|
||||||
VERSION_NAME=0.0.1
|
VERSION_NAME=0.0.1
|
||||||
|
|||||||
@@ -21,7 +21,7 @@ def version_string_to_tuple(version):
|
|||||||
m = re.match(r'([0-9]+)\.([0-9]+)\.([0-9]+)(.*)', version)
|
m = re.match(r'([0-9]+)\.([0-9]+)\.([0-9]+)(.*)', version)
|
||||||
return tuple([int(m.group(i)) for i in range(1, 4)] + [m.group(4)])
|
return tuple([int(m.group(i)) for i in range(1, 4)] + [m.group(4)])
|
||||||
|
|
||||||
many_versions = [ '1.4.32', '1.5.0', '1.5.10', '1.5.21', '1.5.31', '1.6.10', '1.7.0-RC', '1.6.20' ]
|
many_versions = [ '1.4.32', '1.5.0', '1.5.10', '1.5.21', '1.5.31', '1.6.10', '1.6.20', '1.7.0' ]
|
||||||
|
|
||||||
many_versions_tuples = [version_string_to_tuple(v) for v in many_versions]
|
many_versions_tuples = [version_string_to_tuple(v) for v in many_versions]
|
||||||
|
|
||||||
|
|||||||
@@ -6,9 +6,11 @@ import com.semmle.extractor.java.OdasaOutput
|
|||||||
import com.semmle.util.data.StringDigestor
|
import com.semmle.util.data.StringDigestor
|
||||||
import org.jetbrains.kotlin.backend.common.extensions.IrPluginContext
|
import org.jetbrains.kotlin.backend.common.extensions.IrPluginContext
|
||||||
import org.jetbrains.kotlin.ir.declarations.*
|
import org.jetbrains.kotlin.ir.declarations.*
|
||||||
|
import org.jetbrains.kotlin.ir.util.fqNameWhenAvailable
|
||||||
import org.jetbrains.kotlin.ir.util.isFileClass
|
import org.jetbrains.kotlin.ir.util.isFileClass
|
||||||
import org.jetbrains.kotlin.ir.util.packageFqName
|
import org.jetbrains.kotlin.ir.util.packageFqName
|
||||||
import org.jetbrains.kotlin.ir.util.parentClassOrNull
|
import org.jetbrains.kotlin.ir.util.parentClassOrNull
|
||||||
|
import org.jetbrains.kotlin.name.FqName
|
||||||
import java.io.File
|
import java.io.File
|
||||||
import java.util.ArrayList
|
import java.util.ArrayList
|
||||||
import java.util.HashSet
|
import java.util.HashSet
|
||||||
@@ -16,18 +18,20 @@ import java.util.zip.GZIPOutputStream
|
|||||||
|
|
||||||
class ExternalDeclExtractor(val logger: FileLogger, val invocationTrapFile: String, val sourceFilePath: String, val primitiveTypeMapping: PrimitiveTypeMapping, val pluginContext: IrPluginContext, val globalExtensionState: KotlinExtractorGlobalState, val diagnosticTrapWriter: TrapWriter) {
|
class ExternalDeclExtractor(val logger: FileLogger, val invocationTrapFile: String, val sourceFilePath: String, val primitiveTypeMapping: PrimitiveTypeMapping, val pluginContext: IrPluginContext, val globalExtensionState: KotlinExtractorGlobalState, val diagnosticTrapWriter: TrapWriter) {
|
||||||
|
|
||||||
val externalDeclsDone = HashSet<IrDeclaration>()
|
val declBinaryNames = HashMap<IrDeclaration, String>()
|
||||||
|
val externalDeclsDone = HashSet<Pair<String, String>>()
|
||||||
val externalDeclWorkList = ArrayList<Pair<IrDeclaration, String>>()
|
val externalDeclWorkList = ArrayList<Pair<IrDeclaration, String>>()
|
||||||
|
|
||||||
val propertySignature = ";property"
|
val propertySignature = ";property"
|
||||||
val fieldSignature = ";field"
|
val fieldSignature = ";field"
|
||||||
|
|
||||||
fun extractLater(d: IrDeclaration, signature: String): Boolean {
|
fun extractLater(d: IrDeclarationWithName, signature: String): Boolean {
|
||||||
if (d !is IrClass && !isExternalFileClassMember(d)) {
|
if (d !is IrClass && !isExternalFileClassMember(d)) {
|
||||||
logger.errorElement("External declaration is neither a class, nor a top-level declaration", d)
|
logger.errorElement("External declaration is neither a class, nor a top-level declaration", d)
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
val ret = externalDeclsDone.add(d)
|
val declBinaryName = declBinaryNames.getOrPut(d) { getIrDeclBinaryName(d) }
|
||||||
|
val ret = externalDeclsDone.add(Pair(declBinaryName, signature))
|
||||||
if (ret) externalDeclWorkList.add(Pair(d, signature))
|
if (ret) externalDeclWorkList.add(Pair(d, signature))
|
||||||
return ret
|
return ret
|
||||||
}
|
}
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@@ -49,7 +49,7 @@ open class KotlinUsesExtractor(
|
|||||||
javaLangObject?.typeWith()
|
javaLangObject?.typeWith()
|
||||||
}
|
}
|
||||||
|
|
||||||
fun usePackage(pkg: String): Label<out DbPackage> {
|
private fun usePackage(pkg: String): Label<out DbPackage> {
|
||||||
return extractPackage(pkg)
|
return extractPackage(pkg)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -154,12 +154,12 @@ open class KotlinUsesExtractor(
|
|||||||
} ?: argsIncludingOuterClasses
|
} ?: argsIncludingOuterClasses
|
||||||
}
|
}
|
||||||
|
|
||||||
fun isStaticClass(c: IrClass) = c.visibility != DescriptorVisibilities.LOCAL && !c.isInner
|
private fun isStaticClass(c: IrClass) = c.visibility != DescriptorVisibilities.LOCAL && !c.isInner
|
||||||
|
|
||||||
// Gets nested inner classes starting at `c` and proceeding outwards to the innermost enclosing static class.
|
// Gets nested inner classes starting at `c` and proceeding outwards to the innermost enclosing static class.
|
||||||
// For example, for (java syntax) `class A { static class B { class C { class D { } } } }`,
|
// For example, for (java syntax) `class A { static class B { class C { class D { } } } }`,
|
||||||
// `nonStaticParentsWithSelf(D)` = `[D, C, B]`.
|
// `nonStaticParentsWithSelf(D)` = `[D, C, B]`.
|
||||||
fun parentsWithTypeParametersInScope(c: IrClass): List<IrDeclarationParent> {
|
private fun parentsWithTypeParametersInScope(c: IrClass): List<IrDeclarationParent> {
|
||||||
val parentsList = c.parentsWithSelf.toList()
|
val parentsList = c.parentsWithSelf.toList()
|
||||||
val firstOuterClassIdx = parentsList.indexOfFirst { it is IrClass && isStaticClass(it) }
|
val firstOuterClassIdx = parentsList.indexOfFirst { it is IrClass && isStaticClass(it) }
|
||||||
return if (firstOuterClassIdx == -1) parentsList else parentsList.subList(0, firstOuterClassIdx + 1)
|
return if (firstOuterClassIdx == -1) parentsList else parentsList.subList(0, firstOuterClassIdx + 1)
|
||||||
@@ -168,14 +168,14 @@ open class KotlinUsesExtractor(
|
|||||||
// Gets the type parameter symbols that are in scope for class `c` in Kotlin order (i.e. for
|
// Gets the type parameter symbols that are in scope for class `c` in Kotlin order (i.e. for
|
||||||
// `class NotInScope<T> { static class OutermostInScope<A, B> { class QueryClass<C, D> { } } }`,
|
// `class NotInScope<T> { static class OutermostInScope<A, B> { class QueryClass<C, D> { } } }`,
|
||||||
// `getTypeParametersInScope(QueryClass)` = `[C, D, A, B]`.
|
// `getTypeParametersInScope(QueryClass)` = `[C, D, A, B]`.
|
||||||
fun getTypeParametersInScope(c: IrClass) =
|
private fun getTypeParametersInScope(c: IrClass) =
|
||||||
parentsWithTypeParametersInScope(c).mapNotNull({ getTypeParameters(it) }).flatten()
|
parentsWithTypeParametersInScope(c).mapNotNull({ getTypeParameters(it) }).flatten()
|
||||||
|
|
||||||
// Returns a map from `c`'s type variables in scope to type arguments `argsIncludingOuterClasses`.
|
// Returns a map from `c`'s type variables in scope to type arguments `argsIncludingOuterClasses`.
|
||||||
// Hack for the time being: the substituted types are always nullable, to prevent downstream code
|
// Hack for the time being: the substituted types are always nullable, to prevent downstream code
|
||||||
// from replacing a generic parameter by a primitive. As and when we extract Kotlin types we will
|
// from replacing a generic parameter by a primitive. As and when we extract Kotlin types we will
|
||||||
// need to track this information in more detail.
|
// need to track this information in more detail.
|
||||||
fun makeTypeGenericSubstitutionMap(c: IrClass, argsIncludingOuterClasses: List<IrTypeArgument>) =
|
private fun makeTypeGenericSubstitutionMap(c: IrClass, argsIncludingOuterClasses: List<IrTypeArgument>) =
|
||||||
getTypeParametersInScope(c).map({ it.symbol }).zip(argsIncludingOuterClasses.map { it.withQuestionMark(true) }).toMap()
|
getTypeParametersInScope(c).map({ it.symbol }).zip(argsIncludingOuterClasses.map { it.withQuestionMark(true) }).toMap()
|
||||||
|
|
||||||
fun makeGenericSubstitutionFunction(c: IrClass, argsIncludingOuterClasses: List<IrTypeArgument>) =
|
fun makeGenericSubstitutionFunction(c: IrClass, argsIncludingOuterClasses: List<IrTypeArgument>) =
|
||||||
@@ -190,7 +190,7 @@ open class KotlinUsesExtractor(
|
|||||||
}
|
}
|
||||||
|
|
||||||
// The Kotlin compiler internal representation of Outer<A, B>.Inner<C, D>.InnerInner<E, F>.someFunction<G, H>.LocalClass<I, J> is LocalClass<I, J, G, H, E, F, C, D, A, B>. This function returns [A, B, C, D, E, F, G, H, I, J].
|
// The Kotlin compiler internal representation of Outer<A, B>.Inner<C, D>.InnerInner<E, F>.someFunction<G, H>.LocalClass<I, J> is LocalClass<I, J, G, H, E, F, C, D, A, B>. This function returns [A, B, C, D, E, F, G, H, I, J].
|
||||||
fun orderTypeArgsLeftToRight(c: IrClass, argsIncludingOuterClasses: List<IrTypeArgument>?): List<IrTypeArgument>? {
|
private fun orderTypeArgsLeftToRight(c: IrClass, argsIncludingOuterClasses: List<IrTypeArgument>?): List<IrTypeArgument>? {
|
||||||
if(argsIncludingOuterClasses.isNullOrEmpty())
|
if(argsIncludingOuterClasses.isNullOrEmpty())
|
||||||
return argsIncludingOuterClasses
|
return argsIncludingOuterClasses
|
||||||
val ret = ArrayList<IrTypeArgument>()
|
val ret = ArrayList<IrTypeArgument>()
|
||||||
@@ -237,15 +237,15 @@ open class KotlinUsesExtractor(
|
|||||||
return UseClassInstanceResult(classTypeResult, extractClass)
|
return UseClassInstanceResult(classTypeResult, extractClass)
|
||||||
}
|
}
|
||||||
|
|
||||||
fun isArray(t: IrSimpleType) = t.isBoxedArray || t.isPrimitiveArray()
|
private fun isArray(t: IrSimpleType) = t.isBoxedArray || t.isPrimitiveArray()
|
||||||
|
|
||||||
fun extractClassLaterIfExternal(c: IrClass) {
|
private fun extractClassLaterIfExternal(c: IrClass) {
|
||||||
if (isExternalDeclaration(c)) {
|
if (isExternalDeclaration(c)) {
|
||||||
extractExternalClassLater(c)
|
extractExternalClassLater(c)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fun extractExternalEnclosingClassLater(d: IrDeclaration) {
|
private fun extractExternalEnclosingClassLater(d: IrDeclaration) {
|
||||||
when (val parent = d.parent) {
|
when (val parent = d.parent) {
|
||||||
is IrClass -> extractExternalClassLater(parent)
|
is IrClass -> extractExternalClassLater(parent)
|
||||||
is IrFunction -> extractExternalEnclosingClassLater(parent)
|
is IrFunction -> extractExternalEnclosingClassLater(parent)
|
||||||
@@ -254,7 +254,7 @@ open class KotlinUsesExtractor(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fun extractPropertyLaterIfExternalFileMember(p: IrProperty) {
|
private fun extractPropertyLaterIfExternalFileMember(p: IrProperty) {
|
||||||
if (isExternalFileClassMember(p)) {
|
if (isExternalFileClassMember(p)) {
|
||||||
extractExternalClassLater(p.parentAsClass)
|
extractExternalClassLater(p.parentAsClass)
|
||||||
dependencyCollector?.addDependency(p, externalClassExtractor.propertySignature)
|
dependencyCollector?.addDependency(p, externalClassExtractor.propertySignature)
|
||||||
@@ -262,7 +262,7 @@ open class KotlinUsesExtractor(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fun extractFieldLaterIfExternalFileMember(f: IrField) {
|
private fun extractFieldLaterIfExternalFileMember(f: IrField) {
|
||||||
if (isExternalFileClassMember(f)) {
|
if (isExternalFileClassMember(f)) {
|
||||||
extractExternalClassLater(f.parentAsClass)
|
extractExternalClassLater(f.parentAsClass)
|
||||||
dependencyCollector?.addDependency(f, externalClassExtractor.fieldSignature)
|
dependencyCollector?.addDependency(f, externalClassExtractor.fieldSignature)
|
||||||
@@ -270,7 +270,7 @@ open class KotlinUsesExtractor(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fun extractFunctionLaterIfExternalFileMember(f: IrFunction) {
|
private fun extractFunctionLaterIfExternalFileMember(f: IrFunction) {
|
||||||
if (isExternalFileClassMember(f)) {
|
if (isExternalFileClassMember(f)) {
|
||||||
extractExternalClassLater(f.parentAsClass)
|
extractExternalClassLater(f.parentAsClass)
|
||||||
(f as? IrSimpleFunction)?.correspondingPropertySymbol?.let {
|
(f as? IrSimpleFunction)?.correspondingPropertySymbol?.let {
|
||||||
@@ -301,7 +301,7 @@ open class KotlinUsesExtractor(
|
|||||||
externalClassExtractor.extractLater(c)
|
externalClassExtractor.extractLater(c)
|
||||||
}
|
}
|
||||||
|
|
||||||
fun tryReplaceAndroidSyntheticClass(c: IrClass): IrClass {
|
private fun tryReplaceAndroidSyntheticClass(c: IrClass): IrClass {
|
||||||
// The Android Kotlin Extensions Gradle plugin introduces synthetic functions, fields and classes. The most
|
// The Android Kotlin Extensions Gradle plugin introduces synthetic functions, fields and classes. The most
|
||||||
// obvious signature is that they lack any supertype information even though they are not root classes.
|
// obvious signature is that they lack any supertype information even though they are not root classes.
|
||||||
// If possible, replace them by a real version of the same class.
|
// If possible, replace them by a real version of the same class.
|
||||||
@@ -503,7 +503,7 @@ open class KotlinUsesExtractor(
|
|||||||
// but returns boxed arrays with a nullable, invariant component type, with any nested arrays
|
// but returns boxed arrays with a nullable, invariant component type, with any nested arrays
|
||||||
// similarly transformed. For example, Array<out Array<in E>> would become Array<Array<E?>?>
|
// similarly transformed. For example, Array<out Array<in E>> would become Array<Array<E?>?>
|
||||||
// Array<*> will become Array<Any?>.
|
// Array<*> will become Array<Any?>.
|
||||||
fun getInvariantNullableArrayType(arrayType: IrSimpleType): IrSimpleType =
|
private fun getInvariantNullableArrayType(arrayType: IrSimpleType): IrSimpleType =
|
||||||
if (arrayType.isPrimitiveArray())
|
if (arrayType.isPrimitiveArray())
|
||||||
arrayType
|
arrayType
|
||||||
else {
|
else {
|
||||||
@@ -528,7 +528,7 @@ open class KotlinUsesExtractor(
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
fun useArrayType(arrayType: IrSimpleType, componentType: IrType, elementType: IrType, dimensions: Int, isPrimitiveArray: Boolean): TypeResults {
|
private fun useArrayType(arrayType: IrSimpleType, componentType: IrType, elementType: IrType, dimensions: Int, isPrimitiveArray: Boolean): TypeResults {
|
||||||
|
|
||||||
// Ensure we extract Array<Int> as Integer[], not int[], for example:
|
// Ensure we extract Array<Int> as Integer[], not int[], for example:
|
||||||
fun nullableIfNotPrimitive(type: IrType) = if (type.isPrimitiveType() && !isPrimitiveArray) type.makeNullable() else type
|
fun nullableIfNotPrimitive(type: IrType) = if (type.isPrimitiveType() && !isPrimitiveArray) type.makeNullable() else type
|
||||||
@@ -579,7 +579,7 @@ open class KotlinUsesExtractor(
|
|||||||
RETURN, GENERIC_ARGUMENT, OTHER
|
RETURN, GENERIC_ARGUMENT, OTHER
|
||||||
}
|
}
|
||||||
|
|
||||||
fun useSimpleType(s: IrSimpleType, context: TypeContext): TypeResults {
|
private fun useSimpleType(s: IrSimpleType, context: TypeContext): TypeResults {
|
||||||
if (s.abbreviation != null) {
|
if (s.abbreviation != null) {
|
||||||
// TODO: Extract this information
|
// TODO: Extract this information
|
||||||
}
|
}
|
||||||
@@ -810,14 +810,14 @@ open class KotlinUsesExtractor(
|
|||||||
return if (f is IrConstructor) f.typeParameters else f.typeParameters.filter { it.parent == f }
|
return if (f is IrConstructor) f.typeParameters else f.typeParameters.filter { it.parent == f }
|
||||||
}
|
}
|
||||||
|
|
||||||
fun getTypeParameters(dp: IrDeclarationParent): List<IrTypeParameter> =
|
private fun getTypeParameters(dp: IrDeclarationParent): List<IrTypeParameter> =
|
||||||
when(dp) {
|
when(dp) {
|
||||||
is IrClass -> dp.typeParameters
|
is IrClass -> dp.typeParameters
|
||||||
is IrFunction -> getFunctionTypeParameters(dp)
|
is IrFunction -> getFunctionTypeParameters(dp)
|
||||||
else -> listOf()
|
else -> listOf()
|
||||||
}
|
}
|
||||||
|
|
||||||
fun getEnclosingClass(it: IrDeclarationParent): IrClass? =
|
private fun getEnclosingClass(it: IrDeclarationParent): IrClass? =
|
||||||
when(it) {
|
when(it) {
|
||||||
is IrClass -> it
|
is IrClass -> it
|
||||||
is IrFunction -> getEnclosingClass(it.parent)
|
is IrFunction -> getEnclosingClass(it.parent)
|
||||||
@@ -924,7 +924,7 @@ open class KotlinUsesExtractor(
|
|||||||
null
|
null
|
||||||
} ?: t
|
} ?: t
|
||||||
|
|
||||||
fun getJavaTypeArgument(jt: JavaType, idx: Int) =
|
private fun getJavaTypeArgument(jt: JavaType, idx: Int) =
|
||||||
when(jt) {
|
when(jt) {
|
||||||
is JavaClassifierType -> jt.typeArguments.getOrNull(idx)
|
is JavaClassifierType -> jt.typeArguments.getOrNull(idx)
|
||||||
is JavaArrayType -> if (idx == 0) jt.componentType else null
|
is JavaArrayType -> if (idx == 0) jt.componentType else null
|
||||||
@@ -1146,15 +1146,6 @@ open class KotlinUsesExtractor(
|
|||||||
return res
|
return res
|
||||||
}
|
}
|
||||||
|
|
||||||
fun <T: DbCallable> useFunctionCommon(f: IrFunction, label: String): Label<out T> {
|
|
||||||
val id: Label<T> = tw.getLabelFor(label)
|
|
||||||
if (isExternalDeclaration(f)) {
|
|
||||||
extractFunctionLaterIfExternalFileMember(f)
|
|
||||||
extractExternalEnclosingClassLater(f)
|
|
||||||
}
|
|
||||||
return id
|
|
||||||
}
|
|
||||||
|
|
||||||
// These are classes with Java equivalents, but whose methods don't all exist on those Java equivalents--
|
// These are classes with Java equivalents, but whose methods don't all exist on those Java equivalents--
|
||||||
// for example, the numeric classes define arithmetic functions (Int.plus, Long.or and so on) that lower to
|
// for example, the numeric classes define arithmetic functions (Int.plus, Long.or and so on) that lower to
|
||||||
// primitive arithmetic on the JVM, but which we extract as calls to reflect the source syntax more closely.
|
// primitive arithmetic on the JVM, but which we extract as calls to reflect the source syntax more closely.
|
||||||
@@ -1162,7 +1153,7 @@ open class KotlinUsesExtractor(
|
|||||||
"kotlin.Boolean", "kotlin.Byte", "kotlin.Char", "kotlin.Double", "kotlin.Float", "kotlin.Int", "kotlin.Long", "kotlin.Number", "kotlin.Short"
|
"kotlin.Boolean", "kotlin.Byte", "kotlin.Char", "kotlin.Double", "kotlin.Float", "kotlin.Int", "kotlin.Long", "kotlin.Number", "kotlin.Short"
|
||||||
)
|
)
|
||||||
|
|
||||||
fun kotlinFunctionToJavaEquivalent(f: IrFunction, noReplace: Boolean) =
|
private fun kotlinFunctionToJavaEquivalent(f: IrFunction, noReplace: Boolean) =
|
||||||
if (noReplace)
|
if (noReplace)
|
||||||
f
|
f
|
||||||
else
|
else
|
||||||
@@ -1210,20 +1201,24 @@ open class KotlinUsesExtractor(
|
|||||||
} as IrFunction? ?: f
|
} as IrFunction? ?: f
|
||||||
|
|
||||||
fun <T: DbCallable> useFunction(f: IrFunction, classTypeArgsIncludingOuterClasses: List<IrTypeArgument>? = null, noReplace: Boolean = false): Label<out T> {
|
fun <T: DbCallable> useFunction(f: IrFunction, classTypeArgsIncludingOuterClasses: List<IrTypeArgument>? = null, noReplace: Boolean = false): Label<out T> {
|
||||||
|
return useFunction(f, null, classTypeArgsIncludingOuterClasses, noReplace)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun <T: DbCallable> useFunction(f: IrFunction, parentId: Label<out DbElement>?, classTypeArgsIncludingOuterClasses: List<IrTypeArgument>?, noReplace: Boolean = false): Label<out T> {
|
||||||
if (f.isLocalFunction()) {
|
if (f.isLocalFunction()) {
|
||||||
val ids = getLocallyVisibleFunctionLabels(f)
|
val ids = getLocallyVisibleFunctionLabels(f)
|
||||||
return ids.function.cast<T>()
|
return ids.function.cast<T>()
|
||||||
} else {
|
|
||||||
val realFunction = kotlinFunctionToJavaEquivalent(f, noReplace)
|
|
||||||
return useFunctionCommon<T>(realFunction, getFunctionLabel(realFunction, classTypeArgsIncludingOuterClasses))
|
|
||||||
}
|
}
|
||||||
|
val javaFun = kotlinFunctionToJavaEquivalent(f, noReplace)
|
||||||
|
val label = getFunctionLabel(javaFun, parentId, classTypeArgsIncludingOuterClasses)
|
||||||
|
val id: Label<T> = tw.getLabelFor(label)
|
||||||
|
if (isExternalDeclaration(javaFun)) {
|
||||||
|
extractFunctionLaterIfExternalFileMember(javaFun)
|
||||||
|
extractExternalEnclosingClassLater(javaFun)
|
||||||
|
}
|
||||||
|
return id
|
||||||
}
|
}
|
||||||
|
|
||||||
fun <T: DbCallable> useFunction(f: IrFunction, parentId: Label<out DbElement>, classTypeArgsIncludingOuterClasses: List<IrTypeArgument>?, noReplace: Boolean = false) =
|
|
||||||
kotlinFunctionToJavaEquivalent(f, noReplace).let {
|
|
||||||
useFunctionCommon<T>(it, getFunctionLabel(it, parentId, classTypeArgsIncludingOuterClasses))
|
|
||||||
}
|
|
||||||
|
|
||||||
fun getTypeArgumentLabel(
|
fun getTypeArgumentLabel(
|
||||||
arg: IrTypeArgument
|
arg: IrTypeArgument
|
||||||
): TypeResult<DbReftype> {
|
): TypeResult<DbReftype> {
|
||||||
@@ -1351,14 +1346,14 @@ open class KotlinUsesExtractor(
|
|||||||
return "@\"typevar;{$parentLabel};${param.name}\""
|
return "@\"typevar;{$parentLabel};${param.name}\""
|
||||||
}
|
}
|
||||||
|
|
||||||
fun useTypeParameter(param: IrTypeParameter) =
|
private fun useTypeParameter(param: IrTypeParameter) =
|
||||||
TypeResult(
|
TypeResult(
|
||||||
tw.getLabelFor<DbTypevariable>(getTypeParameterLabel(param)),
|
tw.getLabelFor<DbTypevariable>(getTypeParameterLabel(param)),
|
||||||
useType(eraseTypeParameter(param)).javaResult.signature,
|
useType(eraseTypeParameter(param)).javaResult.signature,
|
||||||
param.name.asString()
|
param.name.asString()
|
||||||
)
|
)
|
||||||
|
|
||||||
fun extractModifier(m: String): Label<DbModifier> {
|
private fun extractModifier(m: String): Label<DbModifier> {
|
||||||
val modifierLabel = "@\"modifier;$m\""
|
val modifierLabel = "@\"modifier;$m\""
|
||||||
val id: Label<DbModifier> = tw.getLabelFor(modifierLabel, {
|
val id: Label<DbModifier> = tw.getLabelFor(modifierLabel, {
|
||||||
tw.writeModifiers(it, m)
|
tw.writeModifiers(it, m)
|
||||||
@@ -1440,7 +1435,7 @@ open class KotlinUsesExtractor(
|
|||||||
* Note that `Array<T>` is retained (with `T` itself erased) because these are expected to be lowered to Java
|
* Note that `Array<T>` is retained (with `T` itself erased) because these are expected to be lowered to Java
|
||||||
* arrays, which are not generic.
|
* arrays, which are not generic.
|
||||||
*/
|
*/
|
||||||
fun erase (t: IrType): IrType {
|
private fun erase (t: IrType): IrType {
|
||||||
if (t is IrSimpleType) {
|
if (t is IrSimpleType) {
|
||||||
val classifier = t.classifier
|
val classifier = t.classifier
|
||||||
val owner = classifier.owner
|
val owner = classifier.owner
|
||||||
@@ -1464,7 +1459,7 @@ open class KotlinUsesExtractor(
|
|||||||
return t
|
return t
|
||||||
}
|
}
|
||||||
|
|
||||||
fun eraseTypeParameter(t: IrTypeParameter) =
|
private fun eraseTypeParameter(t: IrTypeParameter) =
|
||||||
erase(t.superTypes[0])
|
erase(t.superTypes[0])
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -1493,7 +1488,7 @@ open class KotlinUsesExtractor(
|
|||||||
fun useValueParameter(vp: IrValueParameter, parent: Label<out DbCallable>?): Label<out DbParam> =
|
fun useValueParameter(vp: IrValueParameter, parent: Label<out DbCallable>?): Label<out DbParam> =
|
||||||
tw.getLabelFor(getValueParameterLabel(vp, parent))
|
tw.getLabelFor(getValueParameterLabel(vp, parent))
|
||||||
|
|
||||||
fun isDirectlyExposedCompanionObjectField(f: IrField) =
|
private fun isDirectlyExposedCompanionObjectField(f: IrField) =
|
||||||
f.hasAnnotation(FqName("kotlin.jvm.JvmField")) ||
|
f.hasAnnotation(FqName("kotlin.jvm.JvmField")) ||
|
||||||
f.correspondingPropertySymbol?.owner?.let {
|
f.correspondingPropertySymbol?.owner?.let {
|
||||||
it.isConst || it.isLateinit
|
it.isConst || it.isLateinit
|
||||||
@@ -1519,7 +1514,7 @@ open class KotlinUsesExtractor(
|
|||||||
// otherwise two extension properties declared in the same enclosing context will get
|
// otherwise two extension properties declared in the same enclosing context will get
|
||||||
// clashing trap labels. These are always private, so we can just make up a label without
|
// clashing trap labels. These are always private, so we can just make up a label without
|
||||||
// worrying about their names as seen from Java.
|
// worrying about their names as seen from Java.
|
||||||
val extensionPropertyDiscriminator = getExtensionReceiverType(f)?.let { "extension;${useType(it)}" } ?: ""
|
val extensionPropertyDiscriminator = getExtensionReceiverType(f)?.let { "extension;${useType(it).javaResult.id}" } ?: ""
|
||||||
return "@\"field;{$parentId};${extensionPropertyDiscriminator}${f.name.asString()}\""
|
return "@\"field;{$parentId};${extensionPropertyDiscriminator}${f.name.asString()}\""
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,14 +1,21 @@
|
|||||||
package com.github.codeql
|
package com.github.codeql
|
||||||
|
|
||||||
import org.jetbrains.kotlin.backend.common.extensions.IrPluginContext
|
import org.jetbrains.kotlin.backend.common.extensions.IrPluginContext
|
||||||
|
import org.jetbrains.kotlin.builtins.StandardNames
|
||||||
import org.jetbrains.kotlin.ir.declarations.IrClass
|
import org.jetbrains.kotlin.ir.declarations.IrClass
|
||||||
|
import org.jetbrains.kotlin.ir.declarations.IrPackageFragment
|
||||||
import org.jetbrains.kotlin.ir.types.IrSimpleType
|
import org.jetbrains.kotlin.ir.types.IrSimpleType
|
||||||
import org.jetbrains.kotlin.ir.types.IdSignatureValues
|
import org.jetbrains.kotlin.ir.types.classOrNull
|
||||||
import org.jetbrains.kotlin.ir.util.IdSignature
|
|
||||||
import org.jetbrains.kotlin.name.FqName
|
import org.jetbrains.kotlin.name.FqName
|
||||||
|
|
||||||
class PrimitiveTypeMapping(val logger: Logger, val pluginContext: IrPluginContext) {
|
class PrimitiveTypeMapping(val logger: Logger, val pluginContext: IrPluginContext) {
|
||||||
fun getPrimitiveInfo(s: IrSimpleType) = mapping[s.classifier.signature]
|
fun getPrimitiveInfo(s: IrSimpleType) =
|
||||||
|
s.classOrNull?.let {
|
||||||
|
if ((it.owner.parent as? IrPackageFragment)?.fqName == StandardNames.BUILT_INS_PACKAGE_FQ_NAME)
|
||||||
|
mapping[it.owner.name]
|
||||||
|
else
|
||||||
|
null
|
||||||
|
}
|
||||||
|
|
||||||
data class PrimitiveTypeInfo(
|
data class PrimitiveTypeInfo(
|
||||||
val primitiveName: String?,
|
val primitiveName: String?,
|
||||||
@@ -60,25 +67,25 @@ class PrimitiveTypeMapping(val logger: Logger, val pluginContext: IrPluginContex
|
|||||||
val javaLangVoid = findClass("java.lang.Void", kotlinNothing)
|
val javaLangVoid = findClass("java.lang.Void", kotlinNothing)
|
||||||
|
|
||||||
mapOf(
|
mapOf(
|
||||||
IdSignatureValues._byte to PrimitiveTypeInfo("byte", true, javaLangByte, "kotlin", "Byte"),
|
StandardNames.FqNames._byte.shortName() to PrimitiveTypeInfo("byte", true, javaLangByte, "kotlin", "Byte"),
|
||||||
IdSignatureValues._short to PrimitiveTypeInfo("short", true, javaLangShort, "kotlin", "Short"),
|
StandardNames.FqNames._short.shortName() to PrimitiveTypeInfo("short", true, javaLangShort, "kotlin", "Short"),
|
||||||
IdSignatureValues._int to PrimitiveTypeInfo("int", true, javaLangInteger, "kotlin", "Int"),
|
StandardNames.FqNames._int.shortName() to PrimitiveTypeInfo("int", true, javaLangInteger, "kotlin", "Int"),
|
||||||
IdSignatureValues._long to PrimitiveTypeInfo("long", true, javaLangLong, "kotlin", "Long"),
|
StandardNames.FqNames._long.shortName() to PrimitiveTypeInfo("long", true, javaLangLong, "kotlin", "Long"),
|
||||||
|
|
||||||
IdSignatureValues.uByte to PrimitiveTypeInfo("byte", true, kotlinUByte, "kotlin", "UByte"),
|
StandardNames.FqNames.uByteFqName.shortName() to PrimitiveTypeInfo("byte", true, kotlinUByte, "kotlin", "UByte"),
|
||||||
IdSignatureValues.uShort to PrimitiveTypeInfo("short", true, kotlinUShort, "kotlin", "UShort"),
|
StandardNames.FqNames.uShortFqName.shortName() to PrimitiveTypeInfo("short", true, kotlinUShort, "kotlin", "UShort"),
|
||||||
IdSignatureValues.uInt to PrimitiveTypeInfo("int", true, kotlinUInt, "kotlin", "UInt"),
|
StandardNames.FqNames.uIntFqName.shortName() to PrimitiveTypeInfo("int", true, kotlinUInt, "kotlin", "UInt"),
|
||||||
IdSignatureValues.uLong to PrimitiveTypeInfo("long", true, kotlinULong, "kotlin", "ULong"),
|
StandardNames.FqNames.uLongFqName.shortName() to PrimitiveTypeInfo("long", true, kotlinULong, "kotlin", "ULong"),
|
||||||
|
|
||||||
IdSignatureValues._double to PrimitiveTypeInfo("double", true, javaLangDouble, "kotlin", "Double"),
|
StandardNames.FqNames._double.shortName() to PrimitiveTypeInfo("double", true, javaLangDouble, "kotlin", "Double"),
|
||||||
IdSignatureValues._float to PrimitiveTypeInfo("float", true, javaLangFloat, "kotlin", "Float"),
|
StandardNames.FqNames._float.shortName() to PrimitiveTypeInfo("float", true, javaLangFloat, "kotlin", "Float"),
|
||||||
|
|
||||||
IdSignatureValues._boolean to PrimitiveTypeInfo("boolean", true, javaLangBoolean, "kotlin", "Boolean"),
|
StandardNames.FqNames._boolean.shortName() to PrimitiveTypeInfo("boolean", true, javaLangBoolean, "kotlin", "Boolean"),
|
||||||
|
|
||||||
IdSignatureValues._char to PrimitiveTypeInfo("char", true, javaLangCharacter, "kotlin", "Char"),
|
StandardNames.FqNames._char.shortName() to PrimitiveTypeInfo("char", true, javaLangCharacter, "kotlin", "Char"),
|
||||||
|
|
||||||
IdSignatureValues.unit to PrimitiveTypeInfo("void", false, kotlinUnit, "kotlin", "Unit"),
|
StandardNames.FqNames.unit.shortName() to PrimitiveTypeInfo("void", false, kotlinUnit, "kotlin", "Unit"),
|
||||||
IdSignatureValues.nothing to PrimitiveTypeInfo(null, true, javaLangVoid, "kotlin", "Nothing"),
|
StandardNames.FqNames.nothing.shortName() to PrimitiveTypeInfo(null, true, javaLangVoid, "kotlin", "Nothing"),
|
||||||
)
|
)
|
||||||
}()
|
}()
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -40,4 +40,4 @@ fun AutoCloseable?.closeFinallyAC(cause: Throwable?) = when {
|
|||||||
} catch (closeException: Throwable) {
|
} catch (closeException: Throwable) {
|
||||||
cause.addSuppressed(closeException)
|
cause.addSuppressed(closeException)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -68,7 +68,7 @@ fun getIrClassVirtualFile(irClass: IrClass): VirtualFile? {
|
|||||||
return null
|
return null
|
||||||
}
|
}
|
||||||
|
|
||||||
fun getRawIrClassBinaryPath(irClass: IrClass) =
|
private fun getRawIrClassBinaryPath(irClass: IrClass) =
|
||||||
getIrClassVirtualFile(irClass)?.let {
|
getIrClassVirtualFile(irClass)?.let {
|
||||||
val path = it.path
|
val path = it.path
|
||||||
if(it.fileSystem.protocol == StandardFileSystems.JRT_PROTOCOL)
|
if(it.fileSystem.protocol == StandardFileSystems.JRT_PROTOCOL)
|
||||||
@@ -92,4 +92,4 @@ fun getContainingClassOrSelf(decl: IrDeclaration): IrClass? {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fun getJavaEquivalentClassId(c: IrClass) =
|
fun getJavaEquivalentClassId(c: IrClass) =
|
||||||
c.fqNameWhenAvailable?.toUnsafe()?.let { JavaToKotlinClassMap.mapKotlinToJava(it) }
|
c.fqNameWhenAvailable?.toUnsafe()?.let { JavaToKotlinClassMap.mapKotlinToJava(it) }
|
||||||
|
|||||||
@@ -55,7 +55,7 @@ private val specialFunctions = mapOf(
|
|||||||
|
|
||||||
private val specialFunctionShortNames = specialFunctions.keys.map { it.functionName }.toSet()
|
private val specialFunctionShortNames = specialFunctions.keys.map { it.functionName }.toSet()
|
||||||
|
|
||||||
fun getSpecialJvmName(f: IrFunction): String? {
|
private fun getSpecialJvmName(f: IrFunction): String? {
|
||||||
if (specialFunctionShortNames.contains(f.name) && f is IrSimpleFunction) {
|
if (specialFunctionShortNames.contains(f.name) && f is IrSimpleFunction) {
|
||||||
f.allOverridden(true).forEach { overriddenFunc ->
|
f.allOverridden(true).forEach { overriddenFunc ->
|
||||||
overriddenFunc.parentClassOrNull?.fqNameWhenAvailable?.let { parentFqName ->
|
overriddenFunc.parentClassOrNull?.fqNameWhenAvailable?.let { parentFqName ->
|
||||||
@@ -87,4 +87,4 @@ fun getJvmName(container: IrAnnotationContainer): String? {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
return (container as? IrFunction)?.let { getSpecialJvmName(container) }
|
return (container as? IrFunction)?.let { getSpecialJvmName(container) }
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -207,20 +207,6 @@ open class LoggerBase(val logCounter: LogCounter) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
open class Logger(val loggerBase: LoggerBase, open val tw: TrapWriter) {
|
open class Logger(val loggerBase: LoggerBase, open val tw: TrapWriter) {
|
||||||
private fun getDiagnosticLocation(): String? {
|
|
||||||
val st = Exception().stackTrace
|
|
||||||
for(x in st) {
|
|
||||||
when(x.className) {
|
|
||||||
"com.github.codeql.Logger",
|
|
||||||
"com.github.codeql.FileLogger" -> {}
|
|
||||||
else -> {
|
|
||||||
return x.toString()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return null
|
|
||||||
}
|
|
||||||
|
|
||||||
fun flush() {
|
fun flush() {
|
||||||
tw.flush()
|
tw.flush()
|
||||||
loggerBase.flush()
|
loggerBase.flush()
|
||||||
@@ -240,7 +226,7 @@ open class Logger(val loggerBase: LoggerBase, open val tw: TrapWriter) {
|
|||||||
loggerBase.info(tw, msg)
|
loggerBase.info(tw, msg)
|
||||||
}
|
}
|
||||||
|
|
||||||
fun warn(msg: String, extraInfo: String?) {
|
private fun warn(msg: String, extraInfo: String?) {
|
||||||
loggerBase.warn(tw, msg, extraInfo)
|
loggerBase.warn(tw, msg, extraInfo)
|
||||||
}
|
}
|
||||||
fun warn(msg: String, exn: Throwable) {
|
fun warn(msg: String, exn: Throwable) {
|
||||||
@@ -250,7 +236,7 @@ open class Logger(val loggerBase: LoggerBase, open val tw: TrapWriter) {
|
|||||||
warn(msg, null)
|
warn(msg, null)
|
||||||
}
|
}
|
||||||
|
|
||||||
fun error(msg: String, extraInfo: String?) {
|
private fun error(msg: String, extraInfo: String?) {
|
||||||
loggerBase.error(tw, msg, extraInfo)
|
loggerBase.error(tw, msg, extraInfo)
|
||||||
}
|
}
|
||||||
fun error(msg: String) {
|
fun error(msg: String) {
|
||||||
|
|||||||
@@ -37,7 +37,7 @@ fun IrType.substituteTypeArguments(params: List<IrTypeParameter>, arguments: Lis
|
|||||||
else -> this
|
else -> this
|
||||||
}
|
}
|
||||||
|
|
||||||
fun IrSimpleType.substituteTypeArguments(substitutionMap: Map<IrTypeParameterSymbol, IrTypeArgument>): IrSimpleType {
|
private fun IrSimpleType.substituteTypeArguments(substitutionMap: Map<IrTypeParameterSymbol, IrTypeArgument>): IrSimpleType {
|
||||||
if (substitutionMap.isEmpty()) return this
|
if (substitutionMap.isEmpty()) return this
|
||||||
|
|
||||||
val newArguments = arguments.map {
|
val newArguments = arguments.map {
|
||||||
@@ -100,7 +100,7 @@ private fun subProjectedType(substitutionMap: Map<IrTypeParameterSymbol, IrTypeA
|
|||||||
}
|
}
|
||||||
} ?: makeTypeProjection(t.substituteTypeArguments(substitutionMap), outerVariance)
|
} ?: makeTypeProjection(t.substituteTypeArguments(substitutionMap), outerVariance)
|
||||||
|
|
||||||
fun IrTypeArgument.upperBound(context: IrPluginContext) =
|
private fun IrTypeArgument.upperBound(context: IrPluginContext) =
|
||||||
when(this) {
|
when(this) {
|
||||||
is IrStarProjection -> context.irBuiltIns.anyNType
|
is IrStarProjection -> context.irBuiltIns.anyNType
|
||||||
is IrTypeProjection -> when(this.variance) {
|
is IrTypeProjection -> when(this.variance) {
|
||||||
@@ -111,7 +111,7 @@ fun IrTypeArgument.upperBound(context: IrPluginContext) =
|
|||||||
else -> context.irBuiltIns.anyNType
|
else -> context.irBuiltIns.anyNType
|
||||||
}
|
}
|
||||||
|
|
||||||
fun IrTypeArgument.lowerBound(context: IrPluginContext) =
|
private fun IrTypeArgument.lowerBound(context: IrPluginContext) =
|
||||||
when(this) {
|
when(this) {
|
||||||
is IrStarProjection -> context.irBuiltIns.nothingType
|
is IrStarProjection -> context.irBuiltIns.nothingType
|
||||||
is IrTypeProjection -> when(this.variance) {
|
is IrTypeProjection -> when(this.variance) {
|
||||||
@@ -200,7 +200,7 @@ fun IrTypeArgument.withQuestionMark(b: Boolean): IrTypeArgument =
|
|||||||
|
|
||||||
typealias TypeSubstitution = (IrType, KotlinUsesExtractor.TypeContext, IrPluginContext) -> IrType
|
typealias TypeSubstitution = (IrType, KotlinUsesExtractor.TypeContext, IrPluginContext) -> IrType
|
||||||
|
|
||||||
fun matchingTypeParameters(l: IrTypeParameter?, r: IrTypeParameter): Boolean {
|
private fun matchingTypeParameters(l: IrTypeParameter?, r: IrTypeParameter): Boolean {
|
||||||
if (l === r)
|
if (l === r)
|
||||||
return true
|
return true
|
||||||
if (l == null)
|
if (l == null)
|
||||||
|
|||||||
@@ -1,9 +0,0 @@
|
|||||||
package com.github.codeql.utils.versions
|
|
||||||
|
|
||||||
import com.github.codeql.KotlinUsesExtractor
|
|
||||||
import org.jetbrains.kotlin.ir.util.DeclarationStubGenerator
|
|
||||||
|
|
||||||
fun <TIrStub> KotlinUsesExtractor.getIrStubFromDescriptor(generateStub: (DeclarationStubGenerator) -> TIrStub) : TIrStub? {
|
|
||||||
logger.error("Descriptors not yet supported for Kotlin 1.7")
|
|
||||||
return null
|
|
||||||
}
|
|
||||||
@@ -0,0 +1,27 @@
|
|||||||
|
package com.github.codeql.utils.versions
|
||||||
|
|
||||||
|
import com.github.codeql.KotlinUsesExtractor
|
||||||
|
import org.jetbrains.kotlin.backend.common.serialization.DescriptorByIdSignatureFinderImpl
|
||||||
|
import org.jetbrains.kotlin.idea.MainFunctionDetector
|
||||||
|
import org.jetbrains.kotlin.ir.ObsoleteDescriptorBasedAPI
|
||||||
|
import org.jetbrains.kotlin.ir.backend.jvm.serialization.JvmDescriptorMangler
|
||||||
|
import org.jetbrains.kotlin.ir.util.DeclarationStubGenerator
|
||||||
|
import org.jetbrains.kotlin.ir.util.SymbolTable
|
||||||
|
import org.jetbrains.kotlin.psi2ir.generators.DeclarationStubGeneratorImpl
|
||||||
|
|
||||||
|
@OptIn(ObsoleteDescriptorBasedAPI::class)
|
||||||
|
fun <TIrStub> KotlinUsesExtractor.getIrStubFromDescriptor(generateStub: (DeclarationStubGenerator) -> TIrStub) : TIrStub? =
|
||||||
|
(pluginContext.symbolTable as? SymbolTable) ?.let {
|
||||||
|
// Copying the construction seen in JvmIrLinker.kt
|
||||||
|
val mangler = JvmDescriptorMangler(MainFunctionDetector(pluginContext.bindingContext, pluginContext.languageVersionSettings))
|
||||||
|
val descriptorFinder = DescriptorByIdSignatureFinderImpl(
|
||||||
|
pluginContext.moduleDescriptor,
|
||||||
|
mangler,
|
||||||
|
DescriptorByIdSignatureFinderImpl.LookupMode.MODULE_ONLY
|
||||||
|
)
|
||||||
|
val stubGenerator = DeclarationStubGeneratorImpl(pluginContext.moduleDescriptor, it, pluginContext.irBuiltIns, descriptorFinder)
|
||||||
|
generateStub(stubGenerator)
|
||||||
|
} ?: run {
|
||||||
|
logger.error("Plugin context has no symbol table, couldn't get IR stub")
|
||||||
|
null
|
||||||
|
}
|
||||||
@@ -1,5 +1,10 @@
|
|||||||
import java
|
import java
|
||||||
|
|
||||||
from MethodAccess ma
|
from MethodAccess ma
|
||||||
where not exists(ma.getQualifier()) and ma.getFile().isKotlinSourceFile()
|
// Generally Kotlin calls will always use an explicit qualifier, except for calls
|
||||||
|
// to the synthetic instance initializer <obinit>, which use an implicit `this`.
|
||||||
|
where
|
||||||
|
not exists(ma.getQualifier()) and
|
||||||
|
ma.getFile().isKotlinSourceFile() and
|
||||||
|
not ma.getCallee() instanceof InstanceInitializer
|
||||||
select ma
|
select ma
|
||||||
|
|||||||
@@ -0,0 +1,83 @@
|
|||||||
|
a.kt:
|
||||||
|
# 0| [CompilationUnit] a
|
||||||
|
# 1| 1: [Class] A
|
||||||
|
# 0| 1: [Method] <fn>
|
||||||
|
# 0| 3: [TypeAccess] int
|
||||||
|
# 0| 5: [BlockStmt] { ... }
|
||||||
|
# 0| 0: [ReturnStmt] return ...
|
||||||
|
# 0| 0: [IntegerLiteral] 42
|
||||||
|
# 1| 2: [Constructor] A
|
||||||
|
# 1| 5: [BlockStmt] { ... }
|
||||||
|
# 1| 0: [SuperConstructorInvocationStmt] super(...)
|
||||||
|
# 1| 1: [BlockStmt] { ... }
|
||||||
|
# 2| 3: [Method] f1
|
||||||
|
# 2| 3: [TypeAccess] int
|
||||||
|
# 2| 5: [BlockStmt] { ... }
|
||||||
|
# 2| 0: [ReturnStmt] return ...
|
||||||
|
# 2| 0: [IntegerLiteral] 1
|
||||||
|
b.kt:
|
||||||
|
# 0| [CompilationUnit] b
|
||||||
|
# 1| 1: [Class] B
|
||||||
|
# 0| 1: [Method] <fn>
|
||||||
|
# 0| 3: [TypeAccess] int
|
||||||
|
# 0| 5: [BlockStmt] { ... }
|
||||||
|
# 0| 0: [ReturnStmt] return ...
|
||||||
|
# 0| 0: [UnsafeCoerceExpr] <unsafe coerce>
|
||||||
|
# 0| 0: [TypeAccess] int
|
||||||
|
# 0| 1: [IntegerLiteral] 1
|
||||||
|
# 1| 2: [Constructor] B
|
||||||
|
# 1| 5: [BlockStmt] { ... }
|
||||||
|
# 1| 0: [SuperConstructorInvocationStmt] super(...)
|
||||||
|
# 1| 1: [BlockStmt] { ... }
|
||||||
|
c.kt:
|
||||||
|
# 0| [CompilationUnit] c
|
||||||
|
# 1| 1: [Class] C
|
||||||
|
# 0| 1: [Method] <fn>
|
||||||
|
# 0| 3: [TypeAccess] Unit
|
||||||
|
#-----| 4: (Parameters)
|
||||||
|
# 0| 0: [Parameter] param
|
||||||
|
# 0| 0: [TypeAccess] ProcessBuilder
|
||||||
|
# 0| 5: [BlockStmt] { ... }
|
||||||
|
# 0| 0: [ReturnStmt] return ...
|
||||||
|
# 0| 0: [MethodAccess] start(...)
|
||||||
|
# 0| -1: [VarAccess] param
|
||||||
|
# 1| 2: [Constructor] C
|
||||||
|
# 1| 5: [BlockStmt] { ... }
|
||||||
|
# 1| 0: [SuperConstructorInvocationStmt] super(...)
|
||||||
|
# 1| 1: [BlockStmt] { ... }
|
||||||
|
d.kt:
|
||||||
|
# 0| [CompilationUnit] d
|
||||||
|
# 1| 1: [Class] D
|
||||||
|
# 0| 2: [FieldDeclaration] String bar;
|
||||||
|
# 0| -1: [TypeAccess] String
|
||||||
|
# 0| 0: [StringLiteral] Foobar
|
||||||
|
# 1| 3: [Constructor] D
|
||||||
|
# 1| 5: [BlockStmt] { ... }
|
||||||
|
# 1| 0: [SuperConstructorInvocationStmt] super(...)
|
||||||
|
# 1| 1: [BlockStmt] { ... }
|
||||||
|
e.kt:
|
||||||
|
# 0| [CompilationUnit] e
|
||||||
|
# 1| 1: [Class] E
|
||||||
|
# 0| 1: [Method] <fn_ArrayListAdd>
|
||||||
|
# 0| 3: [TypeAccess] boolean
|
||||||
|
# 0| 5: [BlockStmt] { ... }
|
||||||
|
# 0| 0: [ReturnStmt] return ...
|
||||||
|
# 0| 0: [MethodAccess] add(...)
|
||||||
|
# 0| -1: [ClassInstanceExpr] new ArrayList<Object>(...)
|
||||||
|
# 0| -3: [TypeAccess] ArrayList<Object>
|
||||||
|
# 0| 0: [IntegerLiteral] 1
|
||||||
|
# 0| 0: [NullLiteral] null
|
||||||
|
# 0| 2: [Method] <fn_LinkedHashMap>
|
||||||
|
# 0| 3: [TypeAccess] Object
|
||||||
|
# 0| 5: [BlockStmt] { ... }
|
||||||
|
# 0| 0: [ReturnStmt] return ...
|
||||||
|
# 0| 0: [MethodAccess] put(...)
|
||||||
|
# 0| -1: [ClassInstanceExpr] new LinkedHashMap<Object,Object>(...)
|
||||||
|
# 0| -3: [TypeAccess] LinkedHashMap<Object,Object>
|
||||||
|
# 0| 0: [IntegerLiteral] 1
|
||||||
|
# 0| 0: [NullLiteral] null
|
||||||
|
# 0| 1: [NullLiteral] null
|
||||||
|
# 1| 3: [Constructor] E
|
||||||
|
# 1| 5: [BlockStmt] { ... }
|
||||||
|
# 1| 0: [SuperConstructorInvocationStmt] super(...)
|
||||||
|
# 1| 1: [BlockStmt] { ... }
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
semmle/code/java/PrintAst.ql
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
class A {
|
||||||
|
fun f1() = 1
|
||||||
|
}
|
||||||
@@ -0,0 +1,2 @@
|
|||||||
|
class B {
|
||||||
|
}
|
||||||
53
java/ql/integration-tests/linux-only/kotlin/custom_plugin/build_plugin
Executable file
53
java/ql/integration-tests/linux-only/kotlin/custom_plugin/build_plugin
Executable file
@@ -0,0 +1,53 @@
|
|||||||
|
#!/usr/bin/env python3
|
||||||
|
|
||||||
|
import subprocess
|
||||||
|
import shutil
|
||||||
|
import os
|
||||||
|
import os.path
|
||||||
|
import sys
|
||||||
|
import shlex
|
||||||
|
|
||||||
|
|
||||||
|
def run_process(cmd):
|
||||||
|
try:
|
||||||
|
print("Running command: " + shlex.join(cmd))
|
||||||
|
return subprocess.run(cmd, check=True, capture_output=True)
|
||||||
|
except subprocess.CalledProcessError as e:
|
||||||
|
print("In: " + os.getcwd(), file=sys.stderr)
|
||||||
|
print("Command failed: " + shlex.join(cmd), file=sys.stderr)
|
||||||
|
print("stdout output:\n" + e.stdout.decode(encoding='UTF-8',
|
||||||
|
errors='strict'), file=sys.stderr)
|
||||||
|
print("stderr output:\n" + e.stderr.decode(encoding='UTF-8',
|
||||||
|
errors='strict'), file=sys.stderr)
|
||||||
|
raise e
|
||||||
|
|
||||||
|
root = '../../../../../../../../..'
|
||||||
|
|
||||||
|
sys.path.append(root + '/ql/java/kotlin-extractor')
|
||||||
|
import kotlin_plugin_versions
|
||||||
|
defaultKotlinDependencyVersion = kotlin_plugin_versions.get_single_version()
|
||||||
|
|
||||||
|
builddir = 'build'
|
||||||
|
dependency_dir = root + '/resources/kotlin-dependencies/'
|
||||||
|
dependencies = ['kotlin-stdlib-' + defaultKotlinDependencyVersion +
|
||||||
|
'.jar', 'kotlin-compiler-' + defaultKotlinDependencyVersion + '.jar']
|
||||||
|
classpath = ':'.join([dependency_dir + dep for dep in dependencies])
|
||||||
|
srcs = ['plugin/Plugin.kt']
|
||||||
|
output = 'plugin.jar'
|
||||||
|
|
||||||
|
if os.path.exists(builddir):
|
||||||
|
shutil.rmtree(builddir)
|
||||||
|
os.makedirs(builddir)
|
||||||
|
|
||||||
|
run_process(['kotlinc',
|
||||||
|
'-J-Xmx2G',
|
||||||
|
'-d', builddir,
|
||||||
|
'-module-name', 'test',
|
||||||
|
'-no-reflect', '-no-stdlib',
|
||||||
|
'-jvm-target', '1.8',
|
||||||
|
'-classpath', classpath] + srcs)
|
||||||
|
|
||||||
|
run_process(['jar', '-c', '-f', output,
|
||||||
|
'-C', builddir, '.',
|
||||||
|
'-C', 'plugin/resources', 'META-INF'])
|
||||||
|
shutil.rmtree(builddir)
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
class C { }
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
class D { }
|
||||||
@@ -0,0 +1,2 @@
|
|||||||
|
| CodeQL Kotlin extractor | 2 | | IrProperty without a getter | d.kt:0:0:0:0 | d.kt:0:0:0:0 |
|
||||||
|
| CodeQL Kotlin extractor | 2 | | Not rewriting trap file for: Boolean -1.0-0- -1.0-0-null test-db/trap/java/classes/kotlin/Boolean.members.trap.gz | file://:0:0:0:0 | file://:0:0:0:0 |
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user