diff --git a/actions/ql/src/codeql-suites/actions-ccr.qls b/actions/ql/src/codeql-suites/actions-code-quality.qls
similarity index 100%
rename from actions/ql/src/codeql-suites/actions-ccr.qls
rename to actions/ql/src/codeql-suites/actions-code-quality.qls
diff --git a/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/SsaInternals.qll b/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/SsaInternals.qll
index df919b42c9d..9cf8f8806a2 100644
--- a/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/SsaInternals.qll
+++ b/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/SsaInternals.qll
@@ -1007,9 +1007,11 @@ private module DataFlowIntegrationInput implements SsaImpl::DataFlowIntegrationI
}
}
- predicate guardControlsBlock(Guard guard, SsaInput::BasicBlock bb, boolean branch) {
+ predicate guardDirectlyControlsBlock(Guard guard, SsaInput::BasicBlock bb, boolean branch) {
guard.(IRGuards::IRGuardCondition).controls(bb, branch)
}
+
+ predicate keepAllPhiInputBackEdges() { any() }
}
private module DataFlowIntegrationImpl = SsaImpl::DataFlowIntegration;
diff --git a/cpp/ql/src/Diagnostics/ExtractionWarnings.ql b/cpp/ql/src/Diagnostics/ExtractionWarnings.ql
index dcfb599bbeb..f32768734ca 100644
--- a/cpp/ql/src/Diagnostics/ExtractionWarnings.ql
+++ b/cpp/ql/src/Diagnostics/ExtractionWarnings.ql
@@ -14,5 +14,5 @@ where
or
warning instanceof ExtractionUnknownProblem
select warning,
- "Extraction failed in " + warning.getFile() + " with warning " + warning.getProblemMessage(),
- warning.getSeverity()
+ "Extraction failed in " + warning.getFile() + " with warning " +
+ warning.getProblemMessage().replaceAll("$", "$$"), warning.getSeverity()
diff --git a/cpp/ql/src/Diagnostics/Internal/ExtractionErrors.ql b/cpp/ql/src/Diagnostics/Internal/ExtractionErrors.ql
index c7eac620b3b..9da14fbfb46 100644
--- a/cpp/ql/src/Diagnostics/Internal/ExtractionErrors.ql
+++ b/cpp/ql/src/Diagnostics/Internal/ExtractionErrors.ql
@@ -17,5 +17,6 @@ from ExtractionError error
where
error instanceof ExtractionUnknownError or
exists(error.getFile().getRelativePath())
-select error, "Extraction failed in " + error.getFile() + " with error " + error.getErrorMessage(),
- error.getSeverity()
+select error,
+ "Extraction failed in " + error.getFile() + " with error " +
+ error.getErrorMessage().replaceAll("$", "$$"), error.getSeverity()
diff --git a/cpp/ql/src/codeql-suites/cpp-ccr.qls b/cpp/ql/src/codeql-suites/cpp-code-quality.qls
similarity index 100%
rename from cpp/ql/src/codeql-suites/cpp-ccr.qls
rename to cpp/ql/src/codeql-suites/cpp-code-quality.qls
diff --git a/cpp/ql/test/library-tests/dataflow/dataflow-tests/localFlow-ir.expected b/cpp/ql/test/library-tests/dataflow/dataflow-tests/localFlow-ir.expected
index 85ef90b127d..513c23e3c6e 100644
--- a/cpp/ql/test/library-tests/dataflow/dataflow-tests/localFlow-ir.expected
+++ b/cpp/ql/test/library-tests/dataflow/dataflow-tests/localFlow-ir.expected
@@ -68,31 +68,23 @@
| test.cpp:10:8:10:9 | t2 | test.cpp:11:7:11:8 | [input] SSA phi read(t2) |
| test.cpp:10:8:10:9 | t2 | test.cpp:11:7:11:8 | [input] SSA phi(*t2) |
| test.cpp:10:8:10:9 | t2 | test.cpp:13:10:13:11 | t2 |
-| test.cpp:11:7:11:8 | [input] SSA phi read(t2) | test.cpp:15:3:15:6 | SSA phi read(t2) |
-| test.cpp:11:7:11:8 | [input] SSA phi(*t2) | test.cpp:15:3:15:6 | SSA phi(*t2) |
+| test.cpp:11:7:11:8 | [input] SSA phi read(t2) | test.cpp:15:8:15:9 | t2 |
+| test.cpp:11:7:11:8 | [input] SSA phi(*t2) | test.cpp:15:8:15:9 | t2 |
| test.cpp:11:7:11:8 | t1 | test.cpp:21:8:21:9 | t1 |
| test.cpp:12:5:12:10 | ... = ... | test.cpp:13:10:13:11 | t2 |
| test.cpp:12:10:12:10 | 0 | test.cpp:12:5:12:10 | ... = ... |
-| test.cpp:13:5:13:8 | [input] SSA phi read(t2) | test.cpp:15:3:15:6 | SSA phi read(t2) |
-| test.cpp:13:5:13:8 | [input] SSA phi(*t2) | test.cpp:15:3:15:6 | SSA phi(*t2) |
-| test.cpp:13:10:13:11 | t2 | test.cpp:13:5:13:8 | [input] SSA phi read(t2) |
-| test.cpp:13:10:13:11 | t2 | test.cpp:13:5:13:8 | [input] SSA phi(*t2) |
-| test.cpp:15:3:15:6 | SSA phi read(t2) | test.cpp:15:8:15:9 | t2 |
-| test.cpp:15:3:15:6 | SSA phi(*t2) | test.cpp:15:8:15:9 | t2 |
+| test.cpp:13:10:13:11 | t2 | test.cpp:15:8:15:9 | t2 |
+| test.cpp:13:10:13:11 | t2 | test.cpp:15:8:15:9 | t2 |
| test.cpp:15:8:15:9 | t2 | test.cpp:23:15:23:16 | [input] SSA phi read(*t2) |
| test.cpp:15:8:15:9 | t2 | test.cpp:23:15:23:16 | [input] SSA phi read(t2) |
| test.cpp:17:3:17:8 | ... = ... | test.cpp:21:8:21:9 | t1 |
| test.cpp:17:8:17:8 | 0 | test.cpp:17:3:17:8 | ... = ... |
-| test.cpp:21:8:21:9 | t1 | test.cpp:23:15:23:16 | [input] SSA phi read(t1) |
-| test.cpp:21:8:21:9 | t1 | test.cpp:23:15:23:16 | [input] SSA phi(*t1) |
+| test.cpp:21:8:21:9 | t1 | test.cpp:23:19:23:19 | SSA phi read(t1) |
+| test.cpp:21:8:21:9 | t1 | test.cpp:23:19:23:19 | SSA phi(*t1) |
| test.cpp:23:15:23:16 | 0 | test.cpp:23:15:23:16 | 0 |
-| test.cpp:23:15:23:16 | 0 | test.cpp:23:15:23:16 | [input] SSA phi(*i) |
+| test.cpp:23:15:23:16 | 0 | test.cpp:23:19:23:19 | SSA phi(*i) |
| test.cpp:23:15:23:16 | [input] SSA phi read(*t2) | test.cpp:23:19:23:19 | SSA phi read(*t2) |
-| test.cpp:23:15:23:16 | [input] SSA phi read(i) | test.cpp:23:19:23:19 | SSA phi read(i) |
-| test.cpp:23:15:23:16 | [input] SSA phi read(t1) | test.cpp:23:19:23:19 | SSA phi read(t1) |
| test.cpp:23:15:23:16 | [input] SSA phi read(t2) | test.cpp:23:19:23:19 | SSA phi read(t2) |
-| test.cpp:23:15:23:16 | [input] SSA phi(*i) | test.cpp:23:19:23:19 | SSA phi(*i) |
-| test.cpp:23:15:23:16 | [input] SSA phi(*t1) | test.cpp:23:19:23:19 | SSA phi(*t1) |
| test.cpp:23:19:23:19 | SSA phi read(*t2) | test.cpp:24:10:24:11 | t2 |
| test.cpp:23:19:23:19 | SSA phi read(i) | test.cpp:23:19:23:19 | i |
| test.cpp:23:19:23:19 | SSA phi read(t1) | test.cpp:23:23:23:24 | t1 |
diff --git a/cpp/ql/test/library-tests/preprocessor/preprocessor/pp.cpp b/cpp/ql/test/library-tests/preprocessor/preprocessor/pp.cpp
index 70fada58da9..8ff6ff9a3d3 100644
--- a/cpp/ql/test/library-tests/preprocessor/preprocessor/pp.cpp
+++ b/cpp/ql/test/library-tests/preprocessor/preprocessor/pp.cpp
@@ -10,7 +10,7 @@
// semmle-extractor-options: -I${testdir}/more_headers/ "-U SOME_SYM"
#undef BAR
#define SCARY(a,aa,aaah) /* we ignore a */ (aa /* but we take aa */) /* and we ignore aaa */
-#define LOG(fmt, ...) printf("Warning: %s", fmt, __VA__ARGS__)
+#define LOG(fmt, ...) printf("Warning: %s", fmt, __VA__ARGS__)
#include "pp.h"
#if 0
@@ -59,7 +59,7 @@ public:
#else
#define IN_TEMPLATE
#endif
-
+
static int val;
};
@@ -71,7 +71,128 @@ templateClassContext tcci;
#define BAR
-#if defined(BAR) && \
+#if defined(BAR) &&\
defined(BAR)
#warning BAR defined
#endif
+
+#if defined MACROTHREE/**hello*/ && /*world*/\
+/*hw*/ (defined(MACROONE)) /* macroone */
+#endif
+
+#if defined SIMPLE_COMMENT //this comment \
+ (defined(SIMPLE_COMMENT)) spans over multiple lines
+#endif
+
+#if defined(FOO) &&\
+ defined(BAR)
+#define CONDITIONAL_MACRO_1 1
+#endif
+
+#if defined(FOO) && \
+ defined(BAR) && \
+ !defined(BAZ)
+#define CONDITIONAL_MACRO_2 2
+#endif
+
+#define FOO 8
+#define BAR 2
+#define BAZ 4
+#if ((FOO / BAR) \
+ == 4) && ((BAZ \
+ * QUX) \
+ > 10)
+#define CONDITIONAL_MACRO_3 3
+#endif
+
+// Testing \t spaced PreprocessorIf
+#if defined(FOO) && \
+ defined(BAR) && \
+ defined(BAZ)
+#define CONDITIONAL_MACRO_4 4
+#endif
+
+
+#if defined /* //test */ SIMPLE_COMMENT //this comment \
+ (defined(SIMPLE_COMMENT)) spans over multiple lines
+#endif
+
+#warning foo \
+
+#warning foo \
+\
+/* a comment */
+
+#warning foo \
+\
+
+#warning foo \
+\
+// a comment
+
+
+#define FOO 8
+#define BAR 2
+#define BAZ 4
+#if ((FOO / BAR) \
+ == 4) && ((BAZ \
+ /** comment */ \
+ * QUX) \
+ /** comment */ \
+ > 10)
+#define CONDITIONAL_MACRO_3 3
+#endif
+
+#define X 1
+#define Y 2
+#if defined(X) && \
+ /*this is a comment*/ defined(Y) \
+ // another comment
+#endif
+
+#warning FOO\
+ \
+ \
+ \
+BAR
+
+
+#warning foo \
+\
+/* comment */ \
+\
+
+
+#if/** */A/* ... */&&B
+#endif
+
+
+#if/** */ /**/ A
+#endif
+
+#if \
+\
+A && B
+#endif
+
+
+#ifdef /*
+
+
+
+*/ FOOBAR
+#warning a
+#else
+#warning b
+#endif
+
+
+#if /*
+
+//test
+
+*/ FOOBAR
+#endif
+
+#if/*...*//*...*/A
+#endif
\ No newline at end of file
diff --git a/cpp/ql/test/library-tests/preprocessor/preprocessor/preproc.expected b/cpp/ql/test/library-tests/preprocessor/preprocessor/preproc.expected
index d1b64ff7bd9..7c448ba6550 100644
--- a/cpp/ql/test/library-tests/preprocessor/preprocessor/preproc.expected
+++ b/cpp/ql/test/library-tests/preprocessor/preprocessor/preproc.expected
@@ -33,17 +33,64 @@
| pp.cpp:0:0:0:0 | pp.cpp | 50 | 2 | 50 | 48 | Macro | MACRO_TEMPLATECLASSCONTEXT_REFERENCED | 5 |
| pp.cpp:0:0:0:0 | pp.cpp | 54 | 3 | 54 | 39 | Macro | MACRO_TEMPLATEMETHODCONTEXT | 6 |
| pp.cpp:0:0:0:0 | pp.cpp | 57 | 1 | 57 | 21 | PreprocessorIfdef | INSTANTIATION | N/A |
-| pp.cpp:0:0:0:0 | pp.cpp | 59 | 1 | 59 | 6 | PreprocessorElse | N/A | N/A |
+| pp.cpp:0:0:0:0 | pp.cpp | 59 | 1 | 59 | 6 | PreprocessorElse | | N/A |
| pp.cpp:0:0:0:0 | pp.cpp | 60 | 3 | 60 | 21 | Macro | IN_TEMPLATE | |
-| pp.cpp:0:0:0:0 | pp.cpp | 61 | 1 | 61 | 7 | PreprocessorEndif | N/A | N/A |
+| pp.cpp:0:0:0:0 | pp.cpp | 61 | 1 | 61 | 7 | PreprocessorEndif | | N/A |
| pp.cpp:0:0:0:0 | pp.cpp | 69 | 1 | 69 | 21 | Macro | INSTANTIATION | |
| pp.cpp:0:0:0:0 | pp.cpp | 72 | 1 | 72 | 11 | Macro | BAR | |
-| pp.cpp:0:0:0:0 | pp.cpp | 74 | 1 | 74 | 21 | PreprocessorIf | defined(BAR) && \\ | N/A |
+| pp.cpp:0:0:0:0 | pp.cpp | 74 | 1 | 75 | 14 | PreprocessorIf | defined(BAR) && defined(BAR) | N/A |
| pp.cpp:0:0:0:0 | pp.cpp | 76 | 1 | 76 | 20 | PreprocessorWarning | BAR defined | N/A |
| pp.cpp:0:0:0:0 | pp.cpp | 77 | 1 | 77 | 6 | PreprocessorEndif | N/A | N/A |
+| pp.cpp:0:0:0:0 | pp.cpp | 79 | 1 | 80 | 26 | PreprocessorIf | defined MACROTHREE && (defined(MACROONE)) | N/A |
+| pp.cpp:0:0:0:0 | pp.cpp | 81 | 1 | 81 | 6 | PreprocessorEndif | N/A | N/A |
+| pp.cpp:0:0:0:0 | pp.cpp | 83 | 1 | 83 | 26 | PreprocessorIf | defined SIMPLE_COMMENT | N/A |
+| pp.cpp:0:0:0:0 | pp.cpp | 85 | 1 | 85 | 6 | PreprocessorEndif | N/A | N/A |
+| pp.cpp:0:0:0:0 | pp.cpp | 87 | 1 | 88 | 16 | PreprocessorIf | defined(FOO) && defined(BAR) | N/A |
+| pp.cpp:0:0:0:0 | pp.cpp | 90 | 1 | 90 | 6 | PreprocessorEndif | N/A | N/A |
+| pp.cpp:0:0:0:0 | pp.cpp | 92 | 1 | 94 | 17 | PreprocessorIf | defined(FOO) && defined(BAR) && !defined(BAZ) | N/A |
+| pp.cpp:0:0:0:0 | pp.cpp | 96 | 1 | 96 | 6 | PreprocessorEndif | N/A | N/A |
+| pp.cpp:0:0:0:0 | pp.cpp | 98 | 1 | 98 | 13 | Macro | FOO | 8 |
+| pp.cpp:0:0:0:0 | pp.cpp | 99 | 1 | 99 | 13 | Macro | BAR | 2 |
+| pp.cpp:0:0:0:0 | pp.cpp | 100 | 1 | 100 | 13 | Macro | BAZ | 4 |
+| pp.cpp:0:0:0:0 | pp.cpp | 101 | 1 | 104 | 8 | PreprocessorIf | ((FOO / BAR) == 4) && ((BAZ * QUX) > 10) | N/A |
+| pp.cpp:0:0:0:0 | pp.cpp | 106 | 1 | 106 | 6 | PreprocessorEndif | N/A | N/A |
+| pp.cpp:0:0:0:0 | pp.cpp | 109 | 1 | 111 | 13 | PreprocessorIf | defined(FOO) && defined(BAR) && defined(BAZ) | N/A |
+| pp.cpp:0:0:0:0 | pp.cpp | 112 | 1 | 112 | 29 | Macro | CONDITIONAL_MACRO_4 | 4 |
+| pp.cpp:0:0:0:0 | pp.cpp | 113 | 1 | 113 | 6 | PreprocessorEndif | N/A | N/A |
+| pp.cpp:0:0:0:0 | pp.cpp | 116 | 1 | 116 | 39 | PreprocessorIf | defined SIMPLE_COMMENT | N/A |
+| pp.cpp:0:0:0:0 | pp.cpp | 118 | 1 | 118 | 6 | PreprocessorEndif | N/A | N/A |
+| pp.cpp:0:0:0:0 | pp.cpp | 120 | 1 | 120 | 12 | PreprocessorWarning | foo | N/A |
+| pp.cpp:0:0:0:0 | pp.cpp | 122 | 1 | 122 | 12 | PreprocessorWarning | foo | N/A |
+| pp.cpp:0:0:0:0 | pp.cpp | 126 | 1 | 126 | 12 | PreprocessorWarning | foo | N/A |
+| pp.cpp:0:0:0:0 | pp.cpp | 129 | 1 | 129 | 12 | PreprocessorWarning | foo | N/A |
+| pp.cpp:0:0:0:0 | pp.cpp | 134 | 1 | 134 | 13 | Macro | FOO | 8 |
+| pp.cpp:0:0:0:0 | pp.cpp | 135 | 1 | 135 | 13 | Macro | BAR | 2 |
+| pp.cpp:0:0:0:0 | pp.cpp | 136 | 1 | 136 | 13 | Macro | BAZ | 4 |
+| pp.cpp:0:0:0:0 | pp.cpp | 137 | 1 | 142 | 8 | PreprocessorIf | ((FOO / BAR) == 4) && ((BAZ * QUX) > 10) | N/A |
+| pp.cpp:0:0:0:0 | pp.cpp | 144 | 1 | 144 | 6 | PreprocessorEndif | N/A | N/A |
+| pp.cpp:0:0:0:0 | pp.cpp | 146 | 1 | 146 | 11 | Macro | X | 1 |
+| pp.cpp:0:0:0:0 | pp.cpp | 147 | 1 | 147 | 11 | Macro | Y | 2 |
+| pp.cpp:0:0:0:0 | pp.cpp | 148 | 1 | 149 | 36 | PreprocessorIf | defined(X) && defined(Y) | N/A |
+| pp.cpp:0:0:0:0 | pp.cpp | 151 | 1 | 151 | 6 | PreprocessorEndif | N/A | N/A |
+| pp.cpp:0:0:0:0 | pp.cpp | 153 | 1 | 157 | 3 | PreprocessorWarning | FOO BAR | N/A |
+| pp.cpp:0:0:0:0 | pp.cpp | 160 | 1 | 160 | 12 | PreprocessorWarning | foo | N/A |
+| pp.cpp:0:0:0:0 | pp.cpp | 166 | 1 | 166 | 22 | PreprocessorIf | A &&B | N/A |
+| pp.cpp:0:0:0:0 | pp.cpp | 167 | 1 | 167 | 6 | PreprocessorEndif | N/A | N/A |
+| pp.cpp:0:0:0:0 | pp.cpp | 170 | 1 | 170 | 20 | PreprocessorIf | A | N/A |
+| pp.cpp:0:0:0:0 | pp.cpp | 171 | 1 | 171 | 6 | PreprocessorEndif | N/A | N/A |
+| pp.cpp:0:0:0:0 | pp.cpp | 173 | 1 | 175 | 6 | PreprocessorIf | A && B | N/A |
+| pp.cpp:0:0:0:0 | pp.cpp | 176 | 1 | 176 | 6 | PreprocessorEndif | N/A | N/A |
+| pp.cpp:0:0:0:0 | pp.cpp | 179 | 1 | 183 | 9 | PreprocessorIfdef | FOOBAR | N/A |
+| pp.cpp:0:0:0:0 | pp.cpp | 185 | 1 | 185 | 5 | PreprocessorElse | N/A | N/A |
+| pp.cpp:0:0:0:0 | pp.cpp | 186 | 1 | 186 | 10 | PreprocessorWarning | b | N/A |
+| pp.cpp:0:0:0:0 | pp.cpp | 187 | 1 | 187 | 6 | PreprocessorEndif | N/A | N/A |
+| pp.cpp:0:0:0:0 | pp.cpp | 190 | 1 | 194 | 9 | PreprocessorIf | FOOBAR | N/A |
+| pp.cpp:0:0:0:0 | pp.cpp | 195 | 1 | 195 | 6 | PreprocessorEndif | N/A | N/A |
+| pp.cpp:0:0:0:0 | pp.cpp | 197 | 1 | 197 | 18 | PreprocessorIf | A | N/A |
+| pp.cpp:0:0:0:0 | pp.cpp | 198 | 1 | 198 | 6 | PreprocessorEndif | N/A | N/A |
| pp.h:0:0:0:0 | pp.h | 1 | 1 | 1 | 12 | PreprocessorPragma | once | N/A |
| pp.h:0:0:0:0 | pp.h | 2 | 1 | 2 | 29 | PreprocessorWarning | "This should happen" | N/A |
-| pp.h:0:0:0:0 | pp.h | 3 | 1 | 3 | 27 | PreprocessorLine | 33 "emerald_city.h" | N/A |
+| pp.h:0:0:0:0 | pp.h | 3 | 1 | 3 | 27 | PreprocessorLine | 33 "emerald_city.h" | N/A |
| pp.h:0:0:0:0 | pp.h | 4 | 1 | 4 | 30 | PreprocessorPragma | byte_order(big_endian) | N/A |
| pp.h:0:0:0:0 | pp.h | 5 | 1 | 5 | 33 | PreprocessorWarning | "Not in Kansas any more" | N/A |
| pp.h:0:0:0:0 | pp.h | 7 | 1 | 11 | 8 | Macro | MULTILINE | world a long |
diff --git a/cpp/ql/test/query-tests/Diagnostics/ExtractionErrors.expected b/cpp/ql/test/query-tests/Diagnostics/ExtractionErrors.expected
index f7d1b79cd17..1fa54609422 100644
--- a/cpp/ql/test/query-tests/Diagnostics/ExtractionErrors.expected
+++ b/cpp/ql/test/query-tests/Diagnostics/ExtractionErrors.expected
@@ -1,2 +1,3 @@
+| containserror.cpp:9:14:9:14 | Recoverable extraction error: 'x' has already been declared in the current scope | Extraction failed in containserror.cpp with error "containserror.cpp", line 9: error: "x" has already been declared in the current scope\n \tconst char *x = "Foo2 $$@ bar2 $$@ baz2";\n \t ^\n\n | 2 |
| doesnotcompile.cpp:4:2:4:2 | Recoverable extraction error: identifier 'This' is undefined | Extraction failed in doesnotcompile.cpp with error "doesnotcompile.cpp", line 4: error: identifier "This" is undefined\n \tThis is not correct C/C++ code.\n \t^\n\n | 2 |
| doesnotcompile.cpp:4:10:4:10 | Recoverable extraction error: expected a ';' | Extraction failed in doesnotcompile.cpp with error "doesnotcompile.cpp", line 4: error: expected a ";"\n \tThis is not correct C/C++ code.\n \t ^\n\n | 2 |
diff --git a/cpp/ql/test/query-tests/Diagnostics/ExtractionWarnings.expected b/cpp/ql/test/query-tests/Diagnostics/ExtractionWarnings.expected
index 69cba1e1420..2393f4dbde0 100644
--- a/cpp/ql/test/query-tests/Diagnostics/ExtractionWarnings.expected
+++ b/cpp/ql/test/query-tests/Diagnostics/ExtractionWarnings.expected
@@ -1,2 +1,3 @@
+| containserror.cpp:9:14:9:14 | Recoverable extraction error: 'x' has already been declared in the current scope | Extraction failed in containserror.cpp with warning "containserror.cpp", line 9: error: "x" has already been declared in the current scope\n \tconst char *x = "Foo2 $$@ bar2 $$@ baz2";\n \t ^\n\n | 1 |
| doesnotcompile.cpp:4:2:4:2 | Recoverable extraction error: identifier 'This' is undefined | Extraction failed in doesnotcompile.cpp with warning "doesnotcompile.cpp", line 4: error: identifier "This" is undefined\n \tThis is not correct C/C++ code.\n \t^\n\n | 1 |
| doesnotcompile.cpp:4:10:4:10 | Recoverable extraction error: expected a ';' | Extraction failed in doesnotcompile.cpp with warning "doesnotcompile.cpp", line 4: error: expected a ";"\n \tThis is not correct C/C++ code.\n \t ^\n\n | 1 |
diff --git a/cpp/ql/test/query-tests/Diagnostics/Info.expected b/cpp/ql/test/query-tests/Diagnostics/Info.expected
index a3254130360..77a298109d6 100644
--- a/cpp/ql/test/query-tests/Diagnostics/Info.expected
+++ b/cpp/ql/test/query-tests/Diagnostics/Info.expected
@@ -1,4 +1,4 @@
-| containserror.cpp:0:0:0:0 | containserror.cpp | containserror.cpp | fromSource, normalTermination |
+| containserror.cpp:0:0:0:0 | containserror.cpp | containserror.cpp | ExtractionProblem (severity 1), fromSource, normalTermination |
| containswarning.cpp:0:0:0:0 | containswarning.cpp | containswarning.cpp | fromSource, normalTermination |
| doesnotcompile.cpp:0:0:0:0 | doesnotcompile.cpp | doesnotcompile.cpp | ExtractionProblem (severity 1), fromSource, normalTermination |
| file://:0:0:0:0 | | | |
diff --git a/cpp/ql/test/query-tests/Diagnostics/containserror.cpp b/cpp/ql/test/query-tests/Diagnostics/containserror.cpp
index 175fcc579f1..63e11dfe64f 100644
--- a/cpp/ql/test/query-tests/Diagnostics/containserror.cpp
+++ b/cpp/ql/test/query-tests/Diagnostics/containserror.cpp
@@ -3,3 +3,8 @@
void containserror() {
#error An error!
}
+
+void error_with_placeholder() {
+ const char *x = "Foo1 $@ bar1 $@ baz1";
+ const char *x = "Foo2 $@ bar2 $@ baz2";
+}
\ No newline at end of file
diff --git a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/DependabotProxy.cs b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/DependabotProxy.cs
index cad7d33f472..be5f137548c 100644
--- a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/DependabotProxy.cs
+++ b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/DependabotProxy.cs
@@ -1,14 +1,22 @@
using System;
-using System.Diagnostics;
+using System.Collections.Generic;
using System.IO;
using System.Security.Cryptography.X509Certificates;
using Semmle.Util;
using Semmle.Util.Logging;
+using Newtonsoft.Json;
namespace Semmle.Extraction.CSharp.DependencyFetching
{
public class DependabotProxy : IDisposable
{
+ ///
+ /// Represents configurations for package registries.
+ ///
+ /// The type of package registry.
+ /// The URL of the package registry.
+ public record class RegistryConfig(string Type, string URL);
+
private readonly string host;
private readonly string port;
@@ -17,6 +25,10 @@ namespace Semmle.Extraction.CSharp.DependencyFetching
///
internal string Address { get; }
///
+ /// The URLs of package registries that are configured for the proxy.
+ ///
+ internal HashSet RegistryURLs { get; }
+ ///
/// The path to the temporary file where the certificate is stored.
///
internal string? CertificatePath { get; private set; }
@@ -67,6 +79,39 @@ namespace Semmle.Extraction.CSharp.DependencyFetching
result.Certificate = X509Certificate2.CreateFromPem(cert);
}
+ // Try to obtain the list of private registry URLs.
+ var registryURLs = Environment.GetEnvironmentVariable(EnvironmentVariableNames.ProxyURLs);
+
+ if (!string.IsNullOrWhiteSpace(registryURLs))
+ {
+ try
+ {
+ // The value of the environment variable should be a JSON array of objects, such as:
+ // [ { "type": "nuget_feed", "url": "https://nuget.pkg.github.com/org/index.json" } ]
+ var array = JsonConvert.DeserializeObject>(registryURLs);
+ if (array is not null)
+ {
+ foreach (RegistryConfig config in array)
+ {
+ // The array contains all configured private registries, not just ones for C#.
+ // We ignore the non-C# ones here.
+ if (!config.Type.Equals("nuget_feed"))
+ {
+ logger.LogDebug($"Ignoring registry at '{config.URL}' since it is not of type 'nuget_feed'.");
+ continue;
+ }
+
+ logger.LogInfo($"Found private registry at '{config.URL}'");
+ result.RegistryURLs.Add(config.URL);
+ }
+ }
+ }
+ catch (JsonException ex)
+ {
+ logger.LogError($"Unable to parse '{EnvironmentVariableNames.ProxyURLs}': {ex.Message}");
+ }
+ }
+
return result;
}
@@ -75,6 +120,7 @@ namespace Semmle.Extraction.CSharp.DependencyFetching
this.host = host;
this.port = port;
this.Address = $"http://{this.host}:{this.port}";
+ this.RegistryURLs = new HashSet();
}
public void Dispose()
diff --git a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/DotNet.cs b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/DotNet.cs
index dfabb744618..49d35c944bd 100644
--- a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/DotNet.cs
+++ b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/DotNet.cs
@@ -2,7 +2,6 @@
using System.Collections.Generic;
using System.IO;
using System.Linq;
-
using Newtonsoft.Json.Linq;
using Semmle.Util;
@@ -77,6 +76,11 @@ namespace Semmle.Extraction.CSharp.DependencyFetching
args += " /p:EnableWindowsTargeting=true";
}
+ if (restoreSettings.ExtraArgs is not null)
+ {
+ args += $" {restoreSettings.ExtraArgs}";
+ }
+
return args;
}
diff --git a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/EnvironmentVariableNames.cs b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/EnvironmentVariableNames.cs
index d825e5daeb0..589e72d2126 100644
--- a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/EnvironmentVariableNames.cs
+++ b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/EnvironmentVariableNames.cs
@@ -89,5 +89,10 @@ namespace Semmle.Extraction.CSharp.DependencyFetching
/// Contains the certificate used by the Dependabot proxy.
///
public const string ProxyCertificate = "CODEQL_PROXY_CA_CERTIFICATE";
+
+ ///
+ /// Contains the URLs of private nuget registries as a JSON array.
+ ///
+ public const string ProxyURLs = "CODEQL_PROXY_URLS";
}
}
diff --git a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/IDotNet.cs b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/IDotNet.cs
index 2c10afa80ef..eec6a2b8d3b 100644
--- a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/IDotNet.cs
+++ b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/IDotNet.cs
@@ -17,7 +17,7 @@ namespace Semmle.Extraction.CSharp.DependencyFetching
IList GetNugetFeedsFromFolder(string folderPath);
}
- public record class RestoreSettings(string File, string PackageDirectory, bool ForceDotnetRefAssemblyFetching, string? PathToNugetConfig = null, bool ForceReevaluation = false, bool TargetWindows = false);
+ public record class RestoreSettings(string File, string PackageDirectory, bool ForceDotnetRefAssemblyFetching, string? ExtraArgs = null, string? PathToNugetConfig = null, bool ForceReevaluation = false, bool TargetWindows = false);
public partial record class RestoreResult(bool Success, IList Output)
{
diff --git a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/NugetPackageRestorer.cs b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/NugetPackageRestorer.cs
index dabc95b0d59..f1ad43f83f9 100644
--- a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/NugetPackageRestorer.cs
+++ b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/NugetPackageRestorer.cs
@@ -103,10 +103,11 @@ namespace Semmle.Extraction.CSharp.DependencyFetching
compilationInfoContainer.CompilationInfos.Add(("NuGet feed responsiveness checked", checkNugetFeedResponsiveness ? "1" : "0"));
HashSet? explicitFeeds = null;
+ HashSet? allFeeds = null;
try
{
- if (checkNugetFeedResponsiveness && !CheckFeeds(out explicitFeeds))
+ if (checkNugetFeedResponsiveness && !CheckFeeds(out explicitFeeds, out allFeeds))
{
// todo: we could also check the reachability of the inherited nuget feeds, but to use those in the fallback we would need to handle authentication too.
var unresponsiveMissingPackageLocation = DownloadMissingPackagesFromSpecificFeeds([], explicitFeeds);
@@ -156,7 +157,7 @@ namespace Semmle.Extraction.CSharp.DependencyFetching
var restoredProjects = RestoreSolutions(out var container);
var projects = fileProvider.Projects.Except(restoredProjects);
- RestoreProjects(projects, out var containers);
+ RestoreProjects(projects, allFeeds, out var containers);
var dependencies = containers.Flatten(container);
@@ -260,8 +261,33 @@ namespace Semmle.Extraction.CSharp.DependencyFetching
/// Populates dependencies with the relative paths to the assets files generated by the restore.
///
/// A list of paths to project files.
- private void RestoreProjects(IEnumerable projects, out ConcurrentBag dependencies)
+ private void RestoreProjects(IEnumerable projects, HashSet? configuredSources, out ConcurrentBag dependencies)
{
+ // Conservatively, we only set this to a non-null value if a Dependabot proxy is enabled.
+ // This ensures that we continue to get the old behaviour where feeds are taken from
+ // `nuget.config` files instead of the command-line arguments.
+ string? extraArgs = null;
+
+ if (this.dependabotProxy is not null)
+ {
+ // If the Dependabot proxy is configured, then our main goal is to make `dotnet` aware
+ // of the private registry feeds. However, since providing them as command-line arguments
+ // to `dotnet` ignores other feeds that may be configured, we also need to add the feeds
+ // we have discovered from analysing `nuget.config` files.
+ var sources = configuredSources ?? new();
+ this.dependabotProxy.RegistryURLs.ForEach(url => sources.Add(url));
+
+ // Add package sources. If any are present, they override all sources specified in
+ // the configuration file(s).
+ var feedArgs = new StringBuilder();
+ foreach (string source in sources)
+ {
+ feedArgs.Append($" -s {source}");
+ }
+
+ extraArgs = feedArgs.ToString();
+ }
+
var successCount = 0;
var nugetSourceFailures = 0;
ConcurrentBag collectedDependencies = [];
@@ -276,7 +302,7 @@ namespace Semmle.Extraction.CSharp.DependencyFetching
foreach (var project in projectGroup)
{
logger.LogInfo($"Restoring project {project}...");
- var res = dotnet.Restore(new(project, PackageDirectory.DirInfo.FullName, ForceDotnetRefAssemblyFetching: true, TargetWindows: isWindows));
+ var res = dotnet.Restore(new(project, PackageDirectory.DirInfo.FullName, ForceDotnetRefAssemblyFetching: true, extraArgs, TargetWindows: isWindows));
assets.AddDependenciesRange(res.AssetsFilePaths);
lock (sync)
{
@@ -680,10 +706,42 @@ namespace Semmle.Extraction.CSharp.DependencyFetching
return (timeoutMilliSeconds, tryCount);
}
- private bool CheckFeeds(out HashSet explicitFeeds)
+ ///
+ /// Checks that we can connect to all Nuget feeds that are explicitly configured in configuration files
+ /// as well as any private package registry feeds that are configured.
+ ///
+ /// Outputs the set of explicit feeds.
+ /// Outputs the set of all feeds (explicit and inherited).
+ /// True if all feeds are reachable or false otherwise.
+ private bool CheckFeeds(out HashSet explicitFeeds, out HashSet allFeeds)
{
- logger.LogInfo("Checking Nuget feeds...");
- (explicitFeeds, var allFeeds) = GetAllFeeds();
+ (explicitFeeds, allFeeds) = GetAllFeeds();
+ HashSet feedsToCheck = explicitFeeds;
+
+ // If private package registries are configured for C#, then check those
+ // in addition to the ones that are configured in `nuget.config` files.
+ this.dependabotProxy?.RegistryURLs.ForEach(url => feedsToCheck.Add(url));
+
+ var allFeedsReachable = this.CheckSpecifiedFeeds(feedsToCheck);
+
+ var inheritedFeeds = allFeeds.Except(explicitFeeds).ToHashSet();
+ if (inheritedFeeds.Count > 0)
+ {
+ logger.LogInfo($"Inherited Nuget feeds (not checked for reachability): {string.Join(", ", inheritedFeeds.OrderBy(f => f))}");
+ compilationInfoContainer.CompilationInfos.Add(("Inherited Nuget feed count", inheritedFeeds.Count.ToString()));
+ }
+
+ return allFeedsReachable;
+ }
+
+ ///
+ /// Checks that we can connect to the specified Nuget feeds.
+ ///
+ /// The set of package feeds to check.
+ /// True if all feeds are reachable or false otherwise.
+ private bool CheckSpecifiedFeeds(HashSet feeds)
+ {
+ logger.LogInfo("Checking that Nuget feeds are reachable...");
var excludedFeeds = EnvironmentVariables.GetURLs(EnvironmentVariableNames.ExcludedNugetFeedsFromResponsivenessCheck)
.ToHashSet();
@@ -695,7 +753,7 @@ namespace Semmle.Extraction.CSharp.DependencyFetching
var (initialTimeout, tryCount) = GetFeedRequestSettings(isFallback: false);
- var allFeedsReachable = explicitFeeds.All(feed => excludedFeeds.Contains(feed) || IsFeedReachable(feed, initialTimeout, tryCount));
+ var allFeedsReachable = feeds.All(feed => excludedFeeds.Contains(feed) || IsFeedReachable(feed, initialTimeout, tryCount));
if (!allFeedsReachable)
{
logger.LogWarning("Found unreachable Nuget feed in C# analysis with build-mode 'none'. This may cause missing dependencies in the analysis.");
@@ -710,14 +768,6 @@ namespace Semmle.Extraction.CSharp.DependencyFetching
}
compilationInfoContainer.CompilationInfos.Add(("All Nuget feeds reachable", allFeedsReachable ? "1" : "0"));
-
- var inheritedFeeds = allFeeds.Except(explicitFeeds).ToHashSet();
- if (inheritedFeeds.Count > 0)
- {
- logger.LogInfo($"Inherited Nuget feeds (not checked for reachability): {string.Join(", ", inheritedFeeds.OrderBy(f => f))}");
- compilationInfoContainer.CompilationInfos.Add(("Inherited Nuget feed count", inheritedFeeds.Count.ToString()));
- }
-
return allFeedsReachable;
}
@@ -766,23 +816,33 @@ namespace Semmle.Extraction.CSharp.DependencyFetching
}
// todo: this could be improved.
- // We don't have to get the feeds from each of the folders from below, it would be enought to check the folders that recursively contain the others.
- var allFeeds = nugetConfigs
- .Select(config =>
- {
- try
+ HashSet? allFeeds = null;
+
+ if (nugetConfigs.Count > 0)
+ {
+ // We don't have to get the feeds from each of the folders from below, it would be enought to check the folders that recursively contain the others.
+ allFeeds = nugetConfigs
+ .Select(config =>
{
- return new FileInfo(config).Directory?.FullName;
- }
- catch (Exception exc)
- {
- logger.LogWarning($"Failed to get directory of '{config}': {exc}");
- }
- return null;
- })
- .Where(folder => folder != null)
- .SelectMany(folder => GetFeeds(() => dotnet.GetNugetFeedsFromFolder(folder!)))
- .ToHashSet();
+ try
+ {
+ return new FileInfo(config).Directory?.FullName;
+ }
+ catch (Exception exc)
+ {
+ logger.LogWarning($"Failed to get directory of '{config}': {exc}");
+ }
+ return null;
+ })
+ .Where(folder => folder != null)
+ .SelectMany(folder => GetFeeds(() => dotnet.GetNugetFeedsFromFolder(folder!)))
+ .ToHashSet();
+ }
+ else
+ {
+ // If we haven't found any `nuget.config` files, then obtain a list of feeds from the root source directory.
+ allFeeds = GetFeeds(() => dotnet.GetNugetFeedsFromFolder(this.fileProvider.SourceDir.FullName)).ToHashSet();
+ }
logger.LogInfo($"Found {allFeeds.Count} Nuget feeds (with inherited ones) in nuget.config files: {string.Join(", ", allFeeds.OrderBy(f => f))}");
diff --git a/csharp/extractor/Semmle.Extraction.Tests/DotNet.cs b/csharp/extractor/Semmle.Extraction.Tests/DotNet.cs
index c584b607ec8..904ad04ce82 100644
--- a/csharp/extractor/Semmle.Extraction.Tests/DotNet.cs
+++ b/csharp/extractor/Semmle.Extraction.Tests/DotNet.cs
@@ -123,7 +123,7 @@ namespace Semmle.Extraction.Tests
var dotnet = MakeDotnet(dotnetCliInvoker);
// Execute
- var res = dotnet.Restore(new("myproject.csproj", "mypackages", false, "myconfig.config"));
+ var res = dotnet.Restore(new("myproject.csproj", "mypackages", false, null, "myconfig.config"));
// Verify
var lastArgs = dotnetCliInvoker.GetLastArgs();
@@ -141,7 +141,7 @@ namespace Semmle.Extraction.Tests
var dotnet = MakeDotnet(dotnetCliInvoker);
// Execute
- var res = dotnet.Restore(new("myproject.csproj", "mypackages", false, "myconfig.config", true));
+ var res = dotnet.Restore(new("myproject.csproj", "mypackages", false, null, "myconfig.config", true));
// Verify
var lastArgs = dotnetCliInvoker.GetLastArgs();
diff --git a/csharp/ql/consistency-queries/DataFlowConsistency.ql b/csharp/ql/consistency-queries/DataFlowConsistency.ql
index 2f34368b669..638bace3892 100644
--- a/csharp/ql/consistency-queries/DataFlowConsistency.ql
+++ b/csharp/ql/consistency-queries/DataFlowConsistency.ql
@@ -34,30 +34,18 @@ private module Input implements InputSig {
n instanceof FlowSummaryNode
or
n.asExpr().(ObjectCreation).hasInitializer()
+ or
+ exists(
+ n.(PostUpdateNode).getPreUpdateNode().asExprAtNode(LocalFlow::getPostUpdateReverseStep(_))
+ )
}
predicate argHasPostUpdateExclude(ArgumentNode n) {
n instanceof FlowSummaryNode
or
- not exists(LocalFlow::getAPostUpdateNodeForArg(n.getControlFlowNode()))
- or
n instanceof ParamsArgumentNode
- }
-
- predicate postHasUniquePreExclude(PostUpdateNode n) {
- exists(ControlFlow::Nodes::ExprNode e, ControlFlow::Nodes::ExprNode arg |
- e = LocalFlow::getAPostUpdateNodeForArg(arg) and
- e != arg and
- n = TExprPostUpdateNode(e)
- )
- }
-
- predicate uniquePostUpdateExclude(Node n) {
- exists(ControlFlow::Nodes::ExprNode e, ControlFlow::Nodes::ExprNode arg |
- e = LocalFlow::getAPostUpdateNodeForArg(arg) and
- e != arg and
- n.asExpr() = arg.getExpr()
- )
+ or
+ n.asExpr() = any(Expr e | not exprMayHavePostUpdateNode(e))
}
predicate reverseReadExclude(Node n) { n.asExpr() = any(AwaitExpr ae).getExpr() }
diff --git a/csharp/ql/integration-tests/all-platforms/standalone_resx/CompilationInfo.expected b/csharp/ql/integration-tests/all-platforms/standalone_resx/CompilationInfo.expected
index 48cca253453..ee27a1cd912 100644
--- a/csharp/ql/integration-tests/all-platforms/standalone_resx/CompilationInfo.expected
+++ b/csharp/ql/integration-tests/all-platforms/standalone_resx/CompilationInfo.expected
@@ -1,6 +1,7 @@
| All Nuget feeds reachable | 1.0 |
| Failed project restore with package source error | 0.0 |
| Failed solution restore with package source error | 0.0 |
+| Inherited Nuget feed count | 1.0 |
| NuGet feed responsiveness checked | 1.0 |
| Project files on filesystem | 1.0 |
| Reachable fallback Nuget feed count | 1.0 |
diff --git a/csharp/ql/integration-tests/all-platforms/standalone_winforms/CompilationInfo.expected b/csharp/ql/integration-tests/all-platforms/standalone_winforms/CompilationInfo.expected
index f87af9b7599..cf2e7f2db70 100644
--- a/csharp/ql/integration-tests/all-platforms/standalone_winforms/CompilationInfo.expected
+++ b/csharp/ql/integration-tests/all-platforms/standalone_winforms/CompilationInfo.expected
@@ -1,6 +1,7 @@
| All Nuget feeds reachable | 1.0 |
| Failed project restore with package source error | 0.0 |
| Failed solution restore with package source error | 0.0 |
+| Inherited Nuget feed count | 1.0 |
| NuGet feed responsiveness checked | 1.0 |
| Project files on filesystem | 1.0 |
| Reachable fallback Nuget feed count | 1.0 |
diff --git a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowPrivate.qll b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowPrivate.qll
index f7b6fd5ff13..c5e915b0535 100644
--- a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowPrivate.qll
+++ b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowPrivate.qll
@@ -691,19 +691,22 @@ module LocalFlow {
)
}
- /** Gets a node for which to construct a post-update node for argument `arg`. */
- ControlFlow::Nodes::ExprNode getAPostUpdateNodeForArg(ControlFlow::Nodes::ExprNode arg) {
- arg.getExpr() instanceof Argument and
- result = getALastEvalNode*(arg) and
- exists(Expr e, Type t | result.getExpr() = e and t = e.stripCasts().getType() |
- t instanceof RefType and
- not t instanceof NullType
- or
- t = any(TypeParameter tp | not tp.isValueType())
- or
- t.isRefLikeType()
- ) and
- not exists(getALastEvalNode(result))
+ /**
+ * Holds if a reverse local flow step should be added from the post-update node
+ * for `e` to the post-update node for the result.
+ *
+ * This is needed to allow for side-effects on compound expressions to propagate
+ * to sub components. For example, in
+ *
+ * ```csharp
+ * m(b ? x : y)
+ * ```
+ *
+ * we add a reverse flow step from `[post] b ? x : y` to `[post] x` and to
+ * `[post] y`, in order for the side-effect of `m` to reach both `x` and `y`.
+ */
+ ControlFlow::Nodes::ExprNode getPostUpdateReverseStep(ControlFlow::Nodes::ExprNode e) {
+ result = getALastEvalNode(e)
}
/**
@@ -763,6 +766,13 @@ predicate simpleLocalFlowStep(Node nodeFrom, Node nodeTo, string model) {
VariableCapture::valueStep(nodeFrom, nodeTo)
or
nodeTo = nodeFrom.(LocalFunctionCreationNode).getAnAccess(true)
+ or
+ nodeTo.(PostUpdateNode).getPreUpdateNode().(ExprNode).getControlFlowNode() =
+ LocalFlow::getPostUpdateReverseStep(nodeFrom
+ .(PostUpdateNode)
+ .getPreUpdateNode()
+ .(ExprNode)
+ .getControlFlowNode())
) and
model = ""
or
@@ -1061,6 +1071,20 @@ private class FieldOrPropertyUsedInSource extends FieldOrProperty {
}
}
+/**
+ * Hold if `e` has a type that allows for it to have a post-update node.
+ */
+predicate exprMayHavePostUpdateNode(Expr e) {
+ exists(Type t | t = e.stripCasts().getType() |
+ t instanceof RefType and
+ not t instanceof NullType
+ or
+ t = any(TypeParameter tp | not tp.isValueType())
+ or
+ t.isRefLikeType()
+ )
+}
+
/** A collection of cached types and predicates to be evaluated in the same stage. */
cached
private module Cached {
@@ -1106,7 +1130,15 @@ private module Cached {
cfn.getAstNode().(ObjectCreation).hasInitializer()
} or
TExprPostUpdateNode(ControlFlow::Nodes::ExprNode cfn) {
- cfn = LocalFlow::getAPostUpdateNodeForArg(_)
+ (
+ cfn.getExpr() instanceof Argument
+ or
+ cfn =
+ LocalFlow::getPostUpdateReverseStep(any(ControlFlow::Nodes::ExprNode e |
+ exists(any(SourcePostUpdateNode p).getPreUpdateNode().asExprAtNode(e))
+ ))
+ ) and
+ exprMayHavePostUpdateNode(cfn.getExpr())
or
exists(Expr e | e = cfn.getExpr() |
fieldOrPropertyStore(_, _, _, e, true)
@@ -2722,17 +2754,23 @@ abstract class PostUpdateNode extends Node {
}
module PostUpdateNodes {
- class ObjectCreationNode extends PostUpdateNode, ExprNode, TExprNode {
+ abstract class SourcePostUpdateNode extends PostUpdateNode {
+ abstract Node getPreUpdateSourceNode();
+
+ final override Node getPreUpdateNode() { result = this.getPreUpdateSourceNode() }
+ }
+
+ class ObjectCreationNode extends SourcePostUpdateNode, ExprNode, TExprNode {
private ObjectCreation oc;
ObjectCreationNode() { this = TExprNode(oc.getAControlFlowNode()) }
- override Node getPreUpdateNode() {
+ override Node getPreUpdateSourceNode() {
exists(ControlFlow::Nodes::ElementNode cfn | this = TExprNode(cfn) |
- result.(ObjectInitializerNode).getControlFlowNode() = cfn
+ result = TObjectInitializerNode(cfn)
or
not oc.hasInitializer() and
- result.(MallocNode).getControlFlowNode() = cfn
+ result = TMallocNode(cfn)
)
}
}
@@ -2744,7 +2782,7 @@ module PostUpdateNodes {
* Such a node acts as both a post-update node for the `MallocNode`, as well as
* a pre-update node for the `ObjectCreationNode`.
*/
- class ObjectInitializerNode extends PostUpdateNode, NodeImpl, ArgumentNodeImpl,
+ class ObjectInitializerNode extends SourcePostUpdateNode, NodeImpl, ArgumentNodeImpl,
TObjectInitializerNode
{
private ObjectCreation oc;
@@ -2758,7 +2796,7 @@ module PostUpdateNodes {
/** Gets the initializer to which this initializer node belongs. */
ObjectOrCollectionInitializer getInitializer() { result = oc.getInitializer() }
- override MallocNode getPreUpdateNode() { result.getControlFlowNode() = cfn }
+ override MallocNode getPreUpdateSourceNode() { result = TMallocNode(cfn) }
override predicate argumentOf(DataFlowCall call, ArgumentPosition pos) {
pos.isQualifier() and
@@ -2781,23 +2819,12 @@ module PostUpdateNodes {
override string toStringImpl() { result = "[pre-initializer] " + cfn }
}
- class ExprPostUpdateNode extends PostUpdateNode, NodeImpl, TExprPostUpdateNode {
+ class ExprPostUpdateNode extends SourcePostUpdateNode, NodeImpl, TExprPostUpdateNode {
private ControlFlow::Nodes::ElementNode cfn;
ExprPostUpdateNode() { this = TExprPostUpdateNode(cfn) }
- override ExprNode getPreUpdateNode() {
- // For compound arguments, such as `m(b ? x : y)`, we want the leaf nodes
- // `[post] x` and `[post] y` to have two pre-update nodes: (1) the compound argument,
- // `if b then x else y`; and the (2) the underlying expressions; `x` and `y`,
- // respectively.
- //
- // This ensures that we get flow out of the call into both leafs (1), while still
- // maintaining the invariant that the underlying expression is a pre-update node (2).
- cfn = LocalFlow::getAPostUpdateNodeForArg(result.getControlFlowNode())
- or
- cfn = result.getControlFlowNode()
- }
+ override ExprNode getPreUpdateSourceNode() { result = TExprNode(cfn) }
override DataFlowCallable getEnclosingCallableImpl() {
result.getAControlFlowNode() = cfn
@@ -2825,41 +2852,41 @@ module PostUpdateNodes {
override Node getPreUpdateNode() { result.(FlowSummaryNode).getSummaryNode() = preUpdateNode }
}
- private class InstanceParameterAccessPostUpdateNode extends PostUpdateNode,
+ private class InstanceParameterAccessPostUpdateNode extends SourcePostUpdateNode,
InstanceParameterAccessNode
{
InstanceParameterAccessPostUpdateNode() { isPostUpdate = true }
- override InstanceParameterAccessPreNode getPreUpdateNode() {
+ override InstanceParameterAccessPreNode getPreUpdateSourceNode() {
result = TInstanceParameterAccessNode(cfn, false)
}
override string toStringImpl() { result = "[post] this" }
}
- private class PrimaryConstructorThisAccessPostUpdateNode extends PostUpdateNode,
+ private class PrimaryConstructorThisAccessPostUpdateNode extends SourcePostUpdateNode,
PrimaryConstructorThisAccessNode
{
PrimaryConstructorThisAccessPostUpdateNode() { isPostUpdate = true }
- override PrimaryConstructorThisAccessPreNode getPreUpdateNode() {
+ override PrimaryConstructorThisAccessPreNode getPreUpdateSourceNode() {
result = TPrimaryConstructorThisAccessNode(p, false, callable)
}
override string toStringImpl() { result = "[post] this" }
}
- class LocalFunctionCreationPostUpdateNode extends LocalFunctionCreationNode, PostUpdateNode {
+ class LocalFunctionCreationPostUpdateNode extends LocalFunctionCreationNode, SourcePostUpdateNode {
LocalFunctionCreationPostUpdateNode() { isPostUpdate = true }
- override LocalFunctionCreationPreNode getPreUpdateNode() {
+ override LocalFunctionCreationPreNode getPreUpdateSourceNode() {
result = TLocalFunctionCreationNode(cfn, false)
}
override string toStringImpl() { result = "[post] " + cfn }
}
- private class CapturePostUpdateNode extends PostUpdateNode, CaptureNode {
+ private class CapturePostUpdateNode extends SourcePostUpdateNode, CaptureNode {
private CaptureNode pre;
CapturePostUpdateNode() {
@@ -2867,7 +2894,7 @@ module PostUpdateNodes {
pre.getSynthesizedCaptureNode())
}
- override CaptureNode getPreUpdateNode() { result = pre }
+ override CaptureNode getPreUpdateSourceNode() { result = pre }
override string toStringImpl() { result = "[post] " + cn }
}
diff --git a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/SsaImpl.qll b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/SsaImpl.qll
index f1299d5ad09..420cf518e80 100644
--- a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/SsaImpl.qll
+++ b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/SsaImpl.qll
@@ -1062,7 +1062,7 @@ private module DataFlowIntegrationInput implements Impl::DataFlowIntegrationInpu
}
/** Holds if the guard `guard` controls block `bb` upon evaluating to `branch`. */
- predicate guardControlsBlock(Guard guard, ControlFlow::BasicBlock bb, boolean branch) {
+ predicate guardDirectlyControlsBlock(Guard guard, ControlFlow::BasicBlock bb, boolean branch) {
exists(ConditionBlock conditionBlock, ControlFlow::SuccessorTypes::ConditionalSuccessor s |
guard.getAControlFlowNode() = conditionBlock.getLastNode() and
s.getValue() = branch and
diff --git a/csharp/ql/src/codeql-suites/csharp-ccr.qls b/csharp/ql/src/codeql-suites/csharp-code-quality.qls
similarity index 100%
rename from csharp/ql/src/codeql-suites/csharp-ccr.qls
rename to csharp/ql/src/codeql-suites/csharp-code-quality.qls
diff --git a/csharp/ql/src/utils/modelgenerator/internal/CaptureModels.qll b/csharp/ql/src/utils/modelgenerator/internal/CaptureModels.qll
index 108c3f84d2c..125204d7c5b 100644
--- a/csharp/ql/src/utils/modelgenerator/internal/CaptureModels.qll
+++ b/csharp/ql/src/utils/modelgenerator/internal/CaptureModels.qll
@@ -233,6 +233,10 @@ module ModelGeneratorInput implements ModelGeneratorInputSig::paramReturnNodeAsOutput(c, pos)
}
+ ParameterPosition getReturnKindParamPosition(ReturnKind kind) {
+ kind.(OutRefReturnKind).getPosition() = result.getPosition()
+ }
+
Callable returnNodeEnclosingCallable(DataFlow::Node ret) {
result = DataFlowImplCommon::getNodeEnclosingCallable(ret).asCallable(_)
}
diff --git a/csharp/ql/test/library-tests/csharp7/LocalTaintFlow.expected b/csharp/ql/test/library-tests/csharp7/LocalTaintFlow.expected
index 4a16e2491df..a6ecbc3356d 100644
--- a/csharp/ql/test/library-tests/csharp7/LocalTaintFlow.expected
+++ b/csharp/ql/test/library-tests/csharp7/LocalTaintFlow.expected
@@ -252,7 +252,7 @@
| CSharp7.cs:233:28:233:29 | access to local variable i1 | CSharp7.cs:235:38:235:39 | access to local variable i1 |
| CSharp7.cs:233:28:233:33 | ... > ... | CSharp7.cs:233:13:233:33 | [false] ... && ... |
| CSharp7.cs:233:28:233:33 | ... > ... | CSharp7.cs:233:13:233:33 | [true] ... && ... |
-| CSharp7.cs:235:13:235:42 | [input] SSA phi read(o) | CSharp7.cs:248:9:274:9 | SSA phi read(o) |
+| CSharp7.cs:235:13:235:42 | [input] SSA phi read(o) | CSharp7.cs:248:17:248:17 | access to local variable o |
| CSharp7.cs:235:33:235:36 | "int " | CSharp7.cs:235:31:235:41 | $"..." |
| CSharp7.cs:235:38:235:39 | access to local variable i1 | CSharp7.cs:235:31:235:41 | $"..." |
| CSharp7.cs:237:18:237:18 | access to local variable o | CSharp7.cs:237:23:237:31 | String s1 |
@@ -260,18 +260,17 @@
| CSharp7.cs:237:18:237:18 | access to local variable o | CSharp7.cs:241:18:241:18 | access to local variable o |
| CSharp7.cs:237:23:237:31 | SSA def(s1) | CSharp7.cs:239:41:239:42 | access to local variable s1 |
| CSharp7.cs:237:23:237:31 | String s1 | CSharp7.cs:237:23:237:31 | SSA def(s1) |
-| CSharp7.cs:239:13:239:45 | [input] SSA phi read(o) | CSharp7.cs:248:9:274:9 | SSA phi read(o) |
+| CSharp7.cs:239:13:239:45 | [input] SSA phi read(o) | CSharp7.cs:248:17:248:17 | access to local variable o |
| CSharp7.cs:239:33:239:39 | "string " | CSharp7.cs:239:31:239:44 | $"..." |
| CSharp7.cs:239:41:239:42 | access to local variable s1 | CSharp7.cs:239:31:239:44 | $"..." |
| CSharp7.cs:241:18:241:18 | access to local variable o | CSharp7.cs:242:9:243:9 | [input] SSA phi read(o) |
| CSharp7.cs:241:18:241:18 | access to local variable o | CSharp7.cs:244:18:244:18 | access to local variable o |
-| CSharp7.cs:242:9:243:9 | [input] SSA phi read(o) | CSharp7.cs:248:9:274:9 | SSA phi read(o) |
+| CSharp7.cs:242:9:243:9 | [input] SSA phi read(o) | CSharp7.cs:248:17:248:17 | access to local variable o |
| CSharp7.cs:244:18:244:18 | access to local variable o | CSharp7.cs:244:18:244:28 | [input] SSA phi read(o) |
| CSharp7.cs:244:18:244:18 | access to local variable o | CSharp7.cs:244:23:244:28 | Object v1 |
| CSharp7.cs:244:18:244:18 | access to local variable o | CSharp7.cs:245:9:246:9 | [input] SSA phi read(o) |
-| CSharp7.cs:244:18:244:28 | [input] SSA phi read(o) | CSharp7.cs:248:9:274:9 | SSA phi read(o) |
-| CSharp7.cs:245:9:246:9 | [input] SSA phi read(o) | CSharp7.cs:248:9:274:9 | SSA phi read(o) |
-| CSharp7.cs:248:9:274:9 | SSA phi read(o) | CSharp7.cs:248:17:248:17 | access to local variable o |
+| CSharp7.cs:244:18:244:28 | [input] SSA phi read(o) | CSharp7.cs:248:17:248:17 | access to local variable o |
+| CSharp7.cs:245:9:246:9 | [input] SSA phi read(o) | CSharp7.cs:248:17:248:17 | access to local variable o |
| CSharp7.cs:248:17:248:17 | access to local variable o | CSharp7.cs:254:27:254:27 | access to local variable o |
| CSharp7.cs:248:17:248:17 | access to local variable o | CSharp7.cs:257:18:257:23 | Int32 i2 |
| CSharp7.cs:248:17:248:17 | access to local variable o | CSharp7.cs:260:18:260:23 | Int32 i3 |
@@ -312,10 +311,8 @@
| CSharp7.cs:285:39:285:42 | access to local variable list | CSharp7.cs:287:36:287:39 | access to local variable list |
| CSharp7.cs:287:36:287:39 | access to local variable list | CSharp7.cs:289:32:289:35 | access to local variable list |
| CSharp7.cs:297:18:297:18 | access to local variable x | CSharp7.cs:297:18:297:22 | SSA def(x) |
-| CSharp7.cs:297:18:297:22 | SSA def(x) | CSharp7.cs:297:18:297:22 | [input] SSA phi(x) |
-| CSharp7.cs:297:18:297:22 | [input] SSA phi(x) | CSharp7.cs:297:25:297:25 | SSA phi(x) |
+| CSharp7.cs:297:18:297:22 | SSA def(x) | CSharp7.cs:297:25:297:25 | access to local variable x |
| CSharp7.cs:297:22:297:22 | 0 | CSharp7.cs:297:18:297:18 | access to local variable x |
-| CSharp7.cs:297:25:297:25 | SSA phi(x) | CSharp7.cs:297:25:297:25 | access to local variable x |
| CSharp7.cs:297:25:297:25 | access to local variable x | CSharp7.cs:297:25:297:30 | ... < ... |
| CSharp7.cs:297:25:297:25 | access to local variable x | CSharp7.cs:297:35:297:35 | access to local variable x |
| CSharp7.cs:297:25:297:30 | ... < ... | CSharp7.cs:297:25:297:44 | [false] ... && ... |
@@ -326,6 +323,5 @@
| CSharp7.cs:297:35:297:44 | [true] ... is ... | CSharp7.cs:297:25:297:44 | [true] ... && ... |
| CSharp7.cs:297:40:297:44 | Int32 y | CSharp7.cs:297:40:297:44 | SSA def(y) |
| CSharp7.cs:297:40:297:44 | SSA def(y) | CSharp7.cs:299:31:299:31 | access to local variable y |
-| CSharp7.cs:297:47:297:49 | SSA def(x) | CSharp7.cs:297:47:297:49 | [input] SSA phi(x) |
-| CSharp7.cs:297:47:297:49 | [input] SSA phi(x) | CSharp7.cs:297:25:297:25 | SSA phi(x) |
+| CSharp7.cs:297:47:297:49 | SSA def(x) | CSharp7.cs:297:25:297:25 | access to local variable x |
| CSharp7.cs:297:49:297:49 | access to local variable x | CSharp7.cs:297:47:297:49 | SSA def(x) |
diff --git a/csharp/ql/test/library-tests/dataflow/global/DataFlowPath.expected b/csharp/ql/test/library-tests/dataflow/global/DataFlowPath.expected
index c5f00cd656f..7333890f68f 100644
--- a/csharp/ql/test/library-tests/dataflow/global/DataFlowPath.expected
+++ b/csharp/ql/test/library-tests/dataflow/global/DataFlowPath.expected
@@ -421,46 +421,40 @@ edges
| GlobalDataFlow.cs:469:21:469:21 | s : String | GlobalDataFlow.cs:469:32:469:32 | access to parameter s | provenance | |
| GlobalDataFlow.cs:470:15:470:17 | access to parameter arg : String | GlobalDataFlow.cs:469:21:469:21 | s : String | provenance | |
| GlobalDataFlow.cs:473:28:473:41 | "taint source" : String | GlobalDataFlow.cs:466:53:466:55 | arg : String | provenance | |
-| GlobalDataFlow.cs:481:41:481:42 | sc [Return] : SimpleClass [field field] : String | GlobalDataFlow.cs:490:25:490:26 | [post] access to local variable x1 : SimpleClass [field field] : String | provenance | |
-| GlobalDataFlow.cs:481:41:481:42 | sc [Return] : SimpleClass [field field] : String | GlobalDataFlow.cs:490:30:490:31 | [post] access to local variable x2 : SimpleClass [field field] : String | provenance | |
-| GlobalDataFlow.cs:481:41:481:42 | sc [Return] : SimpleClass [field field] : String | GlobalDataFlow.cs:497:31:497:32 | [post] access to local variable y1 : SimpleClass [field field] : String | provenance | |
-| GlobalDataFlow.cs:481:41:481:42 | sc [Return] : SimpleClass [field field] : String | GlobalDataFlow.cs:497:36:497:37 | [post] access to local variable y2 : SimpleClass [field field] : String | provenance | |
-| GlobalDataFlow.cs:481:41:481:42 | sc [Return] : SimpleClass [field field] : String | GlobalDataFlow.cs:497:42:497:43 | [post] access to local variable y3 : SimpleClass [field field] : String | provenance | |
-| GlobalDataFlow.cs:481:41:481:42 | sc [Return] : SimpleClass [field field] : String | GlobalDataFlow.cs:508:33:508:33 | [post] access to local variable x : SubSimpleClass [field field] : String | provenance | |
-| GlobalDataFlow.cs:481:41:481:42 | sc [Return] : SimpleClass [field field] : String | GlobalDataFlow.cs:515:20:515:20 | [post] access to parameter x : SimpleClass [field field] : String | provenance | |
-| GlobalDataFlow.cs:481:41:481:42 | sc [Return] : SimpleClass [field field] : String | GlobalDataFlow.cs:515:25:515:25 | [post] access to local variable y : SimpleClass [field field] : String | provenance | |
-| GlobalDataFlow.cs:481:41:481:42 | sc [Return] : SimpleClass [field field] : String | GlobalDataFlow.cs:527:20:527:20 | [post] access to local variable x : SimpleClass [field field] : String | provenance | |
-| GlobalDataFlow.cs:481:41:481:42 | sc [Return] : SimpleClass [field field] : String | GlobalDataFlow.cs:528:20:528:20 | [post] access to local variable y : SimpleClass [field field] : String | provenance | |
-| GlobalDataFlow.cs:481:41:481:42 | sc [Return] : SimpleClass [field field] : String | GlobalDataFlow.cs:529:18:529:18 | [post] access to local variable z : SimpleClass [field field] : String | provenance | |
-| GlobalDataFlow.cs:481:41:481:42 | sc [Return] : SimpleClass [field field] : String | GlobalDataFlow.cs:538:20:538:21 | [post] access to parameter sc : SimpleClass [field field] : String | provenance | |
-| GlobalDataFlow.cs:481:41:481:42 | sc [Return] : SimpleClass [field field] : String | GlobalDataFlow.cs:546:24:546:24 | [post] access to local variable x : SimpleClass [field field] : String | provenance | |
+| GlobalDataFlow.cs:481:41:481:42 | sc [Return] : SimpleClass [field field] : String | GlobalDataFlow.cs:490:20:490:31 | [post] ... ? ... : ... : SimpleClass [field field] : String | provenance | |
+| GlobalDataFlow.cs:481:41:481:42 | sc [Return] : SimpleClass [field field] : String | GlobalDataFlow.cs:497:20:497:43 | [post] ... ? ... : ... : SimpleClass [field field] : String | provenance | |
+| GlobalDataFlow.cs:481:41:481:42 | sc [Return] : SimpleClass [field field] : String | GlobalDataFlow.cs:508:20:508:33 | [post] (...) ... : SimpleClass [field field] : String | provenance | |
+| GlobalDataFlow.cs:481:41:481:42 | sc [Return] : SimpleClass [field field] : String | GlobalDataFlow.cs:515:20:515:25 | [post] ... ?? ... : SimpleClass [field field] : String | provenance | |
+| GlobalDataFlow.cs:481:41:481:42 | sc [Return] : SimpleClass [field field] : String | GlobalDataFlow.cs:525:20:530:9 | [post] ... switch { ... } : SimpleClass [field field] : String | provenance | |
+| GlobalDataFlow.cs:481:41:481:42 | sc [Return] : SimpleClass [field field] : String | GlobalDataFlow.cs:538:20:538:22 | [post] ...! : SimpleClass [field field] : String | provenance | |
+| GlobalDataFlow.cs:481:41:481:42 | sc [Return] : SimpleClass [field field] : String | GlobalDataFlow.cs:546:20:546:24 | [post] ... = ... : SimpleClass [field field] : String | provenance | |
| GlobalDataFlow.cs:483:9:483:10 | [post] access to parameter sc : SimpleClass [field field] : String | GlobalDataFlow.cs:481:41:481:42 | sc [Return] : SimpleClass [field field] : String | provenance | |
| GlobalDataFlow.cs:483:20:483:33 | "taint source" : String | GlobalDataFlow.cs:483:9:483:10 | [post] access to parameter sc : SimpleClass [field field] : String | provenance | |
-| GlobalDataFlow.cs:490:25:490:26 | [post] access to local variable x1 : SimpleClass [field field] : String | GlobalDataFlow.cs:491:15:491:16 | access to local variable x1 : SimpleClass [field field] : String | provenance | |
-| GlobalDataFlow.cs:490:30:490:31 | [post] access to local variable x2 : SimpleClass [field field] : String | GlobalDataFlow.cs:492:15:492:16 | access to local variable x2 : SimpleClass [field field] : String | provenance | |
+| GlobalDataFlow.cs:490:20:490:31 | [post] ... ? ... : ... : SimpleClass [field field] : String | GlobalDataFlow.cs:491:15:491:16 | access to local variable x1 : SimpleClass [field field] : String | provenance | |
+| GlobalDataFlow.cs:490:20:490:31 | [post] ... ? ... : ... : SimpleClass [field field] : String | GlobalDataFlow.cs:492:15:492:16 | access to local variable x2 : SimpleClass [field field] : String | provenance | |
| GlobalDataFlow.cs:491:15:491:16 | access to local variable x1 : SimpleClass [field field] : String | GlobalDataFlow.cs:491:15:491:22 | access to field field | provenance | |
| GlobalDataFlow.cs:492:15:492:16 | access to local variable x2 : SimpleClass [field field] : String | GlobalDataFlow.cs:492:15:492:22 | access to field field | provenance | |
-| GlobalDataFlow.cs:497:31:497:32 | [post] access to local variable y1 : SimpleClass [field field] : String | GlobalDataFlow.cs:498:15:498:16 | access to local variable y1 : SimpleClass [field field] : String | provenance | |
-| GlobalDataFlow.cs:497:36:497:37 | [post] access to local variable y2 : SimpleClass [field field] : String | GlobalDataFlow.cs:499:15:499:16 | access to local variable y2 : SimpleClass [field field] : String | provenance | |
-| GlobalDataFlow.cs:497:42:497:43 | [post] access to local variable y3 : SimpleClass [field field] : String | GlobalDataFlow.cs:500:15:500:16 | access to local variable y3 : SimpleClass [field field] : String | provenance | |
+| GlobalDataFlow.cs:497:20:497:43 | [post] ... ? ... : ... : SimpleClass [field field] : String | GlobalDataFlow.cs:498:15:498:16 | access to local variable y1 : SimpleClass [field field] : String | provenance | |
+| GlobalDataFlow.cs:497:20:497:43 | [post] ... ? ... : ... : SimpleClass [field field] : String | GlobalDataFlow.cs:499:15:499:16 | access to local variable y2 : SimpleClass [field field] : String | provenance | |
+| GlobalDataFlow.cs:497:20:497:43 | [post] ... ? ... : ... : SimpleClass [field field] : String | GlobalDataFlow.cs:500:15:500:16 | access to local variable y3 : SimpleClass [field field] : String | provenance | |
| GlobalDataFlow.cs:498:15:498:16 | access to local variable y1 : SimpleClass [field field] : String | GlobalDataFlow.cs:498:15:498:22 | access to field field | provenance | |
| GlobalDataFlow.cs:499:15:499:16 | access to local variable y2 : SimpleClass [field field] : String | GlobalDataFlow.cs:499:15:499:22 | access to field field | provenance | |
| GlobalDataFlow.cs:500:15:500:16 | access to local variable y3 : SimpleClass [field field] : String | GlobalDataFlow.cs:500:15:500:22 | access to field field | provenance | |
-| GlobalDataFlow.cs:508:33:508:33 | [post] access to local variable x : SubSimpleClass [field field] : String | GlobalDataFlow.cs:509:15:509:15 | access to local variable x : SubSimpleClass [field field] : String | provenance | |
-| GlobalDataFlow.cs:509:15:509:15 | access to local variable x : SubSimpleClass [field field] : String | GlobalDataFlow.cs:509:15:509:21 | access to field field | provenance | |
-| GlobalDataFlow.cs:515:20:515:20 | [post] access to parameter x : SimpleClass [field field] : String | GlobalDataFlow.cs:516:15:516:15 | access to parameter x : SimpleClass [field field] : String | provenance | |
-| GlobalDataFlow.cs:515:25:515:25 | [post] access to local variable y : SimpleClass [field field] : String | GlobalDataFlow.cs:517:15:517:15 | access to local variable y : SimpleClass [field field] : String | provenance | |
+| GlobalDataFlow.cs:508:20:508:33 | [post] (...) ... : SimpleClass [field field] : String | GlobalDataFlow.cs:509:15:509:15 | access to local variable x : SimpleClass [field field] : String | provenance | |
+| GlobalDataFlow.cs:509:15:509:15 | access to local variable x : SimpleClass [field field] : String | GlobalDataFlow.cs:509:15:509:21 | access to field field | provenance | |
+| GlobalDataFlow.cs:515:20:515:25 | [post] ... ?? ... : SimpleClass [field field] : String | GlobalDataFlow.cs:516:15:516:15 | access to parameter x : SimpleClass [field field] : String | provenance | |
+| GlobalDataFlow.cs:515:20:515:25 | [post] ... ?? ... : SimpleClass [field field] : String | GlobalDataFlow.cs:517:15:517:15 | access to local variable y : SimpleClass [field field] : String | provenance | |
| GlobalDataFlow.cs:516:15:516:15 | access to parameter x : SimpleClass [field field] : String | GlobalDataFlow.cs:516:15:516:21 | access to field field | provenance | |
| GlobalDataFlow.cs:517:15:517:15 | access to local variable y : SimpleClass [field field] : String | GlobalDataFlow.cs:517:15:517:21 | access to field field | provenance | |
-| GlobalDataFlow.cs:527:20:527:20 | [post] access to local variable x : SimpleClass [field field] : String | GlobalDataFlow.cs:531:15:531:15 | access to local variable x : SimpleClass [field field] : String | provenance | |
-| GlobalDataFlow.cs:528:20:528:20 | [post] access to local variable y : SimpleClass [field field] : String | GlobalDataFlow.cs:532:15:532:15 | access to local variable y : SimpleClass [field field] : String | provenance | |
-| GlobalDataFlow.cs:529:18:529:18 | [post] access to local variable z : SimpleClass [field field] : String | GlobalDataFlow.cs:533:15:533:15 | access to local variable z : SimpleClass [field field] : String | provenance | |
+| GlobalDataFlow.cs:525:20:530:9 | [post] ... switch { ... } : SimpleClass [field field] : String | GlobalDataFlow.cs:531:15:531:15 | access to local variable x : SimpleClass [field field] : String | provenance | |
+| GlobalDataFlow.cs:525:20:530:9 | [post] ... switch { ... } : SimpleClass [field field] : String | GlobalDataFlow.cs:532:15:532:15 | access to local variable y : SimpleClass [field field] : String | provenance | |
+| GlobalDataFlow.cs:525:20:530:9 | [post] ... switch { ... } : SimpleClass [field field] : String | GlobalDataFlow.cs:533:15:533:15 | access to local variable z : SimpleClass [field field] : String | provenance | |
| GlobalDataFlow.cs:531:15:531:15 | access to local variable x : SimpleClass [field field] : String | GlobalDataFlow.cs:531:15:531:21 | access to field field | provenance | |
| GlobalDataFlow.cs:532:15:532:15 | access to local variable y : SimpleClass [field field] : String | GlobalDataFlow.cs:532:15:532:21 | access to field field | provenance | |
| GlobalDataFlow.cs:533:15:533:15 | access to local variable z : SimpleClass [field field] : String | GlobalDataFlow.cs:533:15:533:21 | access to field field | provenance | |
-| GlobalDataFlow.cs:538:20:538:21 | [post] access to parameter sc : SimpleClass [field field] : String | GlobalDataFlow.cs:539:15:539:16 | access to parameter sc : SimpleClass [field field] : String | provenance | |
+| GlobalDataFlow.cs:538:20:538:22 | [post] ...! : SimpleClass [field field] : String | GlobalDataFlow.cs:539:15:539:16 | access to parameter sc : SimpleClass [field field] : String | provenance | |
| GlobalDataFlow.cs:539:15:539:16 | access to parameter sc : SimpleClass [field field] : String | GlobalDataFlow.cs:539:15:539:22 | access to field field | provenance | |
-| GlobalDataFlow.cs:546:24:546:24 | [post] access to local variable x : SimpleClass [field field] : String | GlobalDataFlow.cs:547:15:547:15 | access to local variable x : SimpleClass [field field] : String | provenance | |
+| GlobalDataFlow.cs:546:20:546:24 | [post] ... = ... : SimpleClass [field field] : String | GlobalDataFlow.cs:547:15:547:15 | access to local variable x : SimpleClass [field field] : String | provenance | |
| GlobalDataFlow.cs:547:15:547:15 | access to local variable x : SimpleClass [field field] : String | GlobalDataFlow.cs:547:15:547:21 | access to field field | provenance | |
| GlobalDataFlow.cs:553:71:553:71 | e : null [element] : String | GlobalDataFlow.cs:556:27:556:27 | access to parameter e : null [element] : String | provenance | |
| GlobalDataFlow.cs:556:27:556:27 | access to parameter e : null [element] : String | GlobalDataFlow.cs:558:46:558:46 | access to local variable x : String | provenance | |
@@ -880,43 +874,37 @@ nodes
| GlobalDataFlow.cs:481:41:481:42 | sc [Return] : SimpleClass [field field] : String | semmle.label | sc [Return] : SimpleClass [field field] : String |
| GlobalDataFlow.cs:483:9:483:10 | [post] access to parameter sc : SimpleClass [field field] : String | semmle.label | [post] access to parameter sc : SimpleClass [field field] : String |
| GlobalDataFlow.cs:483:20:483:33 | "taint source" : String | semmle.label | "taint source" : String |
-| GlobalDataFlow.cs:490:25:490:26 | [post] access to local variable x1 : SimpleClass [field field] : String | semmle.label | [post] access to local variable x1 : SimpleClass [field field] : String |
-| GlobalDataFlow.cs:490:30:490:31 | [post] access to local variable x2 : SimpleClass [field field] : String | semmle.label | [post] access to local variable x2 : SimpleClass [field field] : String |
+| GlobalDataFlow.cs:490:20:490:31 | [post] ... ? ... : ... : SimpleClass [field field] : String | semmle.label | [post] ... ? ... : ... : SimpleClass [field field] : String |
| GlobalDataFlow.cs:491:15:491:16 | access to local variable x1 : SimpleClass [field field] : String | semmle.label | access to local variable x1 : SimpleClass [field field] : String |
| GlobalDataFlow.cs:491:15:491:22 | access to field field | semmle.label | access to field field |
| GlobalDataFlow.cs:492:15:492:16 | access to local variable x2 : SimpleClass [field field] : String | semmle.label | access to local variable x2 : SimpleClass [field field] : String |
| GlobalDataFlow.cs:492:15:492:22 | access to field field | semmle.label | access to field field |
-| GlobalDataFlow.cs:497:31:497:32 | [post] access to local variable y1 : SimpleClass [field field] : String | semmle.label | [post] access to local variable y1 : SimpleClass [field field] : String |
-| GlobalDataFlow.cs:497:36:497:37 | [post] access to local variable y2 : SimpleClass [field field] : String | semmle.label | [post] access to local variable y2 : SimpleClass [field field] : String |
-| GlobalDataFlow.cs:497:42:497:43 | [post] access to local variable y3 : SimpleClass [field field] : String | semmle.label | [post] access to local variable y3 : SimpleClass [field field] : String |
+| GlobalDataFlow.cs:497:20:497:43 | [post] ... ? ... : ... : SimpleClass [field field] : String | semmle.label | [post] ... ? ... : ... : SimpleClass [field field] : String |
| GlobalDataFlow.cs:498:15:498:16 | access to local variable y1 : SimpleClass [field field] : String | semmle.label | access to local variable y1 : SimpleClass [field field] : String |
| GlobalDataFlow.cs:498:15:498:22 | access to field field | semmle.label | access to field field |
| GlobalDataFlow.cs:499:15:499:16 | access to local variable y2 : SimpleClass [field field] : String | semmle.label | access to local variable y2 : SimpleClass [field field] : String |
| GlobalDataFlow.cs:499:15:499:22 | access to field field | semmle.label | access to field field |
| GlobalDataFlow.cs:500:15:500:16 | access to local variable y3 : SimpleClass [field field] : String | semmle.label | access to local variable y3 : SimpleClass [field field] : String |
| GlobalDataFlow.cs:500:15:500:22 | access to field field | semmle.label | access to field field |
-| GlobalDataFlow.cs:508:33:508:33 | [post] access to local variable x : SubSimpleClass [field field] : String | semmle.label | [post] access to local variable x : SubSimpleClass [field field] : String |
-| GlobalDataFlow.cs:509:15:509:15 | access to local variable x : SubSimpleClass [field field] : String | semmle.label | access to local variable x : SubSimpleClass [field field] : String |
+| GlobalDataFlow.cs:508:20:508:33 | [post] (...) ... : SimpleClass [field field] : String | semmle.label | [post] (...) ... : SimpleClass [field field] : String |
+| GlobalDataFlow.cs:509:15:509:15 | access to local variable x : SimpleClass [field field] : String | semmle.label | access to local variable x : SimpleClass [field field] : String |
| GlobalDataFlow.cs:509:15:509:21 | access to field field | semmle.label | access to field field |
-| GlobalDataFlow.cs:515:20:515:20 | [post] access to parameter x : SimpleClass [field field] : String | semmle.label | [post] access to parameter x : SimpleClass [field field] : String |
-| GlobalDataFlow.cs:515:25:515:25 | [post] access to local variable y : SimpleClass [field field] : String | semmle.label | [post] access to local variable y : SimpleClass [field field] : String |
+| GlobalDataFlow.cs:515:20:515:25 | [post] ... ?? ... : SimpleClass [field field] : String | semmle.label | [post] ... ?? ... : SimpleClass [field field] : String |
| GlobalDataFlow.cs:516:15:516:15 | access to parameter x : SimpleClass [field field] : String | semmle.label | access to parameter x : SimpleClass [field field] : String |
| GlobalDataFlow.cs:516:15:516:21 | access to field field | semmle.label | access to field field |
| GlobalDataFlow.cs:517:15:517:15 | access to local variable y : SimpleClass [field field] : String | semmle.label | access to local variable y : SimpleClass [field field] : String |
| GlobalDataFlow.cs:517:15:517:21 | access to field field | semmle.label | access to field field |
-| GlobalDataFlow.cs:527:20:527:20 | [post] access to local variable x : SimpleClass [field field] : String | semmle.label | [post] access to local variable x : SimpleClass [field field] : String |
-| GlobalDataFlow.cs:528:20:528:20 | [post] access to local variable y : SimpleClass [field field] : String | semmle.label | [post] access to local variable y : SimpleClass [field field] : String |
-| GlobalDataFlow.cs:529:18:529:18 | [post] access to local variable z : SimpleClass [field field] : String | semmle.label | [post] access to local variable z : SimpleClass [field field] : String |
+| GlobalDataFlow.cs:525:20:530:9 | [post] ... switch { ... } : SimpleClass [field field] : String | semmle.label | [post] ... switch { ... } : SimpleClass [field field] : String |
| GlobalDataFlow.cs:531:15:531:15 | access to local variable x : SimpleClass [field field] : String | semmle.label | access to local variable x : SimpleClass [field field] : String |
| GlobalDataFlow.cs:531:15:531:21 | access to field field | semmle.label | access to field field |
| GlobalDataFlow.cs:532:15:532:15 | access to local variable y : SimpleClass [field field] : String | semmle.label | access to local variable y : SimpleClass [field field] : String |
| GlobalDataFlow.cs:532:15:532:21 | access to field field | semmle.label | access to field field |
| GlobalDataFlow.cs:533:15:533:15 | access to local variable z : SimpleClass [field field] : String | semmle.label | access to local variable z : SimpleClass [field field] : String |
| GlobalDataFlow.cs:533:15:533:21 | access to field field | semmle.label | access to field field |
-| GlobalDataFlow.cs:538:20:538:21 | [post] access to parameter sc : SimpleClass [field field] : String | semmle.label | [post] access to parameter sc : SimpleClass [field field] : String |
+| GlobalDataFlow.cs:538:20:538:22 | [post] ...! : SimpleClass [field field] : String | semmle.label | [post] ...! : SimpleClass [field field] : String |
| GlobalDataFlow.cs:539:15:539:16 | access to parameter sc : SimpleClass [field field] : String | semmle.label | access to parameter sc : SimpleClass [field field] : String |
| GlobalDataFlow.cs:539:15:539:22 | access to field field | semmle.label | access to field field |
-| GlobalDataFlow.cs:546:24:546:24 | [post] access to local variable x : SimpleClass [field field] : String | semmle.label | [post] access to local variable x : SimpleClass [field field] : String |
+| GlobalDataFlow.cs:546:20:546:24 | [post] ... = ... : SimpleClass [field field] : String | semmle.label | [post] ... = ... : SimpleClass [field field] : String |
| GlobalDataFlow.cs:547:15:547:15 | access to local variable x : SimpleClass [field field] : String | semmle.label | access to local variable x : SimpleClass [field field] : String |
| GlobalDataFlow.cs:547:15:547:21 | access to field field | semmle.label | access to field field |
| GlobalDataFlow.cs:553:71:553:71 | e : null [element] : String | semmle.label | e : null [element] : String |
diff --git a/csharp/ql/test/library-tests/dataflow/global/TaintTrackingPath.expected b/csharp/ql/test/library-tests/dataflow/global/TaintTrackingPath.expected
index 43c462eaced..8fcf385a4f5 100644
--- a/csharp/ql/test/library-tests/dataflow/global/TaintTrackingPath.expected
+++ b/csharp/ql/test/library-tests/dataflow/global/TaintTrackingPath.expected
@@ -461,46 +461,40 @@ edges
| GlobalDataFlow.cs:469:21:469:21 | s : String | GlobalDataFlow.cs:469:32:469:32 | access to parameter s | provenance | |
| GlobalDataFlow.cs:470:15:470:17 | access to parameter arg : String | GlobalDataFlow.cs:469:21:469:21 | s : String | provenance | |
| GlobalDataFlow.cs:473:28:473:41 | "taint source" : String | GlobalDataFlow.cs:466:53:466:55 | arg : String | provenance | |
-| GlobalDataFlow.cs:481:41:481:42 | sc [Return] : SimpleClass [field field] : String | GlobalDataFlow.cs:490:25:490:26 | [post] access to local variable x1 : SimpleClass [field field] : String | provenance | |
-| GlobalDataFlow.cs:481:41:481:42 | sc [Return] : SimpleClass [field field] : String | GlobalDataFlow.cs:490:30:490:31 | [post] access to local variable x2 : SimpleClass [field field] : String | provenance | |
-| GlobalDataFlow.cs:481:41:481:42 | sc [Return] : SimpleClass [field field] : String | GlobalDataFlow.cs:497:31:497:32 | [post] access to local variable y1 : SimpleClass [field field] : String | provenance | |
-| GlobalDataFlow.cs:481:41:481:42 | sc [Return] : SimpleClass [field field] : String | GlobalDataFlow.cs:497:36:497:37 | [post] access to local variable y2 : SimpleClass [field field] : String | provenance | |
-| GlobalDataFlow.cs:481:41:481:42 | sc [Return] : SimpleClass [field field] : String | GlobalDataFlow.cs:497:42:497:43 | [post] access to local variable y3 : SimpleClass [field field] : String | provenance | |
-| GlobalDataFlow.cs:481:41:481:42 | sc [Return] : SimpleClass [field field] : String | GlobalDataFlow.cs:508:33:508:33 | [post] access to local variable x : SubSimpleClass [field field] : String | provenance | |
-| GlobalDataFlow.cs:481:41:481:42 | sc [Return] : SimpleClass [field field] : String | GlobalDataFlow.cs:515:20:515:20 | [post] access to parameter x : SimpleClass [field field] : String | provenance | |
-| GlobalDataFlow.cs:481:41:481:42 | sc [Return] : SimpleClass [field field] : String | GlobalDataFlow.cs:515:25:515:25 | [post] access to local variable y : SimpleClass [field field] : String | provenance | |
-| GlobalDataFlow.cs:481:41:481:42 | sc [Return] : SimpleClass [field field] : String | GlobalDataFlow.cs:527:20:527:20 | [post] access to local variable x : SimpleClass [field field] : String | provenance | |
-| GlobalDataFlow.cs:481:41:481:42 | sc [Return] : SimpleClass [field field] : String | GlobalDataFlow.cs:528:20:528:20 | [post] access to local variable y : SimpleClass [field field] : String | provenance | |
-| GlobalDataFlow.cs:481:41:481:42 | sc [Return] : SimpleClass [field field] : String | GlobalDataFlow.cs:529:18:529:18 | [post] access to local variable z : SimpleClass [field field] : String | provenance | |
-| GlobalDataFlow.cs:481:41:481:42 | sc [Return] : SimpleClass [field field] : String | GlobalDataFlow.cs:538:20:538:21 | [post] access to parameter sc : SimpleClass [field field] : String | provenance | |
-| GlobalDataFlow.cs:481:41:481:42 | sc [Return] : SimpleClass [field field] : String | GlobalDataFlow.cs:546:24:546:24 | [post] access to local variable x : SimpleClass [field field] : String | provenance | |
+| GlobalDataFlow.cs:481:41:481:42 | sc [Return] : SimpleClass [field field] : String | GlobalDataFlow.cs:490:20:490:31 | [post] ... ? ... : ... : SimpleClass [field field] : String | provenance | |
+| GlobalDataFlow.cs:481:41:481:42 | sc [Return] : SimpleClass [field field] : String | GlobalDataFlow.cs:497:20:497:43 | [post] ... ? ... : ... : SimpleClass [field field] : String | provenance | |
+| GlobalDataFlow.cs:481:41:481:42 | sc [Return] : SimpleClass [field field] : String | GlobalDataFlow.cs:508:20:508:33 | [post] (...) ... : SimpleClass [field field] : String | provenance | |
+| GlobalDataFlow.cs:481:41:481:42 | sc [Return] : SimpleClass [field field] : String | GlobalDataFlow.cs:515:20:515:25 | [post] ... ?? ... : SimpleClass [field field] : String | provenance | |
+| GlobalDataFlow.cs:481:41:481:42 | sc [Return] : SimpleClass [field field] : String | GlobalDataFlow.cs:525:20:530:9 | [post] ... switch { ... } : SimpleClass [field field] : String | provenance | |
+| GlobalDataFlow.cs:481:41:481:42 | sc [Return] : SimpleClass [field field] : String | GlobalDataFlow.cs:538:20:538:22 | [post] ...! : SimpleClass [field field] : String | provenance | |
+| GlobalDataFlow.cs:481:41:481:42 | sc [Return] : SimpleClass [field field] : String | GlobalDataFlow.cs:546:20:546:24 | [post] ... = ... : SimpleClass [field field] : String | provenance | |
| GlobalDataFlow.cs:483:9:483:10 | [post] access to parameter sc : SimpleClass [field field] : String | GlobalDataFlow.cs:481:41:481:42 | sc [Return] : SimpleClass [field field] : String | provenance | |
| GlobalDataFlow.cs:483:20:483:33 | "taint source" : String | GlobalDataFlow.cs:483:9:483:10 | [post] access to parameter sc : SimpleClass [field field] : String | provenance | |
-| GlobalDataFlow.cs:490:25:490:26 | [post] access to local variable x1 : SimpleClass [field field] : String | GlobalDataFlow.cs:491:15:491:16 | access to local variable x1 : SimpleClass [field field] : String | provenance | |
-| GlobalDataFlow.cs:490:30:490:31 | [post] access to local variable x2 : SimpleClass [field field] : String | GlobalDataFlow.cs:492:15:492:16 | access to local variable x2 : SimpleClass [field field] : String | provenance | |
+| GlobalDataFlow.cs:490:20:490:31 | [post] ... ? ... : ... : SimpleClass [field field] : String | GlobalDataFlow.cs:491:15:491:16 | access to local variable x1 : SimpleClass [field field] : String | provenance | |
+| GlobalDataFlow.cs:490:20:490:31 | [post] ... ? ... : ... : SimpleClass [field field] : String | GlobalDataFlow.cs:492:15:492:16 | access to local variable x2 : SimpleClass [field field] : String | provenance | |
| GlobalDataFlow.cs:491:15:491:16 | access to local variable x1 : SimpleClass [field field] : String | GlobalDataFlow.cs:491:15:491:22 | access to field field | provenance | |
| GlobalDataFlow.cs:492:15:492:16 | access to local variable x2 : SimpleClass [field field] : String | GlobalDataFlow.cs:492:15:492:22 | access to field field | provenance | |
-| GlobalDataFlow.cs:497:31:497:32 | [post] access to local variable y1 : SimpleClass [field field] : String | GlobalDataFlow.cs:498:15:498:16 | access to local variable y1 : SimpleClass [field field] : String | provenance | |
-| GlobalDataFlow.cs:497:36:497:37 | [post] access to local variable y2 : SimpleClass [field field] : String | GlobalDataFlow.cs:499:15:499:16 | access to local variable y2 : SimpleClass [field field] : String | provenance | |
-| GlobalDataFlow.cs:497:42:497:43 | [post] access to local variable y3 : SimpleClass [field field] : String | GlobalDataFlow.cs:500:15:500:16 | access to local variable y3 : SimpleClass [field field] : String | provenance | |
+| GlobalDataFlow.cs:497:20:497:43 | [post] ... ? ... : ... : SimpleClass [field field] : String | GlobalDataFlow.cs:498:15:498:16 | access to local variable y1 : SimpleClass [field field] : String | provenance | |
+| GlobalDataFlow.cs:497:20:497:43 | [post] ... ? ... : ... : SimpleClass [field field] : String | GlobalDataFlow.cs:499:15:499:16 | access to local variable y2 : SimpleClass [field field] : String | provenance | |
+| GlobalDataFlow.cs:497:20:497:43 | [post] ... ? ... : ... : SimpleClass [field field] : String | GlobalDataFlow.cs:500:15:500:16 | access to local variable y3 : SimpleClass [field field] : String | provenance | |
| GlobalDataFlow.cs:498:15:498:16 | access to local variable y1 : SimpleClass [field field] : String | GlobalDataFlow.cs:498:15:498:22 | access to field field | provenance | |
| GlobalDataFlow.cs:499:15:499:16 | access to local variable y2 : SimpleClass [field field] : String | GlobalDataFlow.cs:499:15:499:22 | access to field field | provenance | |
| GlobalDataFlow.cs:500:15:500:16 | access to local variable y3 : SimpleClass [field field] : String | GlobalDataFlow.cs:500:15:500:22 | access to field field | provenance | |
-| GlobalDataFlow.cs:508:33:508:33 | [post] access to local variable x : SubSimpleClass [field field] : String | GlobalDataFlow.cs:509:15:509:15 | access to local variable x : SubSimpleClass [field field] : String | provenance | |
-| GlobalDataFlow.cs:509:15:509:15 | access to local variable x : SubSimpleClass [field field] : String | GlobalDataFlow.cs:509:15:509:21 | access to field field | provenance | |
-| GlobalDataFlow.cs:515:20:515:20 | [post] access to parameter x : SimpleClass [field field] : String | GlobalDataFlow.cs:516:15:516:15 | access to parameter x : SimpleClass [field field] : String | provenance | |
-| GlobalDataFlow.cs:515:25:515:25 | [post] access to local variable y : SimpleClass [field field] : String | GlobalDataFlow.cs:517:15:517:15 | access to local variable y : SimpleClass [field field] : String | provenance | |
+| GlobalDataFlow.cs:508:20:508:33 | [post] (...) ... : SimpleClass [field field] : String | GlobalDataFlow.cs:509:15:509:15 | access to local variable x : SimpleClass [field field] : String | provenance | |
+| GlobalDataFlow.cs:509:15:509:15 | access to local variable x : SimpleClass [field field] : String | GlobalDataFlow.cs:509:15:509:21 | access to field field | provenance | |
+| GlobalDataFlow.cs:515:20:515:25 | [post] ... ?? ... : SimpleClass [field field] : String | GlobalDataFlow.cs:516:15:516:15 | access to parameter x : SimpleClass [field field] : String | provenance | |
+| GlobalDataFlow.cs:515:20:515:25 | [post] ... ?? ... : SimpleClass [field field] : String | GlobalDataFlow.cs:517:15:517:15 | access to local variable y : SimpleClass [field field] : String | provenance | |
| GlobalDataFlow.cs:516:15:516:15 | access to parameter x : SimpleClass [field field] : String | GlobalDataFlow.cs:516:15:516:21 | access to field field | provenance | |
| GlobalDataFlow.cs:517:15:517:15 | access to local variable y : SimpleClass [field field] : String | GlobalDataFlow.cs:517:15:517:21 | access to field field | provenance | |
-| GlobalDataFlow.cs:527:20:527:20 | [post] access to local variable x : SimpleClass [field field] : String | GlobalDataFlow.cs:531:15:531:15 | access to local variable x : SimpleClass [field field] : String | provenance | |
-| GlobalDataFlow.cs:528:20:528:20 | [post] access to local variable y : SimpleClass [field field] : String | GlobalDataFlow.cs:532:15:532:15 | access to local variable y : SimpleClass [field field] : String | provenance | |
-| GlobalDataFlow.cs:529:18:529:18 | [post] access to local variable z : SimpleClass [field field] : String | GlobalDataFlow.cs:533:15:533:15 | access to local variable z : SimpleClass [field field] : String | provenance | |
+| GlobalDataFlow.cs:525:20:530:9 | [post] ... switch { ... } : SimpleClass [field field] : String | GlobalDataFlow.cs:531:15:531:15 | access to local variable x : SimpleClass [field field] : String | provenance | |
+| GlobalDataFlow.cs:525:20:530:9 | [post] ... switch { ... } : SimpleClass [field field] : String | GlobalDataFlow.cs:532:15:532:15 | access to local variable y : SimpleClass [field field] : String | provenance | |
+| GlobalDataFlow.cs:525:20:530:9 | [post] ... switch { ... } : SimpleClass [field field] : String | GlobalDataFlow.cs:533:15:533:15 | access to local variable z : SimpleClass [field field] : String | provenance | |
| GlobalDataFlow.cs:531:15:531:15 | access to local variable x : SimpleClass [field field] : String | GlobalDataFlow.cs:531:15:531:21 | access to field field | provenance | |
| GlobalDataFlow.cs:532:15:532:15 | access to local variable y : SimpleClass [field field] : String | GlobalDataFlow.cs:532:15:532:21 | access to field field | provenance | |
| GlobalDataFlow.cs:533:15:533:15 | access to local variable z : SimpleClass [field field] : String | GlobalDataFlow.cs:533:15:533:21 | access to field field | provenance | |
-| GlobalDataFlow.cs:538:20:538:21 | [post] access to parameter sc : SimpleClass [field field] : String | GlobalDataFlow.cs:539:15:539:16 | access to parameter sc : SimpleClass [field field] : String | provenance | |
+| GlobalDataFlow.cs:538:20:538:22 | [post] ...! : SimpleClass [field field] : String | GlobalDataFlow.cs:539:15:539:16 | access to parameter sc : SimpleClass [field field] : String | provenance | |
| GlobalDataFlow.cs:539:15:539:16 | access to parameter sc : SimpleClass [field field] : String | GlobalDataFlow.cs:539:15:539:22 | access to field field | provenance | |
-| GlobalDataFlow.cs:546:24:546:24 | [post] access to local variable x : SimpleClass [field field] : String | GlobalDataFlow.cs:547:15:547:15 | access to local variable x : SimpleClass [field field] : String | provenance | |
+| GlobalDataFlow.cs:546:20:546:24 | [post] ... = ... : SimpleClass [field field] : String | GlobalDataFlow.cs:547:15:547:15 | access to local variable x : SimpleClass [field field] : String | provenance | |
| GlobalDataFlow.cs:547:15:547:15 | access to local variable x : SimpleClass [field field] : String | GlobalDataFlow.cs:547:15:547:21 | access to field field | provenance | |
| GlobalDataFlow.cs:553:71:553:71 | e : null [element] : String | GlobalDataFlow.cs:556:27:556:27 | access to parameter e : null [element] : String | provenance | |
| GlobalDataFlow.cs:556:27:556:27 | access to parameter e : null [element] : String | GlobalDataFlow.cs:558:46:558:46 | access to local variable x : String | provenance | |
@@ -983,43 +977,37 @@ nodes
| GlobalDataFlow.cs:481:41:481:42 | sc [Return] : SimpleClass [field field] : String | semmle.label | sc [Return] : SimpleClass [field field] : String |
| GlobalDataFlow.cs:483:9:483:10 | [post] access to parameter sc : SimpleClass [field field] : String | semmle.label | [post] access to parameter sc : SimpleClass [field field] : String |
| GlobalDataFlow.cs:483:20:483:33 | "taint source" : String | semmle.label | "taint source" : String |
-| GlobalDataFlow.cs:490:25:490:26 | [post] access to local variable x1 : SimpleClass [field field] : String | semmle.label | [post] access to local variable x1 : SimpleClass [field field] : String |
-| GlobalDataFlow.cs:490:30:490:31 | [post] access to local variable x2 : SimpleClass [field field] : String | semmle.label | [post] access to local variable x2 : SimpleClass [field field] : String |
+| GlobalDataFlow.cs:490:20:490:31 | [post] ... ? ... : ... : SimpleClass [field field] : String | semmle.label | [post] ... ? ... : ... : SimpleClass [field field] : String |
| GlobalDataFlow.cs:491:15:491:16 | access to local variable x1 : SimpleClass [field field] : String | semmle.label | access to local variable x1 : SimpleClass [field field] : String |
| GlobalDataFlow.cs:491:15:491:22 | access to field field | semmle.label | access to field field |
| GlobalDataFlow.cs:492:15:492:16 | access to local variable x2 : SimpleClass [field field] : String | semmle.label | access to local variable x2 : SimpleClass [field field] : String |
| GlobalDataFlow.cs:492:15:492:22 | access to field field | semmle.label | access to field field |
-| GlobalDataFlow.cs:497:31:497:32 | [post] access to local variable y1 : SimpleClass [field field] : String | semmle.label | [post] access to local variable y1 : SimpleClass [field field] : String |
-| GlobalDataFlow.cs:497:36:497:37 | [post] access to local variable y2 : SimpleClass [field field] : String | semmle.label | [post] access to local variable y2 : SimpleClass [field field] : String |
-| GlobalDataFlow.cs:497:42:497:43 | [post] access to local variable y3 : SimpleClass [field field] : String | semmle.label | [post] access to local variable y3 : SimpleClass [field field] : String |
+| GlobalDataFlow.cs:497:20:497:43 | [post] ... ? ... : ... : SimpleClass [field field] : String | semmle.label | [post] ... ? ... : ... : SimpleClass [field field] : String |
| GlobalDataFlow.cs:498:15:498:16 | access to local variable y1 : SimpleClass [field field] : String | semmle.label | access to local variable y1 : SimpleClass [field field] : String |
| GlobalDataFlow.cs:498:15:498:22 | access to field field | semmle.label | access to field field |
| GlobalDataFlow.cs:499:15:499:16 | access to local variable y2 : SimpleClass [field field] : String | semmle.label | access to local variable y2 : SimpleClass [field field] : String |
| GlobalDataFlow.cs:499:15:499:22 | access to field field | semmle.label | access to field field |
| GlobalDataFlow.cs:500:15:500:16 | access to local variable y3 : SimpleClass [field field] : String | semmle.label | access to local variable y3 : SimpleClass [field field] : String |
| GlobalDataFlow.cs:500:15:500:22 | access to field field | semmle.label | access to field field |
-| GlobalDataFlow.cs:508:33:508:33 | [post] access to local variable x : SubSimpleClass [field field] : String | semmle.label | [post] access to local variable x : SubSimpleClass [field field] : String |
-| GlobalDataFlow.cs:509:15:509:15 | access to local variable x : SubSimpleClass [field field] : String | semmle.label | access to local variable x : SubSimpleClass [field field] : String |
+| GlobalDataFlow.cs:508:20:508:33 | [post] (...) ... : SimpleClass [field field] : String | semmle.label | [post] (...) ... : SimpleClass [field field] : String |
+| GlobalDataFlow.cs:509:15:509:15 | access to local variable x : SimpleClass [field field] : String | semmle.label | access to local variable x : SimpleClass [field field] : String |
| GlobalDataFlow.cs:509:15:509:21 | access to field field | semmle.label | access to field field |
-| GlobalDataFlow.cs:515:20:515:20 | [post] access to parameter x : SimpleClass [field field] : String | semmle.label | [post] access to parameter x : SimpleClass [field field] : String |
-| GlobalDataFlow.cs:515:25:515:25 | [post] access to local variable y : SimpleClass [field field] : String | semmle.label | [post] access to local variable y : SimpleClass [field field] : String |
+| GlobalDataFlow.cs:515:20:515:25 | [post] ... ?? ... : SimpleClass [field field] : String | semmle.label | [post] ... ?? ... : SimpleClass [field field] : String |
| GlobalDataFlow.cs:516:15:516:15 | access to parameter x : SimpleClass [field field] : String | semmle.label | access to parameter x : SimpleClass [field field] : String |
| GlobalDataFlow.cs:516:15:516:21 | access to field field | semmle.label | access to field field |
| GlobalDataFlow.cs:517:15:517:15 | access to local variable y : SimpleClass [field field] : String | semmle.label | access to local variable y : SimpleClass [field field] : String |
| GlobalDataFlow.cs:517:15:517:21 | access to field field | semmle.label | access to field field |
-| GlobalDataFlow.cs:527:20:527:20 | [post] access to local variable x : SimpleClass [field field] : String | semmle.label | [post] access to local variable x : SimpleClass [field field] : String |
-| GlobalDataFlow.cs:528:20:528:20 | [post] access to local variable y : SimpleClass [field field] : String | semmle.label | [post] access to local variable y : SimpleClass [field field] : String |
-| GlobalDataFlow.cs:529:18:529:18 | [post] access to local variable z : SimpleClass [field field] : String | semmle.label | [post] access to local variable z : SimpleClass [field field] : String |
+| GlobalDataFlow.cs:525:20:530:9 | [post] ... switch { ... } : SimpleClass [field field] : String | semmle.label | [post] ... switch { ... } : SimpleClass [field field] : String |
| GlobalDataFlow.cs:531:15:531:15 | access to local variable x : SimpleClass [field field] : String | semmle.label | access to local variable x : SimpleClass [field field] : String |
| GlobalDataFlow.cs:531:15:531:21 | access to field field | semmle.label | access to field field |
| GlobalDataFlow.cs:532:15:532:15 | access to local variable y : SimpleClass [field field] : String | semmle.label | access to local variable y : SimpleClass [field field] : String |
| GlobalDataFlow.cs:532:15:532:21 | access to field field | semmle.label | access to field field |
| GlobalDataFlow.cs:533:15:533:15 | access to local variable z : SimpleClass [field field] : String | semmle.label | access to local variable z : SimpleClass [field field] : String |
| GlobalDataFlow.cs:533:15:533:21 | access to field field | semmle.label | access to field field |
-| GlobalDataFlow.cs:538:20:538:21 | [post] access to parameter sc : SimpleClass [field field] : String | semmle.label | [post] access to parameter sc : SimpleClass [field field] : String |
+| GlobalDataFlow.cs:538:20:538:22 | [post] ...! : SimpleClass [field field] : String | semmle.label | [post] ...! : SimpleClass [field field] : String |
| GlobalDataFlow.cs:539:15:539:16 | access to parameter sc : SimpleClass [field field] : String | semmle.label | access to parameter sc : SimpleClass [field field] : String |
| GlobalDataFlow.cs:539:15:539:22 | access to field field | semmle.label | access to field field |
-| GlobalDataFlow.cs:546:24:546:24 | [post] access to local variable x : SimpleClass [field field] : String | semmle.label | [post] access to local variable x : SimpleClass [field field] : String |
+| GlobalDataFlow.cs:546:20:546:24 | [post] ... = ... : SimpleClass [field field] : String | semmle.label | [post] ... = ... : SimpleClass [field field] : String |
| GlobalDataFlow.cs:547:15:547:15 | access to local variable x : SimpleClass [field field] : String | semmle.label | access to local variable x : SimpleClass [field field] : String |
| GlobalDataFlow.cs:547:15:547:21 | access to field field | semmle.label | access to field field |
| GlobalDataFlow.cs:553:71:553:71 | e : null [element] : String | semmle.label | e : null [element] : String |
diff --git a/csharp/ql/test/library-tests/dataflow/local/DataFlowStep.expected b/csharp/ql/test/library-tests/dataflow/local/DataFlowStep.expected
index 9e488197e7c..7dc5e3e4636 100644
--- a/csharp/ql/test/library-tests/dataflow/local/DataFlowStep.expected
+++ b/csharp/ql/test/library-tests/dataflow/local/DataFlowStep.expected
@@ -72,11 +72,10 @@
| LocalDataFlow.cs:88:9:88:16 | access to local variable nonSink0 | LocalDataFlow.cs:88:9:88:36 | SSA def(nonSink0) |
| LocalDataFlow.cs:88:9:88:36 | SSA def(nonSink0) | LocalDataFlow.cs:89:15:89:22 | access to local variable nonSink0 |
| LocalDataFlow.cs:88:20:88:36 | ... ? ... : ... | LocalDataFlow.cs:88:9:88:16 | access to local variable nonSink0 |
-| LocalDataFlow.cs:88:20:88:36 | SSA phi(sink7) | LocalDataFlow.cs:92:29:92:33 | access to local variable sink7 |
| LocalDataFlow.cs:88:24:88:28 | "abc" | LocalDataFlow.cs:88:20:88:36 | ... ? ... : ... |
-| LocalDataFlow.cs:88:24:88:28 | [input] SSA phi(sink7) | LocalDataFlow.cs:88:20:88:36 | SSA phi(sink7) |
+| LocalDataFlow.cs:88:24:88:28 | [input] SSA phi(sink7) | LocalDataFlow.cs:92:29:92:33 | access to local variable sink7 |
| LocalDataFlow.cs:88:32:88:36 | "def" | LocalDataFlow.cs:88:20:88:36 | ... ? ... : ... |
-| LocalDataFlow.cs:88:32:88:36 | [input] SSA phi(sink7) | LocalDataFlow.cs:88:20:88:36 | SSA phi(sink7) |
+| LocalDataFlow.cs:88:32:88:36 | [input] SSA phi(sink7) | LocalDataFlow.cs:92:29:92:33 | access to local variable sink7 |
| LocalDataFlow.cs:89:15:89:22 | [post] access to local variable nonSink0 | LocalDataFlow.cs:96:32:96:39 | access to local variable nonSink0 |
| LocalDataFlow.cs:89:15:89:22 | access to local variable nonSink0 | LocalDataFlow.cs:96:32:96:39 | access to local variable nonSink0 |
| LocalDataFlow.cs:92:13:92:17 | access to local variable sink8 | LocalDataFlow.cs:92:13:92:33 | SSA def(sink8) |
@@ -480,14 +479,12 @@
| LocalDataFlow.cs:307:18:307:33 | String nonSink17 | LocalDataFlow.cs:307:18:307:33 | SSA def(nonSink17) |
| LocalDataFlow.cs:313:13:313:18 | access to local variable sink73 | LocalDataFlow.cs:313:13:313:38 | SSA def(sink73) |
| LocalDataFlow.cs:313:13:313:38 | SSA def(sink73) | LocalDataFlow.cs:315:15:315:20 | access to local variable sink73 |
-| LocalDataFlow.cs:313:22:313:29 | [input] SSA phi read(sink0) | LocalDataFlow.cs:313:22:313:38 | SSA phi read(sink0) |
+| LocalDataFlow.cs:313:22:313:29 | [input] SSA phi read(sink0) | LocalDataFlow.cs:314:22:314:26 | access to local variable sink0 |
| LocalDataFlow.cs:313:22:313:29 | access to local variable nonSink0 | LocalDataFlow.cs:313:22:313:38 | ... ?? ... |
| LocalDataFlow.cs:313:22:313:29 | access to local variable nonSink0 | LocalDataFlow.cs:314:31:314:38 | access to local variable nonSink0 |
| LocalDataFlow.cs:313:22:313:38 | ... ?? ... | LocalDataFlow.cs:313:13:313:18 | access to local variable sink73 |
-| LocalDataFlow.cs:313:22:313:38 | SSA phi read(sink0) | LocalDataFlow.cs:314:22:314:26 | access to local variable sink0 |
-| LocalDataFlow.cs:313:34:313:38 | [input] SSA phi read(sink0) | LocalDataFlow.cs:313:22:313:38 | SSA phi read(sink0) |
| LocalDataFlow.cs:313:34:313:38 | access to local variable sink0 | LocalDataFlow.cs:313:22:313:38 | ... ?? ... |
-| LocalDataFlow.cs:313:34:313:38 | access to local variable sink0 | LocalDataFlow.cs:313:34:313:38 | [input] SSA phi read(sink0) |
+| LocalDataFlow.cs:313:34:313:38 | access to local variable sink0 | LocalDataFlow.cs:314:22:314:26 | access to local variable sink0 |
| LocalDataFlow.cs:314:13:314:18 | access to local variable sink74 | LocalDataFlow.cs:314:13:314:38 | SSA def(sink74) |
| LocalDataFlow.cs:314:13:314:38 | SSA def(sink74) | LocalDataFlow.cs:316:15:316:20 | access to local variable sink74 |
| LocalDataFlow.cs:314:22:314:26 | access to local variable sink0 | LocalDataFlow.cs:314:22:314:38 | ... ?? ... |
@@ -526,12 +523,10 @@
| LocalDataFlow.cs:373:13:373:25 | SSA def(x) | LocalDataFlow.cs:374:17:374:18 | [input] SSA phi(x) |
| LocalDataFlow.cs:373:13:373:25 | SSA def(x) | LocalDataFlow.cs:376:35:376:35 | access to local variable x |
| LocalDataFlow.cs:373:17:373:25 | "tainted" | LocalDataFlow.cs:373:13:373:13 | access to local variable x |
-| LocalDataFlow.cs:374:17:374:18 | [input] SSA phi(x) | LocalDataFlow.cs:382:9:382:17 | SSA phi(x) |
+| LocalDataFlow.cs:374:17:374:18 | [input] SSA phi(x) | LocalDataFlow.cs:382:15:382:15 | access to local variable x |
| LocalDataFlow.cs:381:13:381:13 | access to local variable x | LocalDataFlow.cs:381:13:381:29 | SSA def(x) |
-| LocalDataFlow.cs:381:13:381:29 | SSA def(x) | LocalDataFlow.cs:381:13:381:29 | [input] SSA phi(x) |
-| LocalDataFlow.cs:381:13:381:29 | [input] SSA phi(x) | LocalDataFlow.cs:382:9:382:17 | SSA phi(x) |
+| LocalDataFlow.cs:381:13:381:29 | SSA def(x) | LocalDataFlow.cs:382:15:382:15 | access to local variable x |
| LocalDataFlow.cs:381:17:381:29 | "not tainted" | LocalDataFlow.cs:381:13:381:13 | access to local variable x |
-| LocalDataFlow.cs:382:9:382:17 | SSA phi(x) | LocalDataFlow.cs:382:15:382:15 | access to local variable x |
| SSA.cs:5:17:5:17 | SSA entry def(this.S) | SSA.cs:67:9:67:14 | access to field S |
| SSA.cs:5:17:5:17 | this | SSA.cs:67:9:67:12 | this access |
| SSA.cs:5:26:5:32 | SSA param(tainted) | SSA.cs:8:24:8:30 | access to parameter tainted |
@@ -559,47 +554,38 @@
| SSA.cs:19:13:19:20 | access to local variable nonSink0 | SSA.cs:29:13:29:33 | [input] SSA phi read(nonSink0) |
| SSA.cs:19:13:19:20 | access to local variable nonSink0 | SSA.cs:30:24:30:31 | access to local variable nonSink0 |
| SSA.cs:22:16:22:23 | access to local variable ssaSink1 | SSA.cs:22:16:22:28 | SSA def(ssaSink1) |
-| SSA.cs:22:16:22:28 | SSA def(ssaSink1) | SSA.cs:23:13:23:33 | [input] SSA phi(ssaSink1) |
+| SSA.cs:22:16:22:28 | SSA def(ssaSink1) | SSA.cs:25:15:25:22 | access to local variable ssaSink1 |
| SSA.cs:22:27:22:28 | "" | SSA.cs:22:16:22:23 | access to local variable ssaSink1 |
| SSA.cs:23:13:23:22 | [post] access to parameter nonTainted | SSA.cs:29:13:29:22 | access to parameter nonTainted |
| SSA.cs:23:13:23:22 | access to parameter nonTainted | SSA.cs:29:13:29:22 | access to parameter nonTainted |
| SSA.cs:23:13:23:33 | [input] SSA phi read(ssaSink0) | SSA.cs:25:9:25:24 | SSA phi read(ssaSink0) |
-| SSA.cs:23:13:23:33 | [input] SSA phi(ssaSink1) | SSA.cs:25:9:25:24 | SSA phi(ssaSink1) |
| SSA.cs:24:13:24:20 | access to local variable ssaSink1 | SSA.cs:24:13:24:31 | SSA def(ssaSink1) |
-| SSA.cs:24:13:24:31 | SSA def(ssaSink1) | SSA.cs:24:13:24:31 | [input] SSA phi(ssaSink1) |
-| SSA.cs:24:13:24:31 | [input] SSA phi read(ssaSink0) | SSA.cs:25:9:25:24 | SSA phi read(ssaSink0) |
-| SSA.cs:24:13:24:31 | [input] SSA phi(ssaSink1) | SSA.cs:25:9:25:24 | SSA phi(ssaSink1) |
+| SSA.cs:24:13:24:31 | SSA def(ssaSink1) | SSA.cs:25:15:25:22 | access to local variable ssaSink1 |
| SSA.cs:24:24:24:31 | access to local variable ssaSink0 | SSA.cs:24:13:24:20 | access to local variable ssaSink1 |
-| SSA.cs:24:24:24:31 | access to local variable ssaSink0 | SSA.cs:24:13:24:31 | [input] SSA phi read(ssaSink0) |
+| SSA.cs:24:24:24:31 | access to local variable ssaSink0 | SSA.cs:25:9:25:24 | SSA phi read(ssaSink0) |
| SSA.cs:25:9:25:24 | SSA phi read(ssaSink0) | SSA.cs:35:13:35:33 | [input] SSA phi read(ssaSink0) |
| SSA.cs:25:9:25:24 | SSA phi read(ssaSink0) | SSA.cs:37:24:37:31 | access to local variable ssaSink0 |
-| SSA.cs:25:9:25:24 | SSA phi(ssaSink1) | SSA.cs:25:15:25:22 | access to local variable ssaSink1 |
| SSA.cs:28:16:28:23 | access to local variable nonSink1 | SSA.cs:28:16:28:28 | SSA def(nonSink1) |
-| SSA.cs:28:16:28:28 | SSA def(nonSink1) | SSA.cs:29:13:29:33 | [input] SSA phi(nonSink1) |
+| SSA.cs:28:16:28:28 | SSA def(nonSink1) | SSA.cs:31:15:31:22 | access to local variable nonSink1 |
| SSA.cs:28:27:28:28 | "" | SSA.cs:28:16:28:23 | access to local variable nonSink1 |
| SSA.cs:29:13:29:22 | [post] access to parameter nonTainted | SSA.cs:35:13:35:22 | access to parameter nonTainted |
| SSA.cs:29:13:29:22 | access to parameter nonTainted | SSA.cs:35:13:35:22 | access to parameter nonTainted |
| SSA.cs:29:13:29:33 | [input] SSA phi read(nonSink0) | SSA.cs:31:9:31:24 | SSA phi read(nonSink0) |
-| SSA.cs:29:13:29:33 | [input] SSA phi(nonSink1) | SSA.cs:31:9:31:24 | SSA phi(nonSink1) |
| SSA.cs:30:13:30:20 | access to local variable nonSink1 | SSA.cs:30:13:30:31 | SSA def(nonSink1) |
-| SSA.cs:30:13:30:31 | SSA def(nonSink1) | SSA.cs:30:13:30:31 | [input] SSA phi(nonSink1) |
-| SSA.cs:30:13:30:31 | [input] SSA phi read(nonSink0) | SSA.cs:31:9:31:24 | SSA phi read(nonSink0) |
-| SSA.cs:30:13:30:31 | [input] SSA phi(nonSink1) | SSA.cs:31:9:31:24 | SSA phi(nonSink1) |
+| SSA.cs:30:13:30:31 | SSA def(nonSink1) | SSA.cs:31:15:31:22 | access to local variable nonSink1 |
| SSA.cs:30:24:30:31 | access to local variable nonSink0 | SSA.cs:30:13:30:20 | access to local variable nonSink1 |
-| SSA.cs:30:24:30:31 | access to local variable nonSink0 | SSA.cs:30:13:30:31 | [input] SSA phi read(nonSink0) |
+| SSA.cs:30:24:30:31 | access to local variable nonSink0 | SSA.cs:31:9:31:24 | SSA phi read(nonSink0) |
| SSA.cs:31:9:31:24 | SSA phi read(nonSink0) | SSA.cs:47:13:47:33 | [input] SSA phi read(nonSink0) |
| SSA.cs:31:9:31:24 | SSA phi read(nonSink0) | SSA.cs:49:24:49:31 | access to local variable nonSink0 |
-| SSA.cs:31:9:31:24 | SSA phi(nonSink1) | SSA.cs:31:15:31:22 | access to local variable nonSink1 |
| SSA.cs:34:16:34:23 | access to local variable ssaSink2 | SSA.cs:34:16:34:28 | SSA def(ssaSink2) |
-| SSA.cs:34:16:34:28 | SSA def(ssaSink2) | SSA.cs:35:13:35:33 | [input] SSA phi(ssaSink2) |
+| SSA.cs:34:16:34:28 | SSA def(ssaSink2) | SSA.cs:43:15:43:22 | access to local variable ssaSink2 |
| SSA.cs:34:27:34:28 | "" | SSA.cs:34:16:34:23 | access to local variable ssaSink2 |
| SSA.cs:35:13:35:22 | [post] access to parameter nonTainted | SSA.cs:35:13:35:33 | [input] SSA phi read(nonTainted) |
| SSA.cs:35:13:35:22 | [post] access to parameter nonTainted | SSA.cs:38:17:38:26 | access to parameter nonTainted |
| SSA.cs:35:13:35:22 | access to parameter nonTainted | SSA.cs:35:13:35:33 | [input] SSA phi read(nonTainted) |
| SSA.cs:35:13:35:22 | access to parameter nonTainted | SSA.cs:38:17:38:26 | access to parameter nonTainted |
-| SSA.cs:35:13:35:33 | [input] SSA phi read(nonTainted) | SSA.cs:43:9:43:24 | SSA phi read(nonTainted) |
+| SSA.cs:35:13:35:33 | [input] SSA phi read(nonTainted) | SSA.cs:47:13:47:22 | access to parameter nonTainted |
| SSA.cs:35:13:35:33 | [input] SSA phi read(ssaSink0) | SSA.cs:43:9:43:24 | SSA phi read(ssaSink0) |
-| SSA.cs:35:13:35:33 | [input] SSA phi(ssaSink2) | SSA.cs:43:9:43:24 | SSA phi(ssaSink2) |
| SSA.cs:37:13:37:20 | access to local variable ssaSink2 | SSA.cs:37:13:37:31 | SSA def(ssaSink2) |
| SSA.cs:37:13:37:31 | SSA def(ssaSink2) | SSA.cs:39:21:39:28 | access to local variable ssaSink2 |
| SSA.cs:37:13:37:31 | SSA def(ssaSink2) | SSA.cs:41:21:41:28 | access to local variable ssaSink2 |
@@ -610,30 +596,25 @@
| SSA.cs:38:17:38:26 | [post] access to parameter nonTainted | SSA.cs:41:17:41:29 | [input] SSA phi read(nonTainted) |
| SSA.cs:38:17:38:26 | access to parameter nonTainted | SSA.cs:39:17:39:29 | [input] SSA phi read(nonTainted) |
| SSA.cs:38:17:38:26 | access to parameter nonTainted | SSA.cs:41:17:41:29 | [input] SSA phi read(nonTainted) |
-| SSA.cs:39:17:39:29 | [input] SSA phi read(nonTainted) | SSA.cs:43:9:43:24 | SSA phi read(nonTainted) |
+| SSA.cs:39:17:39:29 | [input] SSA phi read(nonTainted) | SSA.cs:47:13:47:22 | access to parameter nonTainted |
| SSA.cs:39:17:39:29 | [input] SSA phi read(ssaSink0) | SSA.cs:43:9:43:24 | SSA phi read(ssaSink0) |
-| SSA.cs:39:17:39:29 | [input] SSA phi(ssaSink2) | SSA.cs:43:9:43:24 | SSA phi(ssaSink2) |
-| SSA.cs:39:21:39:28 | [post] access to local variable ssaSink2 | SSA.cs:39:17:39:29 | [input] SSA phi(ssaSink2) |
-| SSA.cs:39:21:39:28 | access to local variable ssaSink2 | SSA.cs:39:17:39:29 | [input] SSA phi(ssaSink2) |
-| SSA.cs:41:17:41:29 | [input] SSA phi read(nonTainted) | SSA.cs:43:9:43:24 | SSA phi read(nonTainted) |
+| SSA.cs:39:21:39:28 | [post] access to local variable ssaSink2 | SSA.cs:43:15:43:22 | access to local variable ssaSink2 |
+| SSA.cs:39:21:39:28 | access to local variable ssaSink2 | SSA.cs:43:15:43:22 | access to local variable ssaSink2 |
+| SSA.cs:41:17:41:29 | [input] SSA phi read(nonTainted) | SSA.cs:47:13:47:22 | access to parameter nonTainted |
| SSA.cs:41:17:41:29 | [input] SSA phi read(ssaSink0) | SSA.cs:43:9:43:24 | SSA phi read(ssaSink0) |
-| SSA.cs:41:17:41:29 | [input] SSA phi(ssaSink2) | SSA.cs:43:9:43:24 | SSA phi(ssaSink2) |
-| SSA.cs:41:21:41:28 | [post] access to local variable ssaSink2 | SSA.cs:41:17:41:29 | [input] SSA phi(ssaSink2) |
-| SSA.cs:41:21:41:28 | access to local variable ssaSink2 | SSA.cs:41:17:41:29 | [input] SSA phi(ssaSink2) |
-| SSA.cs:43:9:43:24 | SSA phi read(nonTainted) | SSA.cs:47:13:47:22 | access to parameter nonTainted |
+| SSA.cs:41:21:41:28 | [post] access to local variable ssaSink2 | SSA.cs:43:15:43:22 | access to local variable ssaSink2 |
+| SSA.cs:41:21:41:28 | access to local variable ssaSink2 | SSA.cs:43:15:43:22 | access to local variable ssaSink2 |
| SSA.cs:43:9:43:24 | SSA phi read(ssaSink0) | SSA.cs:89:13:89:33 | [input] SSA phi read(ssaSink0) |
| SSA.cs:43:9:43:24 | SSA phi read(ssaSink0) | SSA.cs:91:24:91:31 | access to local variable ssaSink0 |
-| SSA.cs:43:9:43:24 | SSA phi(ssaSink2) | SSA.cs:43:15:43:22 | access to local variable ssaSink2 |
| SSA.cs:46:16:46:23 | access to local variable nonSink2 | SSA.cs:46:16:46:28 | SSA def(nonSink2) |
-| SSA.cs:46:16:46:28 | SSA def(nonSink2) | SSA.cs:47:13:47:33 | [input] SSA phi(nonSink2) |
+| SSA.cs:46:16:46:28 | SSA def(nonSink2) | SSA.cs:55:15:55:22 | access to local variable nonSink2 |
| SSA.cs:46:27:46:28 | "" | SSA.cs:46:16:46:23 | access to local variable nonSink2 |
| SSA.cs:47:13:47:22 | [post] access to parameter nonTainted | SSA.cs:47:13:47:33 | [input] SSA phi read(nonTainted) |
| SSA.cs:47:13:47:22 | [post] access to parameter nonTainted | SSA.cs:50:17:50:26 | access to parameter nonTainted |
| SSA.cs:47:13:47:22 | access to parameter nonTainted | SSA.cs:47:13:47:33 | [input] SSA phi read(nonTainted) |
| SSA.cs:47:13:47:22 | access to parameter nonTainted | SSA.cs:50:17:50:26 | access to parameter nonTainted |
-| SSA.cs:47:13:47:33 | [input] SSA phi read(nonSink0) | SSA.cs:55:9:55:24 | SSA phi read(nonSink0) |
-| SSA.cs:47:13:47:33 | [input] SSA phi read(nonTainted) | SSA.cs:55:9:55:24 | SSA phi read(nonTainted) |
-| SSA.cs:47:13:47:33 | [input] SSA phi(nonSink2) | SSA.cs:55:9:55:24 | SSA phi(nonSink2) |
+| SSA.cs:47:13:47:33 | [input] SSA phi read(nonSink0) | SSA.cs:63:23:63:30 | access to local variable nonSink0 |
+| SSA.cs:47:13:47:33 | [input] SSA phi read(nonTainted) | SSA.cs:89:13:89:22 | access to parameter nonTainted |
| SSA.cs:49:13:49:20 | access to local variable nonSink2 | SSA.cs:49:13:49:31 | SSA def(nonSink2) |
| SSA.cs:49:13:49:31 | SSA def(nonSink2) | SSA.cs:51:21:51:28 | access to local variable nonSink2 |
| SSA.cs:49:13:49:31 | SSA def(nonSink2) | SSA.cs:53:21:53:28 | access to local variable nonSink2 |
@@ -644,19 +625,14 @@
| SSA.cs:50:17:50:26 | [post] access to parameter nonTainted | SSA.cs:53:17:53:29 | [input] SSA phi read(nonTainted) |
| SSA.cs:50:17:50:26 | access to parameter nonTainted | SSA.cs:51:17:51:29 | [input] SSA phi read(nonTainted) |
| SSA.cs:50:17:50:26 | access to parameter nonTainted | SSA.cs:53:17:53:29 | [input] SSA phi read(nonTainted) |
-| SSA.cs:51:17:51:29 | [input] SSA phi read(nonSink0) | SSA.cs:55:9:55:24 | SSA phi read(nonSink0) |
-| SSA.cs:51:17:51:29 | [input] SSA phi read(nonTainted) | SSA.cs:55:9:55:24 | SSA phi read(nonTainted) |
-| SSA.cs:51:17:51:29 | [input] SSA phi(nonSink2) | SSA.cs:55:9:55:24 | SSA phi(nonSink2) |
-| SSA.cs:51:21:51:28 | [post] access to local variable nonSink2 | SSA.cs:51:17:51:29 | [input] SSA phi(nonSink2) |
-| SSA.cs:51:21:51:28 | access to local variable nonSink2 | SSA.cs:51:17:51:29 | [input] SSA phi(nonSink2) |
-| SSA.cs:53:17:53:29 | [input] SSA phi read(nonSink0) | SSA.cs:55:9:55:24 | SSA phi read(nonSink0) |
-| SSA.cs:53:17:53:29 | [input] SSA phi read(nonTainted) | SSA.cs:55:9:55:24 | SSA phi read(nonTainted) |
-| SSA.cs:53:17:53:29 | [input] SSA phi(nonSink2) | SSA.cs:55:9:55:24 | SSA phi(nonSink2) |
-| SSA.cs:53:21:53:28 | [post] access to local variable nonSink2 | SSA.cs:53:17:53:29 | [input] SSA phi(nonSink2) |
-| SSA.cs:53:21:53:28 | access to local variable nonSink2 | SSA.cs:53:17:53:29 | [input] SSA phi(nonSink2) |
-| SSA.cs:55:9:55:24 | SSA phi read(nonSink0) | SSA.cs:63:23:63:30 | access to local variable nonSink0 |
-| SSA.cs:55:9:55:24 | SSA phi read(nonTainted) | SSA.cs:89:13:89:22 | access to parameter nonTainted |
-| SSA.cs:55:9:55:24 | SSA phi(nonSink2) | SSA.cs:55:15:55:22 | access to local variable nonSink2 |
+| SSA.cs:51:17:51:29 | [input] SSA phi read(nonSink0) | SSA.cs:63:23:63:30 | access to local variable nonSink0 |
+| SSA.cs:51:17:51:29 | [input] SSA phi read(nonTainted) | SSA.cs:89:13:89:22 | access to parameter nonTainted |
+| SSA.cs:51:21:51:28 | [post] access to local variable nonSink2 | SSA.cs:55:15:55:22 | access to local variable nonSink2 |
+| SSA.cs:51:21:51:28 | access to local variable nonSink2 | SSA.cs:55:15:55:22 | access to local variable nonSink2 |
+| SSA.cs:53:17:53:29 | [input] SSA phi read(nonSink0) | SSA.cs:63:23:63:30 | access to local variable nonSink0 |
+| SSA.cs:53:17:53:29 | [input] SSA phi read(nonTainted) | SSA.cs:89:13:89:22 | access to parameter nonTainted |
+| SSA.cs:53:21:53:28 | [post] access to local variable nonSink2 | SSA.cs:55:15:55:22 | access to local variable nonSink2 |
+| SSA.cs:53:21:53:28 | access to local variable nonSink2 | SSA.cs:55:15:55:22 | access to local variable nonSink2 |
| SSA.cs:58:16:58:23 | access to local variable ssaSink3 | SSA.cs:58:16:58:33 | SSA def(ssaSink3) |
| SSA.cs:58:16:58:33 | SSA def(ssaSink3) | SSA.cs:59:23:59:30 | access to local variable ssaSink3 |
| SSA.cs:58:27:58:33 | access to parameter tainted | SSA.cs:58:16:58:23 | access to local variable ssaSink3 |
@@ -744,15 +720,14 @@
| SSA.cs:85:15:85:20 | [post] access to field S | SSA.cs:114:9:114:14 | access to field S |
| SSA.cs:85:15:85:20 | access to field S | SSA.cs:114:9:114:14 | access to field S |
| SSA.cs:88:16:88:23 | access to local variable ssaSink4 | SSA.cs:88:16:88:28 | SSA def(ssaSink4) |
-| SSA.cs:88:16:88:28 | SSA def(ssaSink4) | SSA.cs:89:13:89:33 | [input] SSA phi(ssaSink4) |
+| SSA.cs:88:16:88:28 | SSA def(ssaSink4) | SSA.cs:97:23:97:30 | access to local variable ssaSink4 |
| SSA.cs:88:27:88:28 | "" | SSA.cs:88:16:88:23 | access to local variable ssaSink4 |
| SSA.cs:89:13:89:22 | [post] access to parameter nonTainted | SSA.cs:89:13:89:33 | [input] SSA phi read(nonTainted) |
| SSA.cs:89:13:89:22 | [post] access to parameter nonTainted | SSA.cs:92:17:92:26 | access to parameter nonTainted |
| SSA.cs:89:13:89:22 | access to parameter nonTainted | SSA.cs:89:13:89:33 | [input] SSA phi read(nonTainted) |
| SSA.cs:89:13:89:22 | access to parameter nonTainted | SSA.cs:92:17:92:26 | access to parameter nonTainted |
-| SSA.cs:89:13:89:33 | [input] SSA phi read(nonTainted) | SSA.cs:97:9:97:32 | SSA phi read(nonTainted) |
-| SSA.cs:89:13:89:33 | [input] SSA phi read(ssaSink0) | SSA.cs:97:9:97:32 | SSA phi read(ssaSink0) |
-| SSA.cs:89:13:89:33 | [input] SSA phi(ssaSink4) | SSA.cs:97:9:97:32 | SSA phi(ssaSink4) |
+| SSA.cs:89:13:89:33 | [input] SSA phi read(nonTainted) | SSA.cs:102:13:102:22 | access to parameter nonTainted |
+| SSA.cs:89:13:89:33 | [input] SSA phi read(ssaSink0) | SSA.cs:117:36:117:43 | access to local variable ssaSink0 |
| SSA.cs:91:13:91:20 | access to local variable ssaSink4 | SSA.cs:91:13:91:31 | SSA def(ssaSink4) |
| SSA.cs:91:13:91:31 | SSA def(ssaSink4) | SSA.cs:93:21:93:28 | access to local variable ssaSink4 |
| SSA.cs:91:13:91:31 | SSA def(ssaSink4) | SSA.cs:95:21:95:28 | access to local variable ssaSink4 |
@@ -763,33 +738,27 @@
| SSA.cs:92:17:92:26 | [post] access to parameter nonTainted | SSA.cs:95:17:95:29 | [input] SSA phi read(nonTainted) |
| SSA.cs:92:17:92:26 | access to parameter nonTainted | SSA.cs:93:17:93:29 | [input] SSA phi read(nonTainted) |
| SSA.cs:92:17:92:26 | access to parameter nonTainted | SSA.cs:95:17:95:29 | [input] SSA phi read(nonTainted) |
-| SSA.cs:93:17:93:29 | [input] SSA phi read(nonTainted) | SSA.cs:97:9:97:32 | SSA phi read(nonTainted) |
-| SSA.cs:93:17:93:29 | [input] SSA phi read(ssaSink0) | SSA.cs:97:9:97:32 | SSA phi read(ssaSink0) |
-| SSA.cs:93:17:93:29 | [input] SSA phi(ssaSink4) | SSA.cs:97:9:97:32 | SSA phi(ssaSink4) |
-| SSA.cs:93:21:93:28 | [post] access to local variable ssaSink4 | SSA.cs:93:17:93:29 | [input] SSA phi(ssaSink4) |
-| SSA.cs:93:21:93:28 | access to local variable ssaSink4 | SSA.cs:93:17:93:29 | [input] SSA phi(ssaSink4) |
-| SSA.cs:95:17:95:29 | [input] SSA phi read(nonTainted) | SSA.cs:97:9:97:32 | SSA phi read(nonTainted) |
-| SSA.cs:95:17:95:29 | [input] SSA phi read(ssaSink0) | SSA.cs:97:9:97:32 | SSA phi read(ssaSink0) |
-| SSA.cs:95:17:95:29 | [input] SSA phi(ssaSink4) | SSA.cs:97:9:97:32 | SSA phi(ssaSink4) |
-| SSA.cs:95:21:95:28 | [post] access to local variable ssaSink4 | SSA.cs:95:17:95:29 | [input] SSA phi(ssaSink4) |
-| SSA.cs:95:21:95:28 | access to local variable ssaSink4 | SSA.cs:95:17:95:29 | [input] SSA phi(ssaSink4) |
-| SSA.cs:97:9:97:32 | SSA phi read(nonTainted) | SSA.cs:102:13:102:22 | access to parameter nonTainted |
-| SSA.cs:97:9:97:32 | SSA phi read(ssaSink0) | SSA.cs:117:36:117:43 | access to local variable ssaSink0 |
-| SSA.cs:97:9:97:32 | SSA phi(ssaSink4) | SSA.cs:97:23:97:30 | access to local variable ssaSink4 |
+| SSA.cs:93:17:93:29 | [input] SSA phi read(nonTainted) | SSA.cs:102:13:102:22 | access to parameter nonTainted |
+| SSA.cs:93:17:93:29 | [input] SSA phi read(ssaSink0) | SSA.cs:117:36:117:43 | access to local variable ssaSink0 |
+| SSA.cs:93:21:93:28 | [post] access to local variable ssaSink4 | SSA.cs:97:23:97:30 | access to local variable ssaSink4 |
+| SSA.cs:93:21:93:28 | access to local variable ssaSink4 | SSA.cs:97:23:97:30 | access to local variable ssaSink4 |
+| SSA.cs:95:17:95:29 | [input] SSA phi read(nonTainted) | SSA.cs:102:13:102:22 | access to parameter nonTainted |
+| SSA.cs:95:17:95:29 | [input] SSA phi read(ssaSink0) | SSA.cs:117:36:117:43 | access to local variable ssaSink0 |
+| SSA.cs:95:21:95:28 | [post] access to local variable ssaSink4 | SSA.cs:97:23:97:30 | access to local variable ssaSink4 |
+| SSA.cs:95:21:95:28 | access to local variable ssaSink4 | SSA.cs:97:23:97:30 | access to local variable ssaSink4 |
| SSA.cs:97:23:97:30 | SSA def(ssaSink4) | SSA.cs:98:15:98:22 | access to local variable ssaSink4 |
| SSA.cs:97:23:97:30 | [post] access to local variable ssaSink4 | SSA.cs:97:23:97:30 | SSA def(ssaSink4) |
| SSA.cs:97:23:97:30 | access to local variable ssaSink4 | SSA.cs:97:23:97:30 | SSA def(ssaSink4) |
| SSA.cs:97:23:97:30 | access to local variable ssaSink4 | SSA.cs:97:23:97:30 | SSA def(ssaSink4) |
| SSA.cs:101:16:101:23 | access to local variable nonSink3 | SSA.cs:101:16:101:28 | SSA def(nonSink3) |
-| SSA.cs:101:16:101:28 | SSA def(nonSink3) | SSA.cs:102:13:102:33 | [input] SSA phi(nonSink3) |
+| SSA.cs:101:16:101:28 | SSA def(nonSink3) | SSA.cs:110:23:110:30 | access to local variable nonSink3 |
| SSA.cs:101:27:101:28 | "" | SSA.cs:101:16:101:23 | access to local variable nonSink3 |
| SSA.cs:102:13:102:22 | [post] access to parameter nonTainted | SSA.cs:102:13:102:33 | [input] SSA phi read(nonTainted) |
| SSA.cs:102:13:102:22 | [post] access to parameter nonTainted | SSA.cs:105:17:105:26 | access to parameter nonTainted |
| SSA.cs:102:13:102:22 | access to parameter nonTainted | SSA.cs:102:13:102:33 | [input] SSA phi read(nonTainted) |
| SSA.cs:102:13:102:22 | access to parameter nonTainted | SSA.cs:105:17:105:26 | access to parameter nonTainted |
-| SSA.cs:102:13:102:33 | [input] SSA phi read(nonSink0) | SSA.cs:110:9:110:32 | SSA phi read(nonSink0) |
-| SSA.cs:102:13:102:33 | [input] SSA phi read(nonTainted) | SSA.cs:110:9:110:32 | SSA phi read(nonTainted) |
-| SSA.cs:102:13:102:33 | [input] SSA phi(nonSink3) | SSA.cs:110:9:110:32 | SSA phi(nonSink3) |
+| SSA.cs:102:13:102:33 | [input] SSA phi read(nonSink0) | SSA.cs:130:39:130:46 | access to local variable nonSink0 |
+| SSA.cs:102:13:102:33 | [input] SSA phi read(nonTainted) | SSA.cs:115:13:115:22 | access to parameter nonTainted |
| SSA.cs:104:13:104:20 | access to local variable nonSink3 | SSA.cs:104:13:104:31 | SSA def(nonSink3) |
| SSA.cs:104:13:104:31 | SSA def(nonSink3) | SSA.cs:106:21:106:28 | access to local variable nonSink3 |
| SSA.cs:104:13:104:31 | SSA def(nonSink3) | SSA.cs:108:21:108:28 | access to local variable nonSink3 |
@@ -800,19 +769,14 @@
| SSA.cs:105:17:105:26 | [post] access to parameter nonTainted | SSA.cs:108:17:108:29 | [input] SSA phi read(nonTainted) |
| SSA.cs:105:17:105:26 | access to parameter nonTainted | SSA.cs:106:17:106:29 | [input] SSA phi read(nonTainted) |
| SSA.cs:105:17:105:26 | access to parameter nonTainted | SSA.cs:108:17:108:29 | [input] SSA phi read(nonTainted) |
-| SSA.cs:106:17:106:29 | [input] SSA phi read(nonSink0) | SSA.cs:110:9:110:32 | SSA phi read(nonSink0) |
-| SSA.cs:106:17:106:29 | [input] SSA phi read(nonTainted) | SSA.cs:110:9:110:32 | SSA phi read(nonTainted) |
-| SSA.cs:106:17:106:29 | [input] SSA phi(nonSink3) | SSA.cs:110:9:110:32 | SSA phi(nonSink3) |
-| SSA.cs:106:21:106:28 | [post] access to local variable nonSink3 | SSA.cs:106:17:106:29 | [input] SSA phi(nonSink3) |
-| SSA.cs:106:21:106:28 | access to local variable nonSink3 | SSA.cs:106:17:106:29 | [input] SSA phi(nonSink3) |
-| SSA.cs:108:17:108:29 | [input] SSA phi read(nonSink0) | SSA.cs:110:9:110:32 | SSA phi read(nonSink0) |
-| SSA.cs:108:17:108:29 | [input] SSA phi read(nonTainted) | SSA.cs:110:9:110:32 | SSA phi read(nonTainted) |
-| SSA.cs:108:17:108:29 | [input] SSA phi(nonSink3) | SSA.cs:110:9:110:32 | SSA phi(nonSink3) |
-| SSA.cs:108:21:108:28 | [post] access to local variable nonSink3 | SSA.cs:108:17:108:29 | [input] SSA phi(nonSink3) |
-| SSA.cs:108:21:108:28 | access to local variable nonSink3 | SSA.cs:108:17:108:29 | [input] SSA phi(nonSink3) |
-| SSA.cs:110:9:110:32 | SSA phi read(nonSink0) | SSA.cs:130:39:130:46 | access to local variable nonSink0 |
-| SSA.cs:110:9:110:32 | SSA phi read(nonTainted) | SSA.cs:115:13:115:22 | access to parameter nonTainted |
-| SSA.cs:110:9:110:32 | SSA phi(nonSink3) | SSA.cs:110:23:110:30 | access to local variable nonSink3 |
+| SSA.cs:106:17:106:29 | [input] SSA phi read(nonSink0) | SSA.cs:130:39:130:46 | access to local variable nonSink0 |
+| SSA.cs:106:17:106:29 | [input] SSA phi read(nonTainted) | SSA.cs:115:13:115:22 | access to parameter nonTainted |
+| SSA.cs:106:21:106:28 | [post] access to local variable nonSink3 | SSA.cs:110:23:110:30 | access to local variable nonSink3 |
+| SSA.cs:106:21:106:28 | access to local variable nonSink3 | SSA.cs:110:23:110:30 | access to local variable nonSink3 |
+| SSA.cs:108:17:108:29 | [input] SSA phi read(nonSink0) | SSA.cs:130:39:130:46 | access to local variable nonSink0 |
+| SSA.cs:108:17:108:29 | [input] SSA phi read(nonTainted) | SSA.cs:115:13:115:22 | access to parameter nonTainted |
+| SSA.cs:108:21:108:28 | [post] access to local variable nonSink3 | SSA.cs:110:23:110:30 | access to local variable nonSink3 |
+| SSA.cs:108:21:108:28 | access to local variable nonSink3 | SSA.cs:110:23:110:30 | access to local variable nonSink3 |
| SSA.cs:110:23:110:30 | SSA def(nonSink3) | SSA.cs:111:15:111:22 | access to local variable nonSink3 |
| SSA.cs:110:23:110:30 | [post] access to local variable nonSink3 | SSA.cs:110:23:110:30 | SSA def(nonSink3) |
| SSA.cs:110:23:110:30 | access to local variable nonSink3 | SSA.cs:110:23:110:30 | SSA def(nonSink3) |
@@ -826,15 +790,14 @@
| SSA.cs:114:9:114:14 | access to field S | SSA.cs:115:13:115:33 | [input] SSA phi read(this.S) |
| SSA.cs:114:9:114:14 | access to field S | SSA.cs:117:13:117:18 | access to field S |
| SSA.cs:114:9:114:28 | access to field SsaFieldSink1 | SSA.cs:114:9:114:33 | SSA def(this.S.SsaFieldSink1) |
-| SSA.cs:114:9:114:33 | SSA def(this.S.SsaFieldSink1) | SSA.cs:115:13:115:33 | [input] SSA phi(this.S.SsaFieldSink1) |
+| SSA.cs:114:9:114:33 | SSA def(this.S.SsaFieldSink1) | SSA.cs:123:23:123:28 | SSA qualifier def(this.S.SsaFieldSink1) |
| SSA.cs:114:32:114:33 | "" | SSA.cs:114:9:114:28 | access to field SsaFieldSink1 |
| SSA.cs:115:13:115:22 | [post] access to parameter nonTainted | SSA.cs:115:13:115:33 | [input] SSA phi read(nonTainted) |
| SSA.cs:115:13:115:22 | [post] access to parameter nonTainted | SSA.cs:118:17:118:26 | access to parameter nonTainted |
| SSA.cs:115:13:115:22 | access to parameter nonTainted | SSA.cs:115:13:115:33 | [input] SSA phi read(nonTainted) |
| SSA.cs:115:13:115:22 | access to parameter nonTainted | SSA.cs:118:17:118:26 | access to parameter nonTainted |
-| SSA.cs:115:13:115:33 | [input] SSA phi read(nonTainted) | SSA.cs:123:9:123:30 | SSA phi read(nonTainted) |
-| SSA.cs:115:13:115:33 | [input] SSA phi read(this.S) | SSA.cs:123:9:123:30 | SSA phi read(this.S) |
-| SSA.cs:115:13:115:33 | [input] SSA phi(this.S.SsaFieldSink1) | SSA.cs:123:9:123:30 | SSA phi(this.S.SsaFieldSink1) |
+| SSA.cs:115:13:115:33 | [input] SSA phi read(nonTainted) | SSA.cs:128:13:128:22 | access to parameter nonTainted |
+| SSA.cs:115:13:115:33 | [input] SSA phi read(this.S) | SSA.cs:123:23:123:28 | access to field S |
| SSA.cs:117:13:117:16 | [post] this access | SSA.cs:119:21:119:24 | this access |
| SSA.cs:117:13:117:16 | [post] this access | SSA.cs:121:21:121:24 | this access |
| SSA.cs:117:13:117:16 | this access | SSA.cs:119:21:119:24 | this access |
@@ -851,27 +814,20 @@
| SSA.cs:118:17:118:26 | [post] access to parameter nonTainted | SSA.cs:121:17:121:41 | [input] SSA phi read(nonTainted) |
| SSA.cs:118:17:118:26 | access to parameter nonTainted | SSA.cs:119:17:119:41 | [input] SSA phi read(nonTainted) |
| SSA.cs:118:17:118:26 | access to parameter nonTainted | SSA.cs:121:17:121:41 | [input] SSA phi read(nonTainted) |
-| SSA.cs:119:17:119:41 | [input] SSA phi read(nonTainted) | SSA.cs:123:9:123:30 | SSA phi read(nonTainted) |
-| SSA.cs:119:17:119:41 | [input] SSA phi read(this.S) | SSA.cs:123:9:123:30 | SSA phi read(this.S) |
-| SSA.cs:119:17:119:41 | [input] SSA phi(this.S.SsaFieldSink1) | SSA.cs:123:9:123:30 | SSA phi(this.S.SsaFieldSink1) |
+| SSA.cs:119:17:119:41 | [input] SSA phi read(nonTainted) | SSA.cs:128:13:128:22 | access to parameter nonTainted |
| SSA.cs:119:21:119:24 | [post] this access | SSA.cs:123:23:123:26 | this access |
| SSA.cs:119:21:119:24 | this access | SSA.cs:123:23:123:26 | this access |
-| SSA.cs:119:21:119:26 | [post] access to field S | SSA.cs:119:17:119:41 | [input] SSA phi read(this.S) |
-| SSA.cs:119:21:119:26 | access to field S | SSA.cs:119:17:119:41 | [input] SSA phi read(this.S) |
-| SSA.cs:119:21:119:40 | [post] access to field SsaFieldSink1 | SSA.cs:119:17:119:41 | [input] SSA phi(this.S.SsaFieldSink1) |
-| SSA.cs:119:21:119:40 | access to field SsaFieldSink1 | SSA.cs:119:17:119:41 | [input] SSA phi(this.S.SsaFieldSink1) |
-| SSA.cs:121:17:121:41 | [input] SSA phi read(nonTainted) | SSA.cs:123:9:123:30 | SSA phi read(nonTainted) |
-| SSA.cs:121:17:121:41 | [input] SSA phi read(this.S) | SSA.cs:123:9:123:30 | SSA phi read(this.S) |
-| SSA.cs:121:17:121:41 | [input] SSA phi(this.S.SsaFieldSink1) | SSA.cs:123:9:123:30 | SSA phi(this.S.SsaFieldSink1) |
+| SSA.cs:119:21:119:26 | [post] access to field S | SSA.cs:123:23:123:28 | access to field S |
+| SSA.cs:119:21:119:26 | access to field S | SSA.cs:123:23:123:28 | access to field S |
+| SSA.cs:119:21:119:40 | [post] access to field SsaFieldSink1 | SSA.cs:123:23:123:28 | SSA qualifier def(this.S.SsaFieldSink1) |
+| SSA.cs:119:21:119:40 | access to field SsaFieldSink1 | SSA.cs:123:23:123:28 | SSA qualifier def(this.S.SsaFieldSink1) |
+| SSA.cs:121:17:121:41 | [input] SSA phi read(nonTainted) | SSA.cs:128:13:128:22 | access to parameter nonTainted |
| SSA.cs:121:21:121:24 | [post] this access | SSA.cs:123:23:123:26 | this access |
| SSA.cs:121:21:121:24 | this access | SSA.cs:123:23:123:26 | this access |
-| SSA.cs:121:21:121:26 | [post] access to field S | SSA.cs:121:17:121:41 | [input] SSA phi read(this.S) |
-| SSA.cs:121:21:121:26 | access to field S | SSA.cs:121:17:121:41 | [input] SSA phi read(this.S) |
-| SSA.cs:121:21:121:40 | [post] access to field SsaFieldSink1 | SSA.cs:121:17:121:41 | [input] SSA phi(this.S.SsaFieldSink1) |
-| SSA.cs:121:21:121:40 | access to field SsaFieldSink1 | SSA.cs:121:17:121:41 | [input] SSA phi(this.S.SsaFieldSink1) |
-| SSA.cs:123:9:123:30 | SSA phi read(nonTainted) | SSA.cs:128:13:128:22 | access to parameter nonTainted |
-| SSA.cs:123:9:123:30 | SSA phi read(this.S) | SSA.cs:123:23:123:28 | access to field S |
-| SSA.cs:123:9:123:30 | SSA phi(this.S.SsaFieldSink1) | SSA.cs:123:23:123:28 | SSA qualifier def(this.S.SsaFieldSink1) |
+| SSA.cs:121:21:121:26 | [post] access to field S | SSA.cs:123:23:123:28 | access to field S |
+| SSA.cs:121:21:121:26 | access to field S | SSA.cs:123:23:123:28 | access to field S |
+| SSA.cs:121:21:121:40 | [post] access to field SsaFieldSink1 | SSA.cs:123:23:123:28 | SSA qualifier def(this.S.SsaFieldSink1) |
+| SSA.cs:121:21:121:40 | access to field SsaFieldSink1 | SSA.cs:123:23:123:28 | SSA qualifier def(this.S.SsaFieldSink1) |
| SSA.cs:123:23:123:26 | [post] this access | SSA.cs:124:15:124:18 | this access |
| SSA.cs:123:23:123:26 | this access | SSA.cs:124:15:124:18 | this access |
| SSA.cs:123:23:123:28 | SSA def(this.S) | SSA.cs:124:15:124:20 | access to field S |
@@ -892,12 +848,11 @@
| SSA.cs:127:9:127:14 | access to field S | SSA.cs:128:13:128:33 | [input] SSA phi read(this.S) |
| SSA.cs:127:9:127:14 | access to field S | SSA.cs:130:13:130:18 | access to field S |
| SSA.cs:127:9:127:31 | access to field SsaFieldNonSink0 | SSA.cs:127:9:127:36 | SSA def(this.S.SsaFieldNonSink0) |
-| SSA.cs:127:9:127:36 | SSA def(this.S.SsaFieldNonSink0) | SSA.cs:128:13:128:33 | [input] SSA phi(this.S.SsaFieldNonSink0) |
+| SSA.cs:127:9:127:36 | SSA def(this.S.SsaFieldNonSink0) | SSA.cs:136:23:136:28 | SSA qualifier def(this.S.SsaFieldNonSink0) |
| SSA.cs:127:35:127:36 | "" | SSA.cs:127:9:127:31 | access to field SsaFieldNonSink0 |
| SSA.cs:128:13:128:22 | [post] access to parameter nonTainted | SSA.cs:131:17:131:26 | access to parameter nonTainted |
| SSA.cs:128:13:128:22 | access to parameter nonTainted | SSA.cs:131:17:131:26 | access to parameter nonTainted |
-| SSA.cs:128:13:128:33 | [input] SSA phi read(this.S) | SSA.cs:136:9:136:30 | SSA phi read(this.S) |
-| SSA.cs:128:13:128:33 | [input] SSA phi(this.S.SsaFieldNonSink0) | SSA.cs:136:9:136:30 | SSA phi(this.S.SsaFieldNonSink0) |
+| SSA.cs:128:13:128:33 | [input] SSA phi read(this.S) | SSA.cs:136:23:136:28 | access to field S |
| SSA.cs:130:13:130:16 | [post] this access | SSA.cs:132:21:132:24 | this access |
| SSA.cs:130:13:130:16 | [post] this access | SSA.cs:134:21:134:24 | this access |
| SSA.cs:130:13:130:16 | this access | SSA.cs:132:21:132:24 | this access |
@@ -910,24 +865,18 @@
| SSA.cs:130:13:130:46 | SSA def(this.S.SsaFieldNonSink0) | SSA.cs:132:21:132:43 | access to field SsaFieldNonSink0 |
| SSA.cs:130:13:130:46 | SSA def(this.S.SsaFieldNonSink0) | SSA.cs:134:21:134:43 | access to field SsaFieldNonSink0 |
| SSA.cs:130:39:130:46 | access to local variable nonSink0 | SSA.cs:130:13:130:35 | access to field SsaFieldNonSink0 |
-| SSA.cs:132:17:132:44 | [input] SSA phi read(this.S) | SSA.cs:136:9:136:30 | SSA phi read(this.S) |
-| SSA.cs:132:17:132:44 | [input] SSA phi(this.S.SsaFieldNonSink0) | SSA.cs:136:9:136:30 | SSA phi(this.S.SsaFieldNonSink0) |
| SSA.cs:132:21:132:24 | [post] this access | SSA.cs:136:23:136:26 | this access |
| SSA.cs:132:21:132:24 | this access | SSA.cs:136:23:136:26 | this access |
-| SSA.cs:132:21:132:26 | [post] access to field S | SSA.cs:132:17:132:44 | [input] SSA phi read(this.S) |
-| SSA.cs:132:21:132:26 | access to field S | SSA.cs:132:17:132:44 | [input] SSA phi read(this.S) |
-| SSA.cs:132:21:132:43 | [post] access to field SsaFieldNonSink0 | SSA.cs:132:17:132:44 | [input] SSA phi(this.S.SsaFieldNonSink0) |
-| SSA.cs:132:21:132:43 | access to field SsaFieldNonSink0 | SSA.cs:132:17:132:44 | [input] SSA phi(this.S.SsaFieldNonSink0) |
-| SSA.cs:134:17:134:44 | [input] SSA phi read(this.S) | SSA.cs:136:9:136:30 | SSA phi read(this.S) |
-| SSA.cs:134:17:134:44 | [input] SSA phi(this.S.SsaFieldNonSink0) | SSA.cs:136:9:136:30 | SSA phi(this.S.SsaFieldNonSink0) |
+| SSA.cs:132:21:132:26 | [post] access to field S | SSA.cs:136:23:136:28 | access to field S |
+| SSA.cs:132:21:132:26 | access to field S | SSA.cs:136:23:136:28 | access to field S |
+| SSA.cs:132:21:132:43 | [post] access to field SsaFieldNonSink0 | SSA.cs:136:23:136:28 | SSA qualifier def(this.S.SsaFieldNonSink0) |
+| SSA.cs:132:21:132:43 | access to field SsaFieldNonSink0 | SSA.cs:136:23:136:28 | SSA qualifier def(this.S.SsaFieldNonSink0) |
| SSA.cs:134:21:134:24 | [post] this access | SSA.cs:136:23:136:26 | this access |
| SSA.cs:134:21:134:24 | this access | SSA.cs:136:23:136:26 | this access |
-| SSA.cs:134:21:134:26 | [post] access to field S | SSA.cs:134:17:134:44 | [input] SSA phi read(this.S) |
-| SSA.cs:134:21:134:26 | access to field S | SSA.cs:134:17:134:44 | [input] SSA phi read(this.S) |
-| SSA.cs:134:21:134:43 | [post] access to field SsaFieldNonSink0 | SSA.cs:134:17:134:44 | [input] SSA phi(this.S.SsaFieldNonSink0) |
-| SSA.cs:134:21:134:43 | access to field SsaFieldNonSink0 | SSA.cs:134:17:134:44 | [input] SSA phi(this.S.SsaFieldNonSink0) |
-| SSA.cs:136:9:136:30 | SSA phi read(this.S) | SSA.cs:136:23:136:28 | access to field S |
-| SSA.cs:136:9:136:30 | SSA phi(this.S.SsaFieldNonSink0) | SSA.cs:136:23:136:28 | SSA qualifier def(this.S.SsaFieldNonSink0) |
+| SSA.cs:134:21:134:26 | [post] access to field S | SSA.cs:136:23:136:28 | access to field S |
+| SSA.cs:134:21:134:26 | access to field S | SSA.cs:136:23:136:28 | access to field S |
+| SSA.cs:134:21:134:43 | [post] access to field SsaFieldNonSink0 | SSA.cs:136:23:136:28 | SSA qualifier def(this.S.SsaFieldNonSink0) |
+| SSA.cs:134:21:134:43 | access to field SsaFieldNonSink0 | SSA.cs:136:23:136:28 | SSA qualifier def(this.S.SsaFieldNonSink0) |
| SSA.cs:136:23:136:26 | [post] this access | SSA.cs:137:15:137:18 | this access |
| SSA.cs:136:23:136:26 | this access | SSA.cs:137:15:137:18 | this access |
| SSA.cs:136:23:136:28 | SSA def(this.S) | SSA.cs:137:15:137:20 | access to field S |
@@ -940,12 +889,10 @@
| SSA.cs:146:13:146:13 | access to parameter t | SSA.cs:146:13:146:13 | (...) ... |
| SSA.cs:146:13:146:13 | access to parameter t | SSA.cs:149:17:149:17 | access to parameter t |
| SSA.cs:147:13:147:13 | access to parameter t | SSA.cs:147:13:147:26 | SSA def(t) |
-| SSA.cs:147:13:147:26 | SSA def(t) | SSA.cs:147:13:147:26 | [input] SSA phi(t) |
-| SSA.cs:147:13:147:26 | [input] SSA phi(t) | SSA.cs:144:17:144:26 | SSA phi(t) |
+| SSA.cs:147:13:147:26 | SSA def(t) | SSA.cs:144:17:144:26 | SSA phi(t) |
| SSA.cs:147:17:147:26 | default(...) | SSA.cs:147:13:147:13 | access to parameter t |
| SSA.cs:149:13:149:13 | access to parameter t | SSA.cs:149:13:149:17 | SSA def(t) |
-| SSA.cs:149:13:149:17 | SSA def(t) | SSA.cs:149:13:149:17 | [input] SSA phi(t) |
-| SSA.cs:149:13:149:17 | [input] SSA phi(t) | SSA.cs:144:17:144:26 | SSA phi(t) |
+| SSA.cs:149:13:149:17 | SSA def(t) | SSA.cs:144:17:144:26 | SSA phi(t) |
| SSA.cs:149:17:149:17 | access to parameter t | SSA.cs:149:13:149:13 | access to parameter t |
| SSA.cs:152:36:152:36 | SSA param(t) | SSA.cs:154:13:154:13 | access to parameter t |
| SSA.cs:152:36:152:36 | t | SSA.cs:152:36:152:36 | SSA param(t) |
@@ -953,8 +900,7 @@
| SSA.cs:154:13:154:13 | access to parameter t | SSA.cs:154:13:154:21 | [input] SSA phi(t) |
| SSA.cs:154:13:154:13 | access to parameter t | SSA.cs:155:25:155:25 | access to parameter t |
| SSA.cs:154:13:154:21 | [input] SSA phi(t) | SSA.cs:152:17:152:28 | SSA phi(t) |
-| SSA.cs:155:13:155:26 | [input] SSA phi(t) | SSA.cs:152:17:152:28 | SSA phi(t) |
-| SSA.cs:155:25:155:25 | SSA def(t) | SSA.cs:155:13:155:26 | [input] SSA phi(t) |
+| SSA.cs:155:25:155:25 | SSA def(t) | SSA.cs:152:17:152:28 | SSA phi(t) |
| SSA.cs:155:25:155:25 | access to parameter t | SSA.cs:155:25:155:25 | SSA def(t) |
| SSA.cs:166:10:166:13 | this | SSA.cs:166:19:166:22 | this access |
| SSA.cs:166:28:166:31 | null | SSA.cs:166:19:166:24 | access to field S |
@@ -963,29 +909,22 @@
| SSA.cs:168:35:168:35 | SSA param(i) | SSA.cs:171:13:171:13 | access to parameter i |
| SSA.cs:168:35:168:35 | i | SSA.cs:168:35:168:35 | SSA param(i) |
| SSA.cs:170:16:170:23 | access to local variable ssaSink5 | SSA.cs:170:16:170:28 | SSA def(ssaSink5) |
-| SSA.cs:170:16:170:28 | SSA def(ssaSink5) | SSA.cs:171:13:171:19 | [input] SSA phi(ssaSink5) |
+| SSA.cs:170:16:170:28 | SSA def(ssaSink5) | SSA.cs:180:15:180:22 | access to local variable ssaSink5 |
| SSA.cs:170:27:170:28 | "" | SSA.cs:170:16:170:23 | access to local variable ssaSink5 |
| SSA.cs:171:13:171:13 | access to parameter i | SSA.cs:171:13:171:15 | SSA def(i) |
-| SSA.cs:171:13:171:15 | SSA def(i) | SSA.cs:174:13:178:13 | [input] SSA phi(i) |
-| SSA.cs:171:13:171:19 | [input] SSA phi(ssaSink5) | SSA.cs:180:9:180:24 | SSA phi(ssaSink5) |
+| SSA.cs:171:13:171:15 | SSA def(i) | SSA.cs:174:20:174:20 | access to parameter i |
| SSA.cs:173:13:173:20 | access to local variable ssaSink5 | SSA.cs:173:13:173:30 | SSA def(ssaSink5) |
-| SSA.cs:173:13:173:30 | SSA def(ssaSink5) | SSA.cs:174:13:178:13 | [input] SSA phi read(ssaSink5) |
+| SSA.cs:173:13:173:30 | SSA def(ssaSink5) | SSA.cs:174:20:174:20 | SSA phi read(ssaSink5) |
| SSA.cs:173:24:173:30 | access to parameter tainted | SSA.cs:173:13:173:20 | access to local variable ssaSink5 |
-| SSA.cs:174:13:178:13 | [input] SSA phi read(ssaSink5) | SSA.cs:174:20:174:20 | SSA phi read(ssaSink5) |
-| SSA.cs:174:13:178:13 | [input] SSA phi(i) | SSA.cs:174:20:174:20 | SSA phi(i) |
| SSA.cs:174:20:174:20 | SSA phi read(ssaSink5) | SSA.cs:174:20:174:26 | [input] SSA phi(ssaSink5) |
| SSA.cs:174:20:174:20 | SSA phi read(ssaSink5) | SSA.cs:176:21:176:28 | access to local variable ssaSink5 |
-| SSA.cs:174:20:174:20 | SSA phi(i) | SSA.cs:174:20:174:20 | access to parameter i |
| SSA.cs:174:20:174:20 | access to parameter i | SSA.cs:174:20:174:22 | SSA def(i) |
-| SSA.cs:174:20:174:22 | SSA def(i) | SSA.cs:177:17:177:29 | [input] SSA phi(i) |
-| SSA.cs:174:20:174:26 | [input] SSA phi(ssaSink5) | SSA.cs:180:9:180:24 | SSA phi(ssaSink5) |
+| SSA.cs:174:20:174:22 | SSA def(i) | SSA.cs:174:20:174:20 | access to parameter i |
+| SSA.cs:174:20:174:26 | [input] SSA phi(ssaSink5) | SSA.cs:180:15:180:22 | access to local variable ssaSink5 |
| SSA.cs:176:21:176:28 | [post] access to local variable ssaSink5 | SSA.cs:177:21:177:28 | access to local variable ssaSink5 |
| SSA.cs:176:21:176:28 | access to local variable ssaSink5 | SSA.cs:177:21:177:28 | access to local variable ssaSink5 |
-| SSA.cs:177:17:177:29 | [input] SSA phi read(ssaSink5) | SSA.cs:174:20:174:20 | SSA phi read(ssaSink5) |
-| SSA.cs:177:17:177:29 | [input] SSA phi(i) | SSA.cs:174:20:174:20 | SSA phi(i) |
-| SSA.cs:177:21:177:28 | [post] access to local variable ssaSink5 | SSA.cs:177:17:177:29 | [input] SSA phi read(ssaSink5) |
-| SSA.cs:177:21:177:28 | access to local variable ssaSink5 | SSA.cs:177:17:177:29 | [input] SSA phi read(ssaSink5) |
-| SSA.cs:180:9:180:24 | SSA phi(ssaSink5) | SSA.cs:180:15:180:22 | access to local variable ssaSink5 |
+| SSA.cs:177:21:177:28 | [post] access to local variable ssaSink5 | SSA.cs:174:20:174:20 | SSA phi read(ssaSink5) |
+| SSA.cs:177:21:177:28 | access to local variable ssaSink5 | SSA.cs:174:20:174:20 | SSA phi read(ssaSink5) |
| Splitting.cs:3:18:3:18 | SSA param(b) | Splitting.cs:6:13:6:13 | access to parameter b |
| Splitting.cs:3:18:3:18 | b | Splitting.cs:3:18:3:18 | SSA param(b) |
| Splitting.cs:3:28:3:34 | SSA param(tainted) | Splitting.cs:5:17:5:23 | access to parameter tainted |
@@ -1805,509 +1744,408 @@
| UseUseExplosion.cs:24:1689:24:1692 | access to property Prop | UseUseExplosion.cs:24:1708:24:1713 | [input] SSA phi read(this.Prop) |
| UseUseExplosion.cs:24:1689:24:1692 | this access | UseUseExplosion.cs:24:1708:24:1713 | this access |
| UseUseExplosion.cs:24:1689:24:1692 | this access | UseUseExplosion.cs:25:13:25:16 | this access |
-| UseUseExplosion.cs:24:1699:24:1701 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(this.Prop) |
+| UseUseExplosion.cs:24:1699:24:1701 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:13:25:16 | access to property Prop |
| UseUseExplosion.cs:24:1699:24:1701 | [input] SSA phi read(x) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
-| UseUseExplosion.cs:24:1708:24:1713 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(this.Prop) |
-| UseUseExplosion.cs:24:1708:24:1713 | [input] SSA phi read(x) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:1708:24:1713 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:13:25:16 | access to property Prop |
| UseUseExplosion.cs:24:1708:24:1713 | [post] this access | UseUseExplosion.cs:25:13:25:16 | this access |
| UseUseExplosion.cs:24:1708:24:1713 | this access | UseUseExplosion.cs:25:13:25:16 | this access |
-| UseUseExplosion.cs:24:1712:24:1712 | access to local variable x | UseUseExplosion.cs:24:1708:24:1713 | [input] SSA phi read(x) |
-| UseUseExplosion.cs:24:1723:24:1728 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(this.Prop) |
-| UseUseExplosion.cs:24:1723:24:1728 | [input] SSA phi read(x) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:1712:24:1712 | access to local variable x | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:1723:24:1728 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:13:25:16 | access to property Prop |
| UseUseExplosion.cs:24:1723:24:1728 | [post] this access | UseUseExplosion.cs:25:13:25:16 | this access |
| UseUseExplosion.cs:24:1723:24:1728 | this access | UseUseExplosion.cs:25:13:25:16 | this access |
-| UseUseExplosion.cs:24:1727:24:1727 | access to local variable x | UseUseExplosion.cs:24:1723:24:1728 | [input] SSA phi read(x) |
-| UseUseExplosion.cs:24:1738:24:1743 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(this.Prop) |
-| UseUseExplosion.cs:24:1738:24:1743 | [input] SSA phi read(x) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:1727:24:1727 | access to local variable x | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:1738:24:1743 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:13:25:16 | access to property Prop |
| UseUseExplosion.cs:24:1738:24:1743 | [post] this access | UseUseExplosion.cs:25:13:25:16 | this access |
| UseUseExplosion.cs:24:1738:24:1743 | this access | UseUseExplosion.cs:25:13:25:16 | this access |
-| UseUseExplosion.cs:24:1742:24:1742 | access to local variable x | UseUseExplosion.cs:24:1738:24:1743 | [input] SSA phi read(x) |
-| UseUseExplosion.cs:24:1753:24:1758 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(this.Prop) |
-| UseUseExplosion.cs:24:1753:24:1758 | [input] SSA phi read(x) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:1742:24:1742 | access to local variable x | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:1753:24:1758 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:13:25:16 | access to property Prop |
| UseUseExplosion.cs:24:1753:24:1758 | [post] this access | UseUseExplosion.cs:25:13:25:16 | this access |
| UseUseExplosion.cs:24:1753:24:1758 | this access | UseUseExplosion.cs:25:13:25:16 | this access |
-| UseUseExplosion.cs:24:1757:24:1757 | access to local variable x | UseUseExplosion.cs:24:1753:24:1758 | [input] SSA phi read(x) |
-| UseUseExplosion.cs:24:1768:24:1773 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(this.Prop) |
-| UseUseExplosion.cs:24:1768:24:1773 | [input] SSA phi read(x) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:1757:24:1757 | access to local variable x | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:1768:24:1773 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:13:25:16 | access to property Prop |
| UseUseExplosion.cs:24:1768:24:1773 | [post] this access | UseUseExplosion.cs:25:13:25:16 | this access |
| UseUseExplosion.cs:24:1768:24:1773 | this access | UseUseExplosion.cs:25:13:25:16 | this access |
-| UseUseExplosion.cs:24:1772:24:1772 | access to local variable x | UseUseExplosion.cs:24:1768:24:1773 | [input] SSA phi read(x) |
-| UseUseExplosion.cs:24:1783:24:1788 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(this.Prop) |
-| UseUseExplosion.cs:24:1783:24:1788 | [input] SSA phi read(x) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:1772:24:1772 | access to local variable x | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:1783:24:1788 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:13:25:16 | access to property Prop |
| UseUseExplosion.cs:24:1783:24:1788 | [post] this access | UseUseExplosion.cs:25:13:25:16 | this access |
| UseUseExplosion.cs:24:1783:24:1788 | this access | UseUseExplosion.cs:25:13:25:16 | this access |
-| UseUseExplosion.cs:24:1787:24:1787 | access to local variable x | UseUseExplosion.cs:24:1783:24:1788 | [input] SSA phi read(x) |
-| UseUseExplosion.cs:24:1798:24:1803 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(this.Prop) |
-| UseUseExplosion.cs:24:1798:24:1803 | [input] SSA phi read(x) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:1787:24:1787 | access to local variable x | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:1798:24:1803 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:13:25:16 | access to property Prop |
| UseUseExplosion.cs:24:1798:24:1803 | [post] this access | UseUseExplosion.cs:25:13:25:16 | this access |
| UseUseExplosion.cs:24:1798:24:1803 | this access | UseUseExplosion.cs:25:13:25:16 | this access |
-| UseUseExplosion.cs:24:1802:24:1802 | access to local variable x | UseUseExplosion.cs:24:1798:24:1803 | [input] SSA phi read(x) |
-| UseUseExplosion.cs:24:1813:24:1818 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(this.Prop) |
-| UseUseExplosion.cs:24:1813:24:1818 | [input] SSA phi read(x) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:1802:24:1802 | access to local variable x | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:1813:24:1818 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:13:25:16 | access to property Prop |
| UseUseExplosion.cs:24:1813:24:1818 | [post] this access | UseUseExplosion.cs:25:13:25:16 | this access |
| UseUseExplosion.cs:24:1813:24:1818 | this access | UseUseExplosion.cs:25:13:25:16 | this access |
-| UseUseExplosion.cs:24:1817:24:1817 | access to local variable x | UseUseExplosion.cs:24:1813:24:1818 | [input] SSA phi read(x) |
-| UseUseExplosion.cs:24:1828:24:1833 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(this.Prop) |
-| UseUseExplosion.cs:24:1828:24:1833 | [input] SSA phi read(x) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:1817:24:1817 | access to local variable x | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:1828:24:1833 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:13:25:16 | access to property Prop |
| UseUseExplosion.cs:24:1828:24:1833 | [post] this access | UseUseExplosion.cs:25:13:25:16 | this access |
| UseUseExplosion.cs:24:1828:24:1833 | this access | UseUseExplosion.cs:25:13:25:16 | this access |
-| UseUseExplosion.cs:24:1832:24:1832 | access to local variable x | UseUseExplosion.cs:24:1828:24:1833 | [input] SSA phi read(x) |
-| UseUseExplosion.cs:24:1843:24:1848 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(this.Prop) |
-| UseUseExplosion.cs:24:1843:24:1848 | [input] SSA phi read(x) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:1832:24:1832 | access to local variable x | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:1843:24:1848 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:13:25:16 | access to property Prop |
| UseUseExplosion.cs:24:1843:24:1848 | [post] this access | UseUseExplosion.cs:25:13:25:16 | this access |
| UseUseExplosion.cs:24:1843:24:1848 | this access | UseUseExplosion.cs:25:13:25:16 | this access |
-| UseUseExplosion.cs:24:1847:24:1847 | access to local variable x | UseUseExplosion.cs:24:1843:24:1848 | [input] SSA phi read(x) |
-| UseUseExplosion.cs:24:1858:24:1863 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(this.Prop) |
-| UseUseExplosion.cs:24:1858:24:1863 | [input] SSA phi read(x) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:1847:24:1847 | access to local variable x | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:1858:24:1863 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:13:25:16 | access to property Prop |
| UseUseExplosion.cs:24:1858:24:1863 | [post] this access | UseUseExplosion.cs:25:13:25:16 | this access |
| UseUseExplosion.cs:24:1858:24:1863 | this access | UseUseExplosion.cs:25:13:25:16 | this access |
-| UseUseExplosion.cs:24:1862:24:1862 | access to local variable x | UseUseExplosion.cs:24:1858:24:1863 | [input] SSA phi read(x) |
-| UseUseExplosion.cs:24:1873:24:1878 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(this.Prop) |
-| UseUseExplosion.cs:24:1873:24:1878 | [input] SSA phi read(x) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:1862:24:1862 | access to local variable x | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:1873:24:1878 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:13:25:16 | access to property Prop |
| UseUseExplosion.cs:24:1873:24:1878 | [post] this access | UseUseExplosion.cs:25:13:25:16 | this access |
| UseUseExplosion.cs:24:1873:24:1878 | this access | UseUseExplosion.cs:25:13:25:16 | this access |
-| UseUseExplosion.cs:24:1877:24:1877 | access to local variable x | UseUseExplosion.cs:24:1873:24:1878 | [input] SSA phi read(x) |
-| UseUseExplosion.cs:24:1888:24:1893 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(this.Prop) |
-| UseUseExplosion.cs:24:1888:24:1893 | [input] SSA phi read(x) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:1877:24:1877 | access to local variable x | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:1888:24:1893 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:13:25:16 | access to property Prop |
| UseUseExplosion.cs:24:1888:24:1893 | [post] this access | UseUseExplosion.cs:25:13:25:16 | this access |
| UseUseExplosion.cs:24:1888:24:1893 | this access | UseUseExplosion.cs:25:13:25:16 | this access |
-| UseUseExplosion.cs:24:1892:24:1892 | access to local variable x | UseUseExplosion.cs:24:1888:24:1893 | [input] SSA phi read(x) |
-| UseUseExplosion.cs:24:1903:24:1908 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(this.Prop) |
-| UseUseExplosion.cs:24:1903:24:1908 | [input] SSA phi read(x) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:1892:24:1892 | access to local variable x | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:1903:24:1908 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:13:25:16 | access to property Prop |
| UseUseExplosion.cs:24:1903:24:1908 | [post] this access | UseUseExplosion.cs:25:13:25:16 | this access |
| UseUseExplosion.cs:24:1903:24:1908 | this access | UseUseExplosion.cs:25:13:25:16 | this access |
-| UseUseExplosion.cs:24:1907:24:1907 | access to local variable x | UseUseExplosion.cs:24:1903:24:1908 | [input] SSA phi read(x) |
-| UseUseExplosion.cs:24:1918:24:1923 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(this.Prop) |
-| UseUseExplosion.cs:24:1918:24:1923 | [input] SSA phi read(x) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:1907:24:1907 | access to local variable x | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:1918:24:1923 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:13:25:16 | access to property Prop |
| UseUseExplosion.cs:24:1918:24:1923 | [post] this access | UseUseExplosion.cs:25:13:25:16 | this access |
| UseUseExplosion.cs:24:1918:24:1923 | this access | UseUseExplosion.cs:25:13:25:16 | this access |
-| UseUseExplosion.cs:24:1922:24:1922 | access to local variable x | UseUseExplosion.cs:24:1918:24:1923 | [input] SSA phi read(x) |
-| UseUseExplosion.cs:24:1933:24:1938 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(this.Prop) |
-| UseUseExplosion.cs:24:1933:24:1938 | [input] SSA phi read(x) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:1922:24:1922 | access to local variable x | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:1933:24:1938 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:13:25:16 | access to property Prop |
| UseUseExplosion.cs:24:1933:24:1938 | [post] this access | UseUseExplosion.cs:25:13:25:16 | this access |
| UseUseExplosion.cs:24:1933:24:1938 | this access | UseUseExplosion.cs:25:13:25:16 | this access |
-| UseUseExplosion.cs:24:1937:24:1937 | access to local variable x | UseUseExplosion.cs:24:1933:24:1938 | [input] SSA phi read(x) |
-| UseUseExplosion.cs:24:1948:24:1953 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(this.Prop) |
-| UseUseExplosion.cs:24:1948:24:1953 | [input] SSA phi read(x) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:1937:24:1937 | access to local variable x | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:1948:24:1953 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:13:25:16 | access to property Prop |
| UseUseExplosion.cs:24:1948:24:1953 | [post] this access | UseUseExplosion.cs:25:13:25:16 | this access |
| UseUseExplosion.cs:24:1948:24:1953 | this access | UseUseExplosion.cs:25:13:25:16 | this access |
-| UseUseExplosion.cs:24:1952:24:1952 | access to local variable x | UseUseExplosion.cs:24:1948:24:1953 | [input] SSA phi read(x) |
-| UseUseExplosion.cs:24:1963:24:1968 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(this.Prop) |
-| UseUseExplosion.cs:24:1963:24:1968 | [input] SSA phi read(x) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:1952:24:1952 | access to local variable x | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:1963:24:1968 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:13:25:16 | access to property Prop |
| UseUseExplosion.cs:24:1963:24:1968 | [post] this access | UseUseExplosion.cs:25:13:25:16 | this access |
| UseUseExplosion.cs:24:1963:24:1968 | this access | UseUseExplosion.cs:25:13:25:16 | this access |
-| UseUseExplosion.cs:24:1967:24:1967 | access to local variable x | UseUseExplosion.cs:24:1963:24:1968 | [input] SSA phi read(x) |
-| UseUseExplosion.cs:24:1978:24:1983 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(this.Prop) |
-| UseUseExplosion.cs:24:1978:24:1983 | [input] SSA phi read(x) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:1967:24:1967 | access to local variable x | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:1978:24:1983 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:13:25:16 | access to property Prop |
| UseUseExplosion.cs:24:1978:24:1983 | [post] this access | UseUseExplosion.cs:25:13:25:16 | this access |
| UseUseExplosion.cs:24:1978:24:1983 | this access | UseUseExplosion.cs:25:13:25:16 | this access |
-| UseUseExplosion.cs:24:1982:24:1982 | access to local variable x | UseUseExplosion.cs:24:1978:24:1983 | [input] SSA phi read(x) |
-| UseUseExplosion.cs:24:1993:24:1998 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(this.Prop) |
-| UseUseExplosion.cs:24:1993:24:1998 | [input] SSA phi read(x) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:1982:24:1982 | access to local variable x | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:1993:24:1998 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:13:25:16 | access to property Prop |
| UseUseExplosion.cs:24:1993:24:1998 | [post] this access | UseUseExplosion.cs:25:13:25:16 | this access |
| UseUseExplosion.cs:24:1993:24:1998 | this access | UseUseExplosion.cs:25:13:25:16 | this access |
-| UseUseExplosion.cs:24:1997:24:1997 | access to local variable x | UseUseExplosion.cs:24:1993:24:1998 | [input] SSA phi read(x) |
-| UseUseExplosion.cs:24:2008:24:2013 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(this.Prop) |
-| UseUseExplosion.cs:24:2008:24:2013 | [input] SSA phi read(x) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:1997:24:1997 | access to local variable x | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:2008:24:2013 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:13:25:16 | access to property Prop |
| UseUseExplosion.cs:24:2008:24:2013 | [post] this access | UseUseExplosion.cs:25:13:25:16 | this access |
| UseUseExplosion.cs:24:2008:24:2013 | this access | UseUseExplosion.cs:25:13:25:16 | this access |
-| UseUseExplosion.cs:24:2012:24:2012 | access to local variable x | UseUseExplosion.cs:24:2008:24:2013 | [input] SSA phi read(x) |
-| UseUseExplosion.cs:24:2023:24:2028 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(this.Prop) |
-| UseUseExplosion.cs:24:2023:24:2028 | [input] SSA phi read(x) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:2012:24:2012 | access to local variable x | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:2023:24:2028 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:13:25:16 | access to property Prop |
| UseUseExplosion.cs:24:2023:24:2028 | [post] this access | UseUseExplosion.cs:25:13:25:16 | this access |
| UseUseExplosion.cs:24:2023:24:2028 | this access | UseUseExplosion.cs:25:13:25:16 | this access |
-| UseUseExplosion.cs:24:2027:24:2027 | access to local variable x | UseUseExplosion.cs:24:2023:24:2028 | [input] SSA phi read(x) |
-| UseUseExplosion.cs:24:2038:24:2043 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(this.Prop) |
-| UseUseExplosion.cs:24:2038:24:2043 | [input] SSA phi read(x) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:2027:24:2027 | access to local variable x | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:2038:24:2043 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:13:25:16 | access to property Prop |
| UseUseExplosion.cs:24:2038:24:2043 | [post] this access | UseUseExplosion.cs:25:13:25:16 | this access |
| UseUseExplosion.cs:24:2038:24:2043 | this access | UseUseExplosion.cs:25:13:25:16 | this access |
-| UseUseExplosion.cs:24:2042:24:2042 | access to local variable x | UseUseExplosion.cs:24:2038:24:2043 | [input] SSA phi read(x) |
-| UseUseExplosion.cs:24:2053:24:2058 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(this.Prop) |
-| UseUseExplosion.cs:24:2053:24:2058 | [input] SSA phi read(x) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:2042:24:2042 | access to local variable x | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:2053:24:2058 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:13:25:16 | access to property Prop |
| UseUseExplosion.cs:24:2053:24:2058 | [post] this access | UseUseExplosion.cs:25:13:25:16 | this access |
| UseUseExplosion.cs:24:2053:24:2058 | this access | UseUseExplosion.cs:25:13:25:16 | this access |
-| UseUseExplosion.cs:24:2057:24:2057 | access to local variable x | UseUseExplosion.cs:24:2053:24:2058 | [input] SSA phi read(x) |
-| UseUseExplosion.cs:24:2068:24:2073 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(this.Prop) |
-| UseUseExplosion.cs:24:2068:24:2073 | [input] SSA phi read(x) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:2057:24:2057 | access to local variable x | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:2068:24:2073 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:13:25:16 | access to property Prop |
| UseUseExplosion.cs:24:2068:24:2073 | [post] this access | UseUseExplosion.cs:25:13:25:16 | this access |
| UseUseExplosion.cs:24:2068:24:2073 | this access | UseUseExplosion.cs:25:13:25:16 | this access |
-| UseUseExplosion.cs:24:2072:24:2072 | access to local variable x | UseUseExplosion.cs:24:2068:24:2073 | [input] SSA phi read(x) |
-| UseUseExplosion.cs:24:2083:24:2088 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(this.Prop) |
-| UseUseExplosion.cs:24:2083:24:2088 | [input] SSA phi read(x) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:2072:24:2072 | access to local variable x | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:2083:24:2088 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:13:25:16 | access to property Prop |
| UseUseExplosion.cs:24:2083:24:2088 | [post] this access | UseUseExplosion.cs:25:13:25:16 | this access |
| UseUseExplosion.cs:24:2083:24:2088 | this access | UseUseExplosion.cs:25:13:25:16 | this access |
-| UseUseExplosion.cs:24:2087:24:2087 | access to local variable x | UseUseExplosion.cs:24:2083:24:2088 | [input] SSA phi read(x) |
-| UseUseExplosion.cs:24:2098:24:2103 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(this.Prop) |
-| UseUseExplosion.cs:24:2098:24:2103 | [input] SSA phi read(x) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:2087:24:2087 | access to local variable x | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:2098:24:2103 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:13:25:16 | access to property Prop |
| UseUseExplosion.cs:24:2098:24:2103 | [post] this access | UseUseExplosion.cs:25:13:25:16 | this access |
| UseUseExplosion.cs:24:2098:24:2103 | this access | UseUseExplosion.cs:25:13:25:16 | this access |
-| UseUseExplosion.cs:24:2102:24:2102 | access to local variable x | UseUseExplosion.cs:24:2098:24:2103 | [input] SSA phi read(x) |
-| UseUseExplosion.cs:24:2113:24:2118 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(this.Prop) |
-| UseUseExplosion.cs:24:2113:24:2118 | [input] SSA phi read(x) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:2102:24:2102 | access to local variable x | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:2113:24:2118 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:13:25:16 | access to property Prop |
| UseUseExplosion.cs:24:2113:24:2118 | [post] this access | UseUseExplosion.cs:25:13:25:16 | this access |
| UseUseExplosion.cs:24:2113:24:2118 | this access | UseUseExplosion.cs:25:13:25:16 | this access |
-| UseUseExplosion.cs:24:2117:24:2117 | access to local variable x | UseUseExplosion.cs:24:2113:24:2118 | [input] SSA phi read(x) |
-| UseUseExplosion.cs:24:2128:24:2133 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(this.Prop) |
-| UseUseExplosion.cs:24:2128:24:2133 | [input] SSA phi read(x) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:2117:24:2117 | access to local variable x | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:2128:24:2133 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:13:25:16 | access to property Prop |
| UseUseExplosion.cs:24:2128:24:2133 | [post] this access | UseUseExplosion.cs:25:13:25:16 | this access |
| UseUseExplosion.cs:24:2128:24:2133 | this access | UseUseExplosion.cs:25:13:25:16 | this access |
-| UseUseExplosion.cs:24:2132:24:2132 | access to local variable x | UseUseExplosion.cs:24:2128:24:2133 | [input] SSA phi read(x) |
-| UseUseExplosion.cs:24:2143:24:2148 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(this.Prop) |
-| UseUseExplosion.cs:24:2143:24:2148 | [input] SSA phi read(x) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:2132:24:2132 | access to local variable x | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:2143:24:2148 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:13:25:16 | access to property Prop |
| UseUseExplosion.cs:24:2143:24:2148 | [post] this access | UseUseExplosion.cs:25:13:25:16 | this access |
| UseUseExplosion.cs:24:2143:24:2148 | this access | UseUseExplosion.cs:25:13:25:16 | this access |
-| UseUseExplosion.cs:24:2147:24:2147 | access to local variable x | UseUseExplosion.cs:24:2143:24:2148 | [input] SSA phi read(x) |
-| UseUseExplosion.cs:24:2158:24:2163 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(this.Prop) |
-| UseUseExplosion.cs:24:2158:24:2163 | [input] SSA phi read(x) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:2147:24:2147 | access to local variable x | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:2158:24:2163 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:13:25:16 | access to property Prop |
| UseUseExplosion.cs:24:2158:24:2163 | [post] this access | UseUseExplosion.cs:25:13:25:16 | this access |
| UseUseExplosion.cs:24:2158:24:2163 | this access | UseUseExplosion.cs:25:13:25:16 | this access |
-| UseUseExplosion.cs:24:2162:24:2162 | access to local variable x | UseUseExplosion.cs:24:2158:24:2163 | [input] SSA phi read(x) |
-| UseUseExplosion.cs:24:2173:24:2178 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(this.Prop) |
-| UseUseExplosion.cs:24:2173:24:2178 | [input] SSA phi read(x) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:2162:24:2162 | access to local variable x | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:2173:24:2178 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:13:25:16 | access to property Prop |
| UseUseExplosion.cs:24:2173:24:2178 | [post] this access | UseUseExplosion.cs:25:13:25:16 | this access |
| UseUseExplosion.cs:24:2173:24:2178 | this access | UseUseExplosion.cs:25:13:25:16 | this access |
-| UseUseExplosion.cs:24:2177:24:2177 | access to local variable x | UseUseExplosion.cs:24:2173:24:2178 | [input] SSA phi read(x) |
-| UseUseExplosion.cs:24:2188:24:2193 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(this.Prop) |
-| UseUseExplosion.cs:24:2188:24:2193 | [input] SSA phi read(x) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:2177:24:2177 | access to local variable x | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:2188:24:2193 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:13:25:16 | access to property Prop |
| UseUseExplosion.cs:24:2188:24:2193 | [post] this access | UseUseExplosion.cs:25:13:25:16 | this access |
| UseUseExplosion.cs:24:2188:24:2193 | this access | UseUseExplosion.cs:25:13:25:16 | this access |
-| UseUseExplosion.cs:24:2192:24:2192 | access to local variable x | UseUseExplosion.cs:24:2188:24:2193 | [input] SSA phi read(x) |
-| UseUseExplosion.cs:24:2203:24:2208 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(this.Prop) |
-| UseUseExplosion.cs:24:2203:24:2208 | [input] SSA phi read(x) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:2192:24:2192 | access to local variable x | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:2203:24:2208 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:13:25:16 | access to property Prop |
| UseUseExplosion.cs:24:2203:24:2208 | [post] this access | UseUseExplosion.cs:25:13:25:16 | this access |
| UseUseExplosion.cs:24:2203:24:2208 | this access | UseUseExplosion.cs:25:13:25:16 | this access |
-| UseUseExplosion.cs:24:2207:24:2207 | access to local variable x | UseUseExplosion.cs:24:2203:24:2208 | [input] SSA phi read(x) |
-| UseUseExplosion.cs:24:2218:24:2223 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(this.Prop) |
-| UseUseExplosion.cs:24:2218:24:2223 | [input] SSA phi read(x) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:2207:24:2207 | access to local variable x | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:2218:24:2223 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:13:25:16 | access to property Prop |
| UseUseExplosion.cs:24:2218:24:2223 | [post] this access | UseUseExplosion.cs:25:13:25:16 | this access |
| UseUseExplosion.cs:24:2218:24:2223 | this access | UseUseExplosion.cs:25:13:25:16 | this access |
-| UseUseExplosion.cs:24:2222:24:2222 | access to local variable x | UseUseExplosion.cs:24:2218:24:2223 | [input] SSA phi read(x) |
-| UseUseExplosion.cs:24:2233:24:2238 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(this.Prop) |
-| UseUseExplosion.cs:24:2233:24:2238 | [input] SSA phi read(x) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:2222:24:2222 | access to local variable x | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:2233:24:2238 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:13:25:16 | access to property Prop |
| UseUseExplosion.cs:24:2233:24:2238 | [post] this access | UseUseExplosion.cs:25:13:25:16 | this access |
| UseUseExplosion.cs:24:2233:24:2238 | this access | UseUseExplosion.cs:25:13:25:16 | this access |
-| UseUseExplosion.cs:24:2237:24:2237 | access to local variable x | UseUseExplosion.cs:24:2233:24:2238 | [input] SSA phi read(x) |
-| UseUseExplosion.cs:24:2248:24:2253 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(this.Prop) |
-| UseUseExplosion.cs:24:2248:24:2253 | [input] SSA phi read(x) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:2237:24:2237 | access to local variable x | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:2248:24:2253 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:13:25:16 | access to property Prop |
| UseUseExplosion.cs:24:2248:24:2253 | [post] this access | UseUseExplosion.cs:25:13:25:16 | this access |
| UseUseExplosion.cs:24:2248:24:2253 | this access | UseUseExplosion.cs:25:13:25:16 | this access |
-| UseUseExplosion.cs:24:2252:24:2252 | access to local variable x | UseUseExplosion.cs:24:2248:24:2253 | [input] SSA phi read(x) |
-| UseUseExplosion.cs:24:2263:24:2268 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(this.Prop) |
-| UseUseExplosion.cs:24:2263:24:2268 | [input] SSA phi read(x) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:2252:24:2252 | access to local variable x | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:2263:24:2268 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:13:25:16 | access to property Prop |
| UseUseExplosion.cs:24:2263:24:2268 | [post] this access | UseUseExplosion.cs:25:13:25:16 | this access |
| UseUseExplosion.cs:24:2263:24:2268 | this access | UseUseExplosion.cs:25:13:25:16 | this access |
-| UseUseExplosion.cs:24:2267:24:2267 | access to local variable x | UseUseExplosion.cs:24:2263:24:2268 | [input] SSA phi read(x) |
-| UseUseExplosion.cs:24:2278:24:2283 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(this.Prop) |
-| UseUseExplosion.cs:24:2278:24:2283 | [input] SSA phi read(x) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:2267:24:2267 | access to local variable x | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:2278:24:2283 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:13:25:16 | access to property Prop |
| UseUseExplosion.cs:24:2278:24:2283 | [post] this access | UseUseExplosion.cs:25:13:25:16 | this access |
| UseUseExplosion.cs:24:2278:24:2283 | this access | UseUseExplosion.cs:25:13:25:16 | this access |
-| UseUseExplosion.cs:24:2282:24:2282 | access to local variable x | UseUseExplosion.cs:24:2278:24:2283 | [input] SSA phi read(x) |
-| UseUseExplosion.cs:24:2293:24:2298 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(this.Prop) |
-| UseUseExplosion.cs:24:2293:24:2298 | [input] SSA phi read(x) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:2282:24:2282 | access to local variable x | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:2293:24:2298 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:13:25:16 | access to property Prop |
| UseUseExplosion.cs:24:2293:24:2298 | [post] this access | UseUseExplosion.cs:25:13:25:16 | this access |
| UseUseExplosion.cs:24:2293:24:2298 | this access | UseUseExplosion.cs:25:13:25:16 | this access |
-| UseUseExplosion.cs:24:2297:24:2297 | access to local variable x | UseUseExplosion.cs:24:2293:24:2298 | [input] SSA phi read(x) |
-| UseUseExplosion.cs:24:2308:24:2313 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(this.Prop) |
-| UseUseExplosion.cs:24:2308:24:2313 | [input] SSA phi read(x) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:2297:24:2297 | access to local variable x | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:2308:24:2313 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:13:25:16 | access to property Prop |
| UseUseExplosion.cs:24:2308:24:2313 | [post] this access | UseUseExplosion.cs:25:13:25:16 | this access |
| UseUseExplosion.cs:24:2308:24:2313 | this access | UseUseExplosion.cs:25:13:25:16 | this access |
-| UseUseExplosion.cs:24:2312:24:2312 | access to local variable x | UseUseExplosion.cs:24:2308:24:2313 | [input] SSA phi read(x) |
-| UseUseExplosion.cs:24:2323:24:2328 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(this.Prop) |
-| UseUseExplosion.cs:24:2323:24:2328 | [input] SSA phi read(x) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:2312:24:2312 | access to local variable x | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:2323:24:2328 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:13:25:16 | access to property Prop |
| UseUseExplosion.cs:24:2323:24:2328 | [post] this access | UseUseExplosion.cs:25:13:25:16 | this access |
| UseUseExplosion.cs:24:2323:24:2328 | this access | UseUseExplosion.cs:25:13:25:16 | this access |
-| UseUseExplosion.cs:24:2327:24:2327 | access to local variable x | UseUseExplosion.cs:24:2323:24:2328 | [input] SSA phi read(x) |
-| UseUseExplosion.cs:24:2338:24:2343 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(this.Prop) |
-| UseUseExplosion.cs:24:2338:24:2343 | [input] SSA phi read(x) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:2327:24:2327 | access to local variable x | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:2338:24:2343 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:13:25:16 | access to property Prop |
| UseUseExplosion.cs:24:2338:24:2343 | [post] this access | UseUseExplosion.cs:25:13:25:16 | this access |
| UseUseExplosion.cs:24:2338:24:2343 | this access | UseUseExplosion.cs:25:13:25:16 | this access |
-| UseUseExplosion.cs:24:2342:24:2342 | access to local variable x | UseUseExplosion.cs:24:2338:24:2343 | [input] SSA phi read(x) |
-| UseUseExplosion.cs:24:2353:24:2358 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(this.Prop) |
-| UseUseExplosion.cs:24:2353:24:2358 | [input] SSA phi read(x) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:2342:24:2342 | access to local variable x | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:2353:24:2358 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:13:25:16 | access to property Prop |
| UseUseExplosion.cs:24:2353:24:2358 | [post] this access | UseUseExplosion.cs:25:13:25:16 | this access |
| UseUseExplosion.cs:24:2353:24:2358 | this access | UseUseExplosion.cs:25:13:25:16 | this access |
-| UseUseExplosion.cs:24:2357:24:2357 | access to local variable x | UseUseExplosion.cs:24:2353:24:2358 | [input] SSA phi read(x) |
-| UseUseExplosion.cs:24:2368:24:2373 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(this.Prop) |
-| UseUseExplosion.cs:24:2368:24:2373 | [input] SSA phi read(x) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:2357:24:2357 | access to local variable x | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:2368:24:2373 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:13:25:16 | access to property Prop |
| UseUseExplosion.cs:24:2368:24:2373 | [post] this access | UseUseExplosion.cs:25:13:25:16 | this access |
| UseUseExplosion.cs:24:2368:24:2373 | this access | UseUseExplosion.cs:25:13:25:16 | this access |
-| UseUseExplosion.cs:24:2372:24:2372 | access to local variable x | UseUseExplosion.cs:24:2368:24:2373 | [input] SSA phi read(x) |
-| UseUseExplosion.cs:24:2383:24:2388 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(this.Prop) |
-| UseUseExplosion.cs:24:2383:24:2388 | [input] SSA phi read(x) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:2372:24:2372 | access to local variable x | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:2383:24:2388 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:13:25:16 | access to property Prop |
| UseUseExplosion.cs:24:2383:24:2388 | [post] this access | UseUseExplosion.cs:25:13:25:16 | this access |
| UseUseExplosion.cs:24:2383:24:2388 | this access | UseUseExplosion.cs:25:13:25:16 | this access |
-| UseUseExplosion.cs:24:2387:24:2387 | access to local variable x | UseUseExplosion.cs:24:2383:24:2388 | [input] SSA phi read(x) |
-| UseUseExplosion.cs:24:2398:24:2403 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(this.Prop) |
-| UseUseExplosion.cs:24:2398:24:2403 | [input] SSA phi read(x) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:2387:24:2387 | access to local variable x | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:2398:24:2403 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:13:25:16 | access to property Prop |
| UseUseExplosion.cs:24:2398:24:2403 | [post] this access | UseUseExplosion.cs:25:13:25:16 | this access |
| UseUseExplosion.cs:24:2398:24:2403 | this access | UseUseExplosion.cs:25:13:25:16 | this access |
-| UseUseExplosion.cs:24:2402:24:2402 | access to local variable x | UseUseExplosion.cs:24:2398:24:2403 | [input] SSA phi read(x) |
-| UseUseExplosion.cs:24:2413:24:2418 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(this.Prop) |
-| UseUseExplosion.cs:24:2413:24:2418 | [input] SSA phi read(x) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:2402:24:2402 | access to local variable x | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:2413:24:2418 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:13:25:16 | access to property Prop |
| UseUseExplosion.cs:24:2413:24:2418 | [post] this access | UseUseExplosion.cs:25:13:25:16 | this access |
| UseUseExplosion.cs:24:2413:24:2418 | this access | UseUseExplosion.cs:25:13:25:16 | this access |
-| UseUseExplosion.cs:24:2417:24:2417 | access to local variable x | UseUseExplosion.cs:24:2413:24:2418 | [input] SSA phi read(x) |
-| UseUseExplosion.cs:24:2428:24:2433 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(this.Prop) |
-| UseUseExplosion.cs:24:2428:24:2433 | [input] SSA phi read(x) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:2417:24:2417 | access to local variable x | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:2428:24:2433 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:13:25:16 | access to property Prop |
| UseUseExplosion.cs:24:2428:24:2433 | [post] this access | UseUseExplosion.cs:25:13:25:16 | this access |
| UseUseExplosion.cs:24:2428:24:2433 | this access | UseUseExplosion.cs:25:13:25:16 | this access |
-| UseUseExplosion.cs:24:2432:24:2432 | access to local variable x | UseUseExplosion.cs:24:2428:24:2433 | [input] SSA phi read(x) |
-| UseUseExplosion.cs:24:2443:24:2448 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(this.Prop) |
-| UseUseExplosion.cs:24:2443:24:2448 | [input] SSA phi read(x) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:2432:24:2432 | access to local variable x | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:2443:24:2448 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:13:25:16 | access to property Prop |
| UseUseExplosion.cs:24:2443:24:2448 | [post] this access | UseUseExplosion.cs:25:13:25:16 | this access |
| UseUseExplosion.cs:24:2443:24:2448 | this access | UseUseExplosion.cs:25:13:25:16 | this access |
-| UseUseExplosion.cs:24:2447:24:2447 | access to local variable x | UseUseExplosion.cs:24:2443:24:2448 | [input] SSA phi read(x) |
-| UseUseExplosion.cs:24:2458:24:2463 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(this.Prop) |
-| UseUseExplosion.cs:24:2458:24:2463 | [input] SSA phi read(x) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:2447:24:2447 | access to local variable x | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:2458:24:2463 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:13:25:16 | access to property Prop |
| UseUseExplosion.cs:24:2458:24:2463 | [post] this access | UseUseExplosion.cs:25:13:25:16 | this access |
| UseUseExplosion.cs:24:2458:24:2463 | this access | UseUseExplosion.cs:25:13:25:16 | this access |
-| UseUseExplosion.cs:24:2462:24:2462 | access to local variable x | UseUseExplosion.cs:24:2458:24:2463 | [input] SSA phi read(x) |
-| UseUseExplosion.cs:24:2473:24:2478 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(this.Prop) |
-| UseUseExplosion.cs:24:2473:24:2478 | [input] SSA phi read(x) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:2462:24:2462 | access to local variable x | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:2473:24:2478 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:13:25:16 | access to property Prop |
| UseUseExplosion.cs:24:2473:24:2478 | [post] this access | UseUseExplosion.cs:25:13:25:16 | this access |
| UseUseExplosion.cs:24:2473:24:2478 | this access | UseUseExplosion.cs:25:13:25:16 | this access |
-| UseUseExplosion.cs:24:2477:24:2477 | access to local variable x | UseUseExplosion.cs:24:2473:24:2478 | [input] SSA phi read(x) |
-| UseUseExplosion.cs:24:2488:24:2493 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(this.Prop) |
-| UseUseExplosion.cs:24:2488:24:2493 | [input] SSA phi read(x) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:2477:24:2477 | access to local variable x | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:2488:24:2493 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:13:25:16 | access to property Prop |
| UseUseExplosion.cs:24:2488:24:2493 | [post] this access | UseUseExplosion.cs:25:13:25:16 | this access |
| UseUseExplosion.cs:24:2488:24:2493 | this access | UseUseExplosion.cs:25:13:25:16 | this access |
-| UseUseExplosion.cs:24:2492:24:2492 | access to local variable x | UseUseExplosion.cs:24:2488:24:2493 | [input] SSA phi read(x) |
-| UseUseExplosion.cs:24:2503:24:2508 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(this.Prop) |
-| UseUseExplosion.cs:24:2503:24:2508 | [input] SSA phi read(x) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:2492:24:2492 | access to local variable x | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:2503:24:2508 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:13:25:16 | access to property Prop |
| UseUseExplosion.cs:24:2503:24:2508 | [post] this access | UseUseExplosion.cs:25:13:25:16 | this access |
| UseUseExplosion.cs:24:2503:24:2508 | this access | UseUseExplosion.cs:25:13:25:16 | this access |
-| UseUseExplosion.cs:24:2507:24:2507 | access to local variable x | UseUseExplosion.cs:24:2503:24:2508 | [input] SSA phi read(x) |
-| UseUseExplosion.cs:24:2518:24:2523 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(this.Prop) |
-| UseUseExplosion.cs:24:2518:24:2523 | [input] SSA phi read(x) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:2507:24:2507 | access to local variable x | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:2518:24:2523 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:13:25:16 | access to property Prop |
| UseUseExplosion.cs:24:2518:24:2523 | [post] this access | UseUseExplosion.cs:25:13:25:16 | this access |
| UseUseExplosion.cs:24:2518:24:2523 | this access | UseUseExplosion.cs:25:13:25:16 | this access |
-| UseUseExplosion.cs:24:2522:24:2522 | access to local variable x | UseUseExplosion.cs:24:2518:24:2523 | [input] SSA phi read(x) |
-| UseUseExplosion.cs:24:2533:24:2538 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(this.Prop) |
-| UseUseExplosion.cs:24:2533:24:2538 | [input] SSA phi read(x) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:2522:24:2522 | access to local variable x | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:2533:24:2538 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:13:25:16 | access to property Prop |
| UseUseExplosion.cs:24:2533:24:2538 | [post] this access | UseUseExplosion.cs:25:13:25:16 | this access |
| UseUseExplosion.cs:24:2533:24:2538 | this access | UseUseExplosion.cs:25:13:25:16 | this access |
-| UseUseExplosion.cs:24:2537:24:2537 | access to local variable x | UseUseExplosion.cs:24:2533:24:2538 | [input] SSA phi read(x) |
-| UseUseExplosion.cs:24:2548:24:2553 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(this.Prop) |
-| UseUseExplosion.cs:24:2548:24:2553 | [input] SSA phi read(x) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:2537:24:2537 | access to local variable x | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:2548:24:2553 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:13:25:16 | access to property Prop |
| UseUseExplosion.cs:24:2548:24:2553 | [post] this access | UseUseExplosion.cs:25:13:25:16 | this access |
| UseUseExplosion.cs:24:2548:24:2553 | this access | UseUseExplosion.cs:25:13:25:16 | this access |
-| UseUseExplosion.cs:24:2552:24:2552 | access to local variable x | UseUseExplosion.cs:24:2548:24:2553 | [input] SSA phi read(x) |
-| UseUseExplosion.cs:24:2563:24:2568 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(this.Prop) |
-| UseUseExplosion.cs:24:2563:24:2568 | [input] SSA phi read(x) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:2552:24:2552 | access to local variable x | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:2563:24:2568 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:13:25:16 | access to property Prop |
| UseUseExplosion.cs:24:2563:24:2568 | [post] this access | UseUseExplosion.cs:25:13:25:16 | this access |
| UseUseExplosion.cs:24:2563:24:2568 | this access | UseUseExplosion.cs:25:13:25:16 | this access |
-| UseUseExplosion.cs:24:2567:24:2567 | access to local variable x | UseUseExplosion.cs:24:2563:24:2568 | [input] SSA phi read(x) |
-| UseUseExplosion.cs:24:2578:24:2583 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(this.Prop) |
-| UseUseExplosion.cs:24:2578:24:2583 | [input] SSA phi read(x) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:2567:24:2567 | access to local variable x | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:2578:24:2583 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:13:25:16 | access to property Prop |
| UseUseExplosion.cs:24:2578:24:2583 | [post] this access | UseUseExplosion.cs:25:13:25:16 | this access |
| UseUseExplosion.cs:24:2578:24:2583 | this access | UseUseExplosion.cs:25:13:25:16 | this access |
-| UseUseExplosion.cs:24:2582:24:2582 | access to local variable x | UseUseExplosion.cs:24:2578:24:2583 | [input] SSA phi read(x) |
-| UseUseExplosion.cs:24:2593:24:2598 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(this.Prop) |
-| UseUseExplosion.cs:24:2593:24:2598 | [input] SSA phi read(x) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:2582:24:2582 | access to local variable x | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:2593:24:2598 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:13:25:16 | access to property Prop |
| UseUseExplosion.cs:24:2593:24:2598 | [post] this access | UseUseExplosion.cs:25:13:25:16 | this access |
| UseUseExplosion.cs:24:2593:24:2598 | this access | UseUseExplosion.cs:25:13:25:16 | this access |
-| UseUseExplosion.cs:24:2597:24:2597 | access to local variable x | UseUseExplosion.cs:24:2593:24:2598 | [input] SSA phi read(x) |
-| UseUseExplosion.cs:24:2608:24:2613 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(this.Prop) |
-| UseUseExplosion.cs:24:2608:24:2613 | [input] SSA phi read(x) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:2597:24:2597 | access to local variable x | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:2608:24:2613 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:13:25:16 | access to property Prop |
| UseUseExplosion.cs:24:2608:24:2613 | [post] this access | UseUseExplosion.cs:25:13:25:16 | this access |
| UseUseExplosion.cs:24:2608:24:2613 | this access | UseUseExplosion.cs:25:13:25:16 | this access |
-| UseUseExplosion.cs:24:2612:24:2612 | access to local variable x | UseUseExplosion.cs:24:2608:24:2613 | [input] SSA phi read(x) |
-| UseUseExplosion.cs:24:2623:24:2628 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(this.Prop) |
-| UseUseExplosion.cs:24:2623:24:2628 | [input] SSA phi read(x) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:2612:24:2612 | access to local variable x | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:2623:24:2628 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:13:25:16 | access to property Prop |
| UseUseExplosion.cs:24:2623:24:2628 | [post] this access | UseUseExplosion.cs:25:13:25:16 | this access |
| UseUseExplosion.cs:24:2623:24:2628 | this access | UseUseExplosion.cs:25:13:25:16 | this access |
-| UseUseExplosion.cs:24:2627:24:2627 | access to local variable x | UseUseExplosion.cs:24:2623:24:2628 | [input] SSA phi read(x) |
-| UseUseExplosion.cs:24:2638:24:2643 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(this.Prop) |
-| UseUseExplosion.cs:24:2638:24:2643 | [input] SSA phi read(x) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:2627:24:2627 | access to local variable x | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:2638:24:2643 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:13:25:16 | access to property Prop |
| UseUseExplosion.cs:24:2638:24:2643 | [post] this access | UseUseExplosion.cs:25:13:25:16 | this access |
| UseUseExplosion.cs:24:2638:24:2643 | this access | UseUseExplosion.cs:25:13:25:16 | this access |
-| UseUseExplosion.cs:24:2642:24:2642 | access to local variable x | UseUseExplosion.cs:24:2638:24:2643 | [input] SSA phi read(x) |
-| UseUseExplosion.cs:24:2653:24:2658 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(this.Prop) |
-| UseUseExplosion.cs:24:2653:24:2658 | [input] SSA phi read(x) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:2642:24:2642 | access to local variable x | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:2653:24:2658 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:13:25:16 | access to property Prop |
| UseUseExplosion.cs:24:2653:24:2658 | [post] this access | UseUseExplosion.cs:25:13:25:16 | this access |
| UseUseExplosion.cs:24:2653:24:2658 | this access | UseUseExplosion.cs:25:13:25:16 | this access |
-| UseUseExplosion.cs:24:2657:24:2657 | access to local variable x | UseUseExplosion.cs:24:2653:24:2658 | [input] SSA phi read(x) |
-| UseUseExplosion.cs:24:2668:24:2673 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(this.Prop) |
-| UseUseExplosion.cs:24:2668:24:2673 | [input] SSA phi read(x) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:2657:24:2657 | access to local variable x | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:2668:24:2673 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:13:25:16 | access to property Prop |
| UseUseExplosion.cs:24:2668:24:2673 | [post] this access | UseUseExplosion.cs:25:13:25:16 | this access |
| UseUseExplosion.cs:24:2668:24:2673 | this access | UseUseExplosion.cs:25:13:25:16 | this access |
-| UseUseExplosion.cs:24:2672:24:2672 | access to local variable x | UseUseExplosion.cs:24:2668:24:2673 | [input] SSA phi read(x) |
-| UseUseExplosion.cs:24:2683:24:2688 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(this.Prop) |
-| UseUseExplosion.cs:24:2683:24:2688 | [input] SSA phi read(x) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:2672:24:2672 | access to local variable x | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:2683:24:2688 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:13:25:16 | access to property Prop |
| UseUseExplosion.cs:24:2683:24:2688 | [post] this access | UseUseExplosion.cs:25:13:25:16 | this access |
| UseUseExplosion.cs:24:2683:24:2688 | this access | UseUseExplosion.cs:25:13:25:16 | this access |
-| UseUseExplosion.cs:24:2687:24:2687 | access to local variable x | UseUseExplosion.cs:24:2683:24:2688 | [input] SSA phi read(x) |
-| UseUseExplosion.cs:24:2698:24:2703 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(this.Prop) |
-| UseUseExplosion.cs:24:2698:24:2703 | [input] SSA phi read(x) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:2687:24:2687 | access to local variable x | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:2698:24:2703 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:13:25:16 | access to property Prop |
| UseUseExplosion.cs:24:2698:24:2703 | [post] this access | UseUseExplosion.cs:25:13:25:16 | this access |
| UseUseExplosion.cs:24:2698:24:2703 | this access | UseUseExplosion.cs:25:13:25:16 | this access |
-| UseUseExplosion.cs:24:2702:24:2702 | access to local variable x | UseUseExplosion.cs:24:2698:24:2703 | [input] SSA phi read(x) |
-| UseUseExplosion.cs:24:2713:24:2718 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(this.Prop) |
-| UseUseExplosion.cs:24:2713:24:2718 | [input] SSA phi read(x) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:2702:24:2702 | access to local variable x | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:2713:24:2718 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:13:25:16 | access to property Prop |
| UseUseExplosion.cs:24:2713:24:2718 | [post] this access | UseUseExplosion.cs:25:13:25:16 | this access |
| UseUseExplosion.cs:24:2713:24:2718 | this access | UseUseExplosion.cs:25:13:25:16 | this access |
-| UseUseExplosion.cs:24:2717:24:2717 | access to local variable x | UseUseExplosion.cs:24:2713:24:2718 | [input] SSA phi read(x) |
-| UseUseExplosion.cs:24:2728:24:2733 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(this.Prop) |
-| UseUseExplosion.cs:24:2728:24:2733 | [input] SSA phi read(x) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:2717:24:2717 | access to local variable x | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:2728:24:2733 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:13:25:16 | access to property Prop |
| UseUseExplosion.cs:24:2728:24:2733 | [post] this access | UseUseExplosion.cs:25:13:25:16 | this access |
| UseUseExplosion.cs:24:2728:24:2733 | this access | UseUseExplosion.cs:25:13:25:16 | this access |
-| UseUseExplosion.cs:24:2732:24:2732 | access to local variable x | UseUseExplosion.cs:24:2728:24:2733 | [input] SSA phi read(x) |
-| UseUseExplosion.cs:24:2743:24:2748 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(this.Prop) |
-| UseUseExplosion.cs:24:2743:24:2748 | [input] SSA phi read(x) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:2732:24:2732 | access to local variable x | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:2743:24:2748 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:13:25:16 | access to property Prop |
| UseUseExplosion.cs:24:2743:24:2748 | [post] this access | UseUseExplosion.cs:25:13:25:16 | this access |
| UseUseExplosion.cs:24:2743:24:2748 | this access | UseUseExplosion.cs:25:13:25:16 | this access |
-| UseUseExplosion.cs:24:2747:24:2747 | access to local variable x | UseUseExplosion.cs:24:2743:24:2748 | [input] SSA phi read(x) |
-| UseUseExplosion.cs:24:2758:24:2763 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(this.Prop) |
-| UseUseExplosion.cs:24:2758:24:2763 | [input] SSA phi read(x) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:2747:24:2747 | access to local variable x | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:2758:24:2763 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:13:25:16 | access to property Prop |
| UseUseExplosion.cs:24:2758:24:2763 | [post] this access | UseUseExplosion.cs:25:13:25:16 | this access |
| UseUseExplosion.cs:24:2758:24:2763 | this access | UseUseExplosion.cs:25:13:25:16 | this access |
-| UseUseExplosion.cs:24:2762:24:2762 | access to local variable x | UseUseExplosion.cs:24:2758:24:2763 | [input] SSA phi read(x) |
-| UseUseExplosion.cs:24:2773:24:2778 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(this.Prop) |
-| UseUseExplosion.cs:24:2773:24:2778 | [input] SSA phi read(x) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:2762:24:2762 | access to local variable x | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:2773:24:2778 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:13:25:16 | access to property Prop |
| UseUseExplosion.cs:24:2773:24:2778 | [post] this access | UseUseExplosion.cs:25:13:25:16 | this access |
| UseUseExplosion.cs:24:2773:24:2778 | this access | UseUseExplosion.cs:25:13:25:16 | this access |
-| UseUseExplosion.cs:24:2777:24:2777 | access to local variable x | UseUseExplosion.cs:24:2773:24:2778 | [input] SSA phi read(x) |
-| UseUseExplosion.cs:24:2788:24:2793 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(this.Prop) |
-| UseUseExplosion.cs:24:2788:24:2793 | [input] SSA phi read(x) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:2777:24:2777 | access to local variable x | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:2788:24:2793 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:13:25:16 | access to property Prop |
| UseUseExplosion.cs:24:2788:24:2793 | [post] this access | UseUseExplosion.cs:25:13:25:16 | this access |
| UseUseExplosion.cs:24:2788:24:2793 | this access | UseUseExplosion.cs:25:13:25:16 | this access |
-| UseUseExplosion.cs:24:2792:24:2792 | access to local variable x | UseUseExplosion.cs:24:2788:24:2793 | [input] SSA phi read(x) |
-| UseUseExplosion.cs:24:2803:24:2808 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(this.Prop) |
-| UseUseExplosion.cs:24:2803:24:2808 | [input] SSA phi read(x) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:2792:24:2792 | access to local variable x | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:2803:24:2808 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:13:25:16 | access to property Prop |
| UseUseExplosion.cs:24:2803:24:2808 | [post] this access | UseUseExplosion.cs:25:13:25:16 | this access |
| UseUseExplosion.cs:24:2803:24:2808 | this access | UseUseExplosion.cs:25:13:25:16 | this access |
-| UseUseExplosion.cs:24:2807:24:2807 | access to local variable x | UseUseExplosion.cs:24:2803:24:2808 | [input] SSA phi read(x) |
-| UseUseExplosion.cs:24:2818:24:2823 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(this.Prop) |
-| UseUseExplosion.cs:24:2818:24:2823 | [input] SSA phi read(x) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:2807:24:2807 | access to local variable x | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:2818:24:2823 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:13:25:16 | access to property Prop |
| UseUseExplosion.cs:24:2818:24:2823 | [post] this access | UseUseExplosion.cs:25:13:25:16 | this access |
| UseUseExplosion.cs:24:2818:24:2823 | this access | UseUseExplosion.cs:25:13:25:16 | this access |
-| UseUseExplosion.cs:24:2822:24:2822 | access to local variable x | UseUseExplosion.cs:24:2818:24:2823 | [input] SSA phi read(x) |
-| UseUseExplosion.cs:24:2833:24:2838 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(this.Prop) |
-| UseUseExplosion.cs:24:2833:24:2838 | [input] SSA phi read(x) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:2822:24:2822 | access to local variable x | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:2833:24:2838 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:13:25:16 | access to property Prop |
| UseUseExplosion.cs:24:2833:24:2838 | [post] this access | UseUseExplosion.cs:25:13:25:16 | this access |
| UseUseExplosion.cs:24:2833:24:2838 | this access | UseUseExplosion.cs:25:13:25:16 | this access |
-| UseUseExplosion.cs:24:2837:24:2837 | access to local variable x | UseUseExplosion.cs:24:2833:24:2838 | [input] SSA phi read(x) |
-| UseUseExplosion.cs:24:2848:24:2853 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(this.Prop) |
-| UseUseExplosion.cs:24:2848:24:2853 | [input] SSA phi read(x) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:2837:24:2837 | access to local variable x | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:2848:24:2853 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:13:25:16 | access to property Prop |
| UseUseExplosion.cs:24:2848:24:2853 | [post] this access | UseUseExplosion.cs:25:13:25:16 | this access |
| UseUseExplosion.cs:24:2848:24:2853 | this access | UseUseExplosion.cs:25:13:25:16 | this access |
-| UseUseExplosion.cs:24:2852:24:2852 | access to local variable x | UseUseExplosion.cs:24:2848:24:2853 | [input] SSA phi read(x) |
-| UseUseExplosion.cs:24:2863:24:2868 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(this.Prop) |
-| UseUseExplosion.cs:24:2863:24:2868 | [input] SSA phi read(x) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:2852:24:2852 | access to local variable x | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:2863:24:2868 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:13:25:16 | access to property Prop |
| UseUseExplosion.cs:24:2863:24:2868 | [post] this access | UseUseExplosion.cs:25:13:25:16 | this access |
| UseUseExplosion.cs:24:2863:24:2868 | this access | UseUseExplosion.cs:25:13:25:16 | this access |
-| UseUseExplosion.cs:24:2867:24:2867 | access to local variable x | UseUseExplosion.cs:24:2863:24:2868 | [input] SSA phi read(x) |
-| UseUseExplosion.cs:24:2878:24:2883 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(this.Prop) |
-| UseUseExplosion.cs:24:2878:24:2883 | [input] SSA phi read(x) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:2867:24:2867 | access to local variable x | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:2878:24:2883 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:13:25:16 | access to property Prop |
| UseUseExplosion.cs:24:2878:24:2883 | [post] this access | UseUseExplosion.cs:25:13:25:16 | this access |
| UseUseExplosion.cs:24:2878:24:2883 | this access | UseUseExplosion.cs:25:13:25:16 | this access |
-| UseUseExplosion.cs:24:2882:24:2882 | access to local variable x | UseUseExplosion.cs:24:2878:24:2883 | [input] SSA phi read(x) |
-| UseUseExplosion.cs:24:2893:24:2898 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(this.Prop) |
-| UseUseExplosion.cs:24:2893:24:2898 | [input] SSA phi read(x) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:2882:24:2882 | access to local variable x | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:2893:24:2898 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:13:25:16 | access to property Prop |
| UseUseExplosion.cs:24:2893:24:2898 | [post] this access | UseUseExplosion.cs:25:13:25:16 | this access |
| UseUseExplosion.cs:24:2893:24:2898 | this access | UseUseExplosion.cs:25:13:25:16 | this access |
-| UseUseExplosion.cs:24:2897:24:2897 | access to local variable x | UseUseExplosion.cs:24:2893:24:2898 | [input] SSA phi read(x) |
-| UseUseExplosion.cs:24:2908:24:2913 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(this.Prop) |
-| UseUseExplosion.cs:24:2908:24:2913 | [input] SSA phi read(x) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:2897:24:2897 | access to local variable x | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:2908:24:2913 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:13:25:16 | access to property Prop |
| UseUseExplosion.cs:24:2908:24:2913 | [post] this access | UseUseExplosion.cs:25:13:25:16 | this access |
| UseUseExplosion.cs:24:2908:24:2913 | this access | UseUseExplosion.cs:25:13:25:16 | this access |
-| UseUseExplosion.cs:24:2912:24:2912 | access to local variable x | UseUseExplosion.cs:24:2908:24:2913 | [input] SSA phi read(x) |
-| UseUseExplosion.cs:24:2923:24:2928 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(this.Prop) |
-| UseUseExplosion.cs:24:2923:24:2928 | [input] SSA phi read(x) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:2912:24:2912 | access to local variable x | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:2923:24:2928 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:13:25:16 | access to property Prop |
| UseUseExplosion.cs:24:2923:24:2928 | [post] this access | UseUseExplosion.cs:25:13:25:16 | this access |
| UseUseExplosion.cs:24:2923:24:2928 | this access | UseUseExplosion.cs:25:13:25:16 | this access |
-| UseUseExplosion.cs:24:2927:24:2927 | access to local variable x | UseUseExplosion.cs:24:2923:24:2928 | [input] SSA phi read(x) |
-| UseUseExplosion.cs:24:2938:24:2943 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(this.Prop) |
-| UseUseExplosion.cs:24:2938:24:2943 | [input] SSA phi read(x) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:2927:24:2927 | access to local variable x | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:2938:24:2943 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:13:25:16 | access to property Prop |
| UseUseExplosion.cs:24:2938:24:2943 | [post] this access | UseUseExplosion.cs:25:13:25:16 | this access |
| UseUseExplosion.cs:24:2938:24:2943 | this access | UseUseExplosion.cs:25:13:25:16 | this access |
-| UseUseExplosion.cs:24:2942:24:2942 | access to local variable x | UseUseExplosion.cs:24:2938:24:2943 | [input] SSA phi read(x) |
-| UseUseExplosion.cs:24:2953:24:2958 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(this.Prop) |
-| UseUseExplosion.cs:24:2953:24:2958 | [input] SSA phi read(x) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:2942:24:2942 | access to local variable x | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:2953:24:2958 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:13:25:16 | access to property Prop |
| UseUseExplosion.cs:24:2953:24:2958 | [post] this access | UseUseExplosion.cs:25:13:25:16 | this access |
| UseUseExplosion.cs:24:2953:24:2958 | this access | UseUseExplosion.cs:25:13:25:16 | this access |
-| UseUseExplosion.cs:24:2957:24:2957 | access to local variable x | UseUseExplosion.cs:24:2953:24:2958 | [input] SSA phi read(x) |
-| UseUseExplosion.cs:24:2968:24:2973 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(this.Prop) |
-| UseUseExplosion.cs:24:2968:24:2973 | [input] SSA phi read(x) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:2957:24:2957 | access to local variable x | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:2968:24:2973 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:13:25:16 | access to property Prop |
| UseUseExplosion.cs:24:2968:24:2973 | [post] this access | UseUseExplosion.cs:25:13:25:16 | this access |
| UseUseExplosion.cs:24:2968:24:2973 | this access | UseUseExplosion.cs:25:13:25:16 | this access |
-| UseUseExplosion.cs:24:2972:24:2972 | access to local variable x | UseUseExplosion.cs:24:2968:24:2973 | [input] SSA phi read(x) |
-| UseUseExplosion.cs:24:2983:24:2988 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(this.Prop) |
-| UseUseExplosion.cs:24:2983:24:2988 | [input] SSA phi read(x) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:2972:24:2972 | access to local variable x | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:2983:24:2988 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:13:25:16 | access to property Prop |
| UseUseExplosion.cs:24:2983:24:2988 | [post] this access | UseUseExplosion.cs:25:13:25:16 | this access |
| UseUseExplosion.cs:24:2983:24:2988 | this access | UseUseExplosion.cs:25:13:25:16 | this access |
-| UseUseExplosion.cs:24:2987:24:2987 | access to local variable x | UseUseExplosion.cs:24:2983:24:2988 | [input] SSA phi read(x) |
-| UseUseExplosion.cs:24:2998:24:3003 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(this.Prop) |
-| UseUseExplosion.cs:24:2998:24:3003 | [input] SSA phi read(x) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:2987:24:2987 | access to local variable x | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:2998:24:3003 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:13:25:16 | access to property Prop |
| UseUseExplosion.cs:24:2998:24:3003 | [post] this access | UseUseExplosion.cs:25:13:25:16 | this access |
| UseUseExplosion.cs:24:2998:24:3003 | this access | UseUseExplosion.cs:25:13:25:16 | this access |
-| UseUseExplosion.cs:24:3002:24:3002 | access to local variable x | UseUseExplosion.cs:24:2998:24:3003 | [input] SSA phi read(x) |
-| UseUseExplosion.cs:24:3013:24:3018 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(this.Prop) |
-| UseUseExplosion.cs:24:3013:24:3018 | [input] SSA phi read(x) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:3002:24:3002 | access to local variable x | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:3013:24:3018 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:13:25:16 | access to property Prop |
| UseUseExplosion.cs:24:3013:24:3018 | [post] this access | UseUseExplosion.cs:25:13:25:16 | this access |
| UseUseExplosion.cs:24:3013:24:3018 | this access | UseUseExplosion.cs:25:13:25:16 | this access |
-| UseUseExplosion.cs:24:3017:24:3017 | access to local variable x | UseUseExplosion.cs:24:3013:24:3018 | [input] SSA phi read(x) |
-| UseUseExplosion.cs:24:3028:24:3033 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(this.Prop) |
-| UseUseExplosion.cs:24:3028:24:3033 | [input] SSA phi read(x) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:3017:24:3017 | access to local variable x | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:3028:24:3033 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:13:25:16 | access to property Prop |
| UseUseExplosion.cs:24:3028:24:3033 | [post] this access | UseUseExplosion.cs:25:13:25:16 | this access |
| UseUseExplosion.cs:24:3028:24:3033 | this access | UseUseExplosion.cs:25:13:25:16 | this access |
-| UseUseExplosion.cs:24:3032:24:3032 | access to local variable x | UseUseExplosion.cs:24:3028:24:3033 | [input] SSA phi read(x) |
-| UseUseExplosion.cs:24:3043:24:3048 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(this.Prop) |
-| UseUseExplosion.cs:24:3043:24:3048 | [input] SSA phi read(x) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:3032:24:3032 | access to local variable x | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:3043:24:3048 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:13:25:16 | access to property Prop |
| UseUseExplosion.cs:24:3043:24:3048 | [post] this access | UseUseExplosion.cs:25:13:25:16 | this access |
| UseUseExplosion.cs:24:3043:24:3048 | this access | UseUseExplosion.cs:25:13:25:16 | this access |
-| UseUseExplosion.cs:24:3047:24:3047 | access to local variable x | UseUseExplosion.cs:24:3043:24:3048 | [input] SSA phi read(x) |
-| UseUseExplosion.cs:24:3058:24:3063 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(this.Prop) |
-| UseUseExplosion.cs:24:3058:24:3063 | [input] SSA phi read(x) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:3047:24:3047 | access to local variable x | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:3058:24:3063 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:13:25:16 | access to property Prop |
| UseUseExplosion.cs:24:3058:24:3063 | [post] this access | UseUseExplosion.cs:25:13:25:16 | this access |
| UseUseExplosion.cs:24:3058:24:3063 | this access | UseUseExplosion.cs:25:13:25:16 | this access |
-| UseUseExplosion.cs:24:3062:24:3062 | access to local variable x | UseUseExplosion.cs:24:3058:24:3063 | [input] SSA phi read(x) |
-| UseUseExplosion.cs:24:3073:24:3078 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(this.Prop) |
-| UseUseExplosion.cs:24:3073:24:3078 | [input] SSA phi read(x) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:3062:24:3062 | access to local variable x | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:3073:24:3078 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:13:25:16 | access to property Prop |
| UseUseExplosion.cs:24:3073:24:3078 | [post] this access | UseUseExplosion.cs:25:13:25:16 | this access |
| UseUseExplosion.cs:24:3073:24:3078 | this access | UseUseExplosion.cs:25:13:25:16 | this access |
-| UseUseExplosion.cs:24:3077:24:3077 | access to local variable x | UseUseExplosion.cs:24:3073:24:3078 | [input] SSA phi read(x) |
-| UseUseExplosion.cs:24:3088:24:3093 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(this.Prop) |
-| UseUseExplosion.cs:24:3088:24:3093 | [input] SSA phi read(x) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:3077:24:3077 | access to local variable x | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:3088:24:3093 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:13:25:16 | access to property Prop |
| UseUseExplosion.cs:24:3088:24:3093 | [post] this access | UseUseExplosion.cs:25:13:25:16 | this access |
| UseUseExplosion.cs:24:3088:24:3093 | this access | UseUseExplosion.cs:25:13:25:16 | this access |
-| UseUseExplosion.cs:24:3092:24:3092 | access to local variable x | UseUseExplosion.cs:24:3088:24:3093 | [input] SSA phi read(x) |
-| UseUseExplosion.cs:24:3103:24:3108 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(this.Prop) |
-| UseUseExplosion.cs:24:3103:24:3108 | [input] SSA phi read(x) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:3092:24:3092 | access to local variable x | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:3103:24:3108 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:13:25:16 | access to property Prop |
| UseUseExplosion.cs:24:3103:24:3108 | [post] this access | UseUseExplosion.cs:25:13:25:16 | this access |
| UseUseExplosion.cs:24:3103:24:3108 | this access | UseUseExplosion.cs:25:13:25:16 | this access |
-| UseUseExplosion.cs:24:3107:24:3107 | access to local variable x | UseUseExplosion.cs:24:3103:24:3108 | [input] SSA phi read(x) |
-| UseUseExplosion.cs:24:3118:24:3123 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(this.Prop) |
-| UseUseExplosion.cs:24:3118:24:3123 | [input] SSA phi read(x) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:3107:24:3107 | access to local variable x | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:3118:24:3123 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:13:25:16 | access to property Prop |
| UseUseExplosion.cs:24:3118:24:3123 | [post] this access | UseUseExplosion.cs:25:13:25:16 | this access |
| UseUseExplosion.cs:24:3118:24:3123 | this access | UseUseExplosion.cs:25:13:25:16 | this access |
-| UseUseExplosion.cs:24:3122:24:3122 | access to local variable x | UseUseExplosion.cs:24:3118:24:3123 | [input] SSA phi read(x) |
-| UseUseExplosion.cs:24:3133:24:3138 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(this.Prop) |
-| UseUseExplosion.cs:24:3133:24:3138 | [input] SSA phi read(x) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:3122:24:3122 | access to local variable x | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:3133:24:3138 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:13:25:16 | access to property Prop |
| UseUseExplosion.cs:24:3133:24:3138 | [post] this access | UseUseExplosion.cs:25:13:25:16 | this access |
| UseUseExplosion.cs:24:3133:24:3138 | this access | UseUseExplosion.cs:25:13:25:16 | this access |
-| UseUseExplosion.cs:24:3137:24:3137 | access to local variable x | UseUseExplosion.cs:24:3133:24:3138 | [input] SSA phi read(x) |
-| UseUseExplosion.cs:24:3148:24:3153 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(this.Prop) |
-| UseUseExplosion.cs:24:3148:24:3153 | [input] SSA phi read(x) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:3137:24:3137 | access to local variable x | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:3148:24:3153 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:13:25:16 | access to property Prop |
| UseUseExplosion.cs:24:3148:24:3153 | [post] this access | UseUseExplosion.cs:25:13:25:16 | this access |
| UseUseExplosion.cs:24:3148:24:3153 | this access | UseUseExplosion.cs:25:13:25:16 | this access |
-| UseUseExplosion.cs:24:3152:24:3152 | access to local variable x | UseUseExplosion.cs:24:3148:24:3153 | [input] SSA phi read(x) |
-| UseUseExplosion.cs:24:3163:24:3168 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(this.Prop) |
-| UseUseExplosion.cs:24:3163:24:3168 | [input] SSA phi read(x) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:3152:24:3152 | access to local variable x | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:3163:24:3168 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:13:25:16 | access to property Prop |
| UseUseExplosion.cs:24:3163:24:3168 | [post] this access | UseUseExplosion.cs:25:13:25:16 | this access |
| UseUseExplosion.cs:24:3163:24:3168 | this access | UseUseExplosion.cs:25:13:25:16 | this access |
-| UseUseExplosion.cs:24:3167:24:3167 | access to local variable x | UseUseExplosion.cs:24:3163:24:3168 | [input] SSA phi read(x) |
-| UseUseExplosion.cs:24:3178:24:3183 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(this.Prop) |
-| UseUseExplosion.cs:24:3178:24:3183 | [input] SSA phi read(x) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:3167:24:3167 | access to local variable x | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:3178:24:3183 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:13:25:16 | access to property Prop |
| UseUseExplosion.cs:24:3178:24:3183 | [post] this access | UseUseExplosion.cs:25:13:25:16 | this access |
| UseUseExplosion.cs:24:3178:24:3183 | this access | UseUseExplosion.cs:25:13:25:16 | this access |
-| UseUseExplosion.cs:24:3182:24:3182 | access to local variable x | UseUseExplosion.cs:24:3178:24:3183 | [input] SSA phi read(x) |
-| UseUseExplosion.cs:24:3193:24:3198 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(this.Prop) |
-| UseUseExplosion.cs:24:3193:24:3198 | [input] SSA phi read(x) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:3182:24:3182 | access to local variable x | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:3193:24:3198 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:13:25:16 | access to property Prop |
| UseUseExplosion.cs:24:3193:24:3198 | [post] this access | UseUseExplosion.cs:25:13:25:16 | this access |
| UseUseExplosion.cs:24:3193:24:3198 | this access | UseUseExplosion.cs:25:13:25:16 | this access |
-| UseUseExplosion.cs:24:3197:24:3197 | access to local variable x | UseUseExplosion.cs:24:3193:24:3198 | [input] SSA phi read(x) |
-| UseUseExplosion.cs:25:9:25:3199 | SSA phi read(this.Prop) | UseUseExplosion.cs:25:13:25:16 | access to property Prop |
+| UseUseExplosion.cs:24:3197:24:3197 | access to local variable x | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
| UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) | UseUseExplosion.cs:25:1712:25:1712 | access to local variable x |
| UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) | UseUseExplosion.cs:25:1727:25:1727 | access to local variable x |
| UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) | UseUseExplosion.cs:25:1742:25:1742 | access to local variable x |
diff --git a/csharp/ql/test/library-tests/dataflow/local/TaintTrackingStep.expected b/csharp/ql/test/library-tests/dataflow/local/TaintTrackingStep.expected
index ea0ae7f9da7..48bf36691e0 100644
--- a/csharp/ql/test/library-tests/dataflow/local/TaintTrackingStep.expected
+++ b/csharp/ql/test/library-tests/dataflow/local/TaintTrackingStep.expected
@@ -80,11 +80,10 @@
| LocalDataFlow.cs:88:9:88:16 | access to local variable nonSink0 | LocalDataFlow.cs:88:9:88:36 | SSA def(nonSink0) |
| LocalDataFlow.cs:88:9:88:36 | SSA def(nonSink0) | LocalDataFlow.cs:89:15:89:22 | access to local variable nonSink0 |
| LocalDataFlow.cs:88:20:88:36 | ... ? ... : ... | LocalDataFlow.cs:88:9:88:16 | access to local variable nonSink0 |
-| LocalDataFlow.cs:88:20:88:36 | SSA phi(sink7) | LocalDataFlow.cs:92:29:92:33 | access to local variable sink7 |
| LocalDataFlow.cs:88:24:88:28 | "abc" | LocalDataFlow.cs:88:20:88:36 | ... ? ... : ... |
-| LocalDataFlow.cs:88:24:88:28 | [input] SSA phi(sink7) | LocalDataFlow.cs:88:20:88:36 | SSA phi(sink7) |
+| LocalDataFlow.cs:88:24:88:28 | [input] SSA phi(sink7) | LocalDataFlow.cs:92:29:92:33 | access to local variable sink7 |
| LocalDataFlow.cs:88:32:88:36 | "def" | LocalDataFlow.cs:88:20:88:36 | ... ? ... : ... |
-| LocalDataFlow.cs:88:32:88:36 | [input] SSA phi(sink7) | LocalDataFlow.cs:88:20:88:36 | SSA phi(sink7) |
+| LocalDataFlow.cs:88:32:88:36 | [input] SSA phi(sink7) | LocalDataFlow.cs:92:29:92:33 | access to local variable sink7 |
| LocalDataFlow.cs:89:15:89:22 | [post] access to local variable nonSink0 | LocalDataFlow.cs:96:32:96:39 | access to local variable nonSink0 |
| LocalDataFlow.cs:89:15:89:22 | access to local variable nonSink0 | LocalDataFlow.cs:96:32:96:39 | access to local variable nonSink0 |
| LocalDataFlow.cs:92:13:92:17 | access to local variable sink8 | LocalDataFlow.cs:92:13:92:33 | SSA def(sink8) |
@@ -589,14 +588,12 @@
| LocalDataFlow.cs:307:18:307:33 | String nonSink17 | LocalDataFlow.cs:307:18:307:33 | SSA def(nonSink17) |
| LocalDataFlow.cs:313:13:313:18 | access to local variable sink73 | LocalDataFlow.cs:313:13:313:38 | SSA def(sink73) |
| LocalDataFlow.cs:313:13:313:38 | SSA def(sink73) | LocalDataFlow.cs:315:15:315:20 | access to local variable sink73 |
-| LocalDataFlow.cs:313:22:313:29 | [input] SSA phi read(sink0) | LocalDataFlow.cs:313:22:313:38 | SSA phi read(sink0) |
+| LocalDataFlow.cs:313:22:313:29 | [input] SSA phi read(sink0) | LocalDataFlow.cs:314:22:314:26 | access to local variable sink0 |
| LocalDataFlow.cs:313:22:313:29 | access to local variable nonSink0 | LocalDataFlow.cs:313:22:313:38 | ... ?? ... |
| LocalDataFlow.cs:313:22:313:29 | access to local variable nonSink0 | LocalDataFlow.cs:314:31:314:38 | access to local variable nonSink0 |
| LocalDataFlow.cs:313:22:313:38 | ... ?? ... | LocalDataFlow.cs:313:13:313:18 | access to local variable sink73 |
-| LocalDataFlow.cs:313:22:313:38 | SSA phi read(sink0) | LocalDataFlow.cs:314:22:314:26 | access to local variable sink0 |
-| LocalDataFlow.cs:313:34:313:38 | [input] SSA phi read(sink0) | LocalDataFlow.cs:313:22:313:38 | SSA phi read(sink0) |
| LocalDataFlow.cs:313:34:313:38 | access to local variable sink0 | LocalDataFlow.cs:313:22:313:38 | ... ?? ... |
-| LocalDataFlow.cs:313:34:313:38 | access to local variable sink0 | LocalDataFlow.cs:313:34:313:38 | [input] SSA phi read(sink0) |
+| LocalDataFlow.cs:313:34:313:38 | access to local variable sink0 | LocalDataFlow.cs:314:22:314:26 | access to local variable sink0 |
| LocalDataFlow.cs:314:13:314:18 | access to local variable sink74 | LocalDataFlow.cs:314:13:314:38 | SSA def(sink74) |
| LocalDataFlow.cs:314:13:314:38 | SSA def(sink74) | LocalDataFlow.cs:316:15:316:20 | access to local variable sink74 |
| LocalDataFlow.cs:314:22:314:26 | access to local variable sink0 | LocalDataFlow.cs:314:22:314:38 | ... ?? ... |
@@ -636,12 +633,10 @@
| LocalDataFlow.cs:373:13:373:25 | SSA def(x) | LocalDataFlow.cs:374:17:374:18 | [input] SSA phi(x) |
| LocalDataFlow.cs:373:13:373:25 | SSA def(x) | LocalDataFlow.cs:376:35:376:35 | access to local variable x |
| LocalDataFlow.cs:373:17:373:25 | "tainted" | LocalDataFlow.cs:373:13:373:13 | access to local variable x |
-| LocalDataFlow.cs:374:17:374:18 | [input] SSA phi(x) | LocalDataFlow.cs:382:9:382:17 | SSA phi(x) |
+| LocalDataFlow.cs:374:17:374:18 | [input] SSA phi(x) | LocalDataFlow.cs:382:15:382:15 | access to local variable x |
| LocalDataFlow.cs:381:13:381:13 | access to local variable x | LocalDataFlow.cs:381:13:381:29 | SSA def(x) |
-| LocalDataFlow.cs:381:13:381:29 | SSA def(x) | LocalDataFlow.cs:381:13:381:29 | [input] SSA phi(x) |
-| LocalDataFlow.cs:381:13:381:29 | [input] SSA phi(x) | LocalDataFlow.cs:382:9:382:17 | SSA phi(x) |
+| LocalDataFlow.cs:381:13:381:29 | SSA def(x) | LocalDataFlow.cs:382:15:382:15 | access to local variable x |
| LocalDataFlow.cs:381:17:381:29 | "not tainted" | LocalDataFlow.cs:381:13:381:13 | access to local variable x |
-| LocalDataFlow.cs:382:9:382:17 | SSA phi(x) | LocalDataFlow.cs:382:15:382:15 | access to local variable x |
| SSA.cs:5:17:5:17 | SSA entry def(this.S) | SSA.cs:67:9:67:14 | access to field S |
| SSA.cs:5:17:5:17 | this | SSA.cs:67:9:67:12 | this access |
| SSA.cs:5:26:5:32 | SSA param(tainted) | SSA.cs:8:24:8:30 | access to parameter tainted |
@@ -669,50 +664,41 @@
| SSA.cs:19:13:19:20 | access to local variable nonSink0 | SSA.cs:29:13:29:33 | [input] SSA phi read(nonSink0) |
| SSA.cs:19:13:19:20 | access to local variable nonSink0 | SSA.cs:30:24:30:31 | access to local variable nonSink0 |
| SSA.cs:22:16:22:23 | access to local variable ssaSink1 | SSA.cs:22:16:22:28 | SSA def(ssaSink1) |
-| SSA.cs:22:16:22:28 | SSA def(ssaSink1) | SSA.cs:23:13:23:33 | [input] SSA phi(ssaSink1) |
+| SSA.cs:22:16:22:28 | SSA def(ssaSink1) | SSA.cs:25:15:25:22 | access to local variable ssaSink1 |
| SSA.cs:22:27:22:28 | "" | SSA.cs:22:16:22:23 | access to local variable ssaSink1 |
| SSA.cs:23:13:23:22 | [post] access to parameter nonTainted | SSA.cs:29:13:29:22 | access to parameter nonTainted |
| SSA.cs:23:13:23:22 | access to parameter nonTainted | SSA.cs:29:13:29:22 | access to parameter nonTainted |
| SSA.cs:23:13:23:29 | access to property Length | SSA.cs:23:13:23:33 | ... > ... |
| SSA.cs:23:13:23:33 | [input] SSA phi read(ssaSink0) | SSA.cs:25:9:25:24 | SSA phi read(ssaSink0) |
-| SSA.cs:23:13:23:33 | [input] SSA phi(ssaSink1) | SSA.cs:25:9:25:24 | SSA phi(ssaSink1) |
| SSA.cs:24:13:24:20 | access to local variable ssaSink1 | SSA.cs:24:13:24:31 | SSA def(ssaSink1) |
-| SSA.cs:24:13:24:31 | SSA def(ssaSink1) | SSA.cs:24:13:24:31 | [input] SSA phi(ssaSink1) |
-| SSA.cs:24:13:24:31 | [input] SSA phi read(ssaSink0) | SSA.cs:25:9:25:24 | SSA phi read(ssaSink0) |
-| SSA.cs:24:13:24:31 | [input] SSA phi(ssaSink1) | SSA.cs:25:9:25:24 | SSA phi(ssaSink1) |
+| SSA.cs:24:13:24:31 | SSA def(ssaSink1) | SSA.cs:25:15:25:22 | access to local variable ssaSink1 |
| SSA.cs:24:24:24:31 | access to local variable ssaSink0 | SSA.cs:24:13:24:20 | access to local variable ssaSink1 |
-| SSA.cs:24:24:24:31 | access to local variable ssaSink0 | SSA.cs:24:13:24:31 | [input] SSA phi read(ssaSink0) |
+| SSA.cs:24:24:24:31 | access to local variable ssaSink0 | SSA.cs:25:9:25:24 | SSA phi read(ssaSink0) |
| SSA.cs:25:9:25:24 | SSA phi read(ssaSink0) | SSA.cs:35:13:35:33 | [input] SSA phi read(ssaSink0) |
| SSA.cs:25:9:25:24 | SSA phi read(ssaSink0) | SSA.cs:37:24:37:31 | access to local variable ssaSink0 |
-| SSA.cs:25:9:25:24 | SSA phi(ssaSink1) | SSA.cs:25:15:25:22 | access to local variable ssaSink1 |
| SSA.cs:28:16:28:23 | access to local variable nonSink1 | SSA.cs:28:16:28:28 | SSA def(nonSink1) |
-| SSA.cs:28:16:28:28 | SSA def(nonSink1) | SSA.cs:29:13:29:33 | [input] SSA phi(nonSink1) |
+| SSA.cs:28:16:28:28 | SSA def(nonSink1) | SSA.cs:31:15:31:22 | access to local variable nonSink1 |
| SSA.cs:28:27:28:28 | "" | SSA.cs:28:16:28:23 | access to local variable nonSink1 |
| SSA.cs:29:13:29:22 | [post] access to parameter nonTainted | SSA.cs:35:13:35:22 | access to parameter nonTainted |
| SSA.cs:29:13:29:22 | access to parameter nonTainted | SSA.cs:35:13:35:22 | access to parameter nonTainted |
| SSA.cs:29:13:29:29 | access to property Length | SSA.cs:29:13:29:33 | ... > ... |
| SSA.cs:29:13:29:33 | [input] SSA phi read(nonSink0) | SSA.cs:31:9:31:24 | SSA phi read(nonSink0) |
-| SSA.cs:29:13:29:33 | [input] SSA phi(nonSink1) | SSA.cs:31:9:31:24 | SSA phi(nonSink1) |
| SSA.cs:30:13:30:20 | access to local variable nonSink1 | SSA.cs:30:13:30:31 | SSA def(nonSink1) |
-| SSA.cs:30:13:30:31 | SSA def(nonSink1) | SSA.cs:30:13:30:31 | [input] SSA phi(nonSink1) |
-| SSA.cs:30:13:30:31 | [input] SSA phi read(nonSink0) | SSA.cs:31:9:31:24 | SSA phi read(nonSink0) |
-| SSA.cs:30:13:30:31 | [input] SSA phi(nonSink1) | SSA.cs:31:9:31:24 | SSA phi(nonSink1) |
+| SSA.cs:30:13:30:31 | SSA def(nonSink1) | SSA.cs:31:15:31:22 | access to local variable nonSink1 |
| SSA.cs:30:24:30:31 | access to local variable nonSink0 | SSA.cs:30:13:30:20 | access to local variable nonSink1 |
-| SSA.cs:30:24:30:31 | access to local variable nonSink0 | SSA.cs:30:13:30:31 | [input] SSA phi read(nonSink0) |
+| SSA.cs:30:24:30:31 | access to local variable nonSink0 | SSA.cs:31:9:31:24 | SSA phi read(nonSink0) |
| SSA.cs:31:9:31:24 | SSA phi read(nonSink0) | SSA.cs:47:13:47:33 | [input] SSA phi read(nonSink0) |
| SSA.cs:31:9:31:24 | SSA phi read(nonSink0) | SSA.cs:49:24:49:31 | access to local variable nonSink0 |
-| SSA.cs:31:9:31:24 | SSA phi(nonSink1) | SSA.cs:31:15:31:22 | access to local variable nonSink1 |
| SSA.cs:34:16:34:23 | access to local variable ssaSink2 | SSA.cs:34:16:34:28 | SSA def(ssaSink2) |
-| SSA.cs:34:16:34:28 | SSA def(ssaSink2) | SSA.cs:35:13:35:33 | [input] SSA phi(ssaSink2) |
+| SSA.cs:34:16:34:28 | SSA def(ssaSink2) | SSA.cs:43:15:43:22 | access to local variable ssaSink2 |
| SSA.cs:34:27:34:28 | "" | SSA.cs:34:16:34:23 | access to local variable ssaSink2 |
| SSA.cs:35:13:35:22 | [post] access to parameter nonTainted | SSA.cs:35:13:35:33 | [input] SSA phi read(nonTainted) |
| SSA.cs:35:13:35:22 | [post] access to parameter nonTainted | SSA.cs:38:17:38:26 | access to parameter nonTainted |
| SSA.cs:35:13:35:22 | access to parameter nonTainted | SSA.cs:35:13:35:33 | [input] SSA phi read(nonTainted) |
| SSA.cs:35:13:35:22 | access to parameter nonTainted | SSA.cs:38:17:38:26 | access to parameter nonTainted |
| SSA.cs:35:13:35:29 | access to property Length | SSA.cs:35:13:35:33 | ... > ... |
-| SSA.cs:35:13:35:33 | [input] SSA phi read(nonTainted) | SSA.cs:43:9:43:24 | SSA phi read(nonTainted) |
+| SSA.cs:35:13:35:33 | [input] SSA phi read(nonTainted) | SSA.cs:47:13:47:22 | access to parameter nonTainted |
| SSA.cs:35:13:35:33 | [input] SSA phi read(ssaSink0) | SSA.cs:43:9:43:24 | SSA phi read(ssaSink0) |
-| SSA.cs:35:13:35:33 | [input] SSA phi(ssaSink2) | SSA.cs:43:9:43:24 | SSA phi(ssaSink2) |
| SSA.cs:37:13:37:20 | access to local variable ssaSink2 | SSA.cs:37:13:37:31 | SSA def(ssaSink2) |
| SSA.cs:37:13:37:31 | SSA def(ssaSink2) | SSA.cs:39:21:39:28 | access to local variable ssaSink2 |
| SSA.cs:37:13:37:31 | SSA def(ssaSink2) | SSA.cs:41:21:41:28 | access to local variable ssaSink2 |
@@ -724,31 +710,26 @@
| SSA.cs:38:17:38:26 | access to parameter nonTainted | SSA.cs:39:17:39:29 | [input] SSA phi read(nonTainted) |
| SSA.cs:38:17:38:26 | access to parameter nonTainted | SSA.cs:41:17:41:29 | [input] SSA phi read(nonTainted) |
| SSA.cs:38:17:38:33 | access to property Length | SSA.cs:38:17:38:37 | ... > ... |
-| SSA.cs:39:17:39:29 | [input] SSA phi read(nonTainted) | SSA.cs:43:9:43:24 | SSA phi read(nonTainted) |
+| SSA.cs:39:17:39:29 | [input] SSA phi read(nonTainted) | SSA.cs:47:13:47:22 | access to parameter nonTainted |
| SSA.cs:39:17:39:29 | [input] SSA phi read(ssaSink0) | SSA.cs:43:9:43:24 | SSA phi read(ssaSink0) |
-| SSA.cs:39:17:39:29 | [input] SSA phi(ssaSink2) | SSA.cs:43:9:43:24 | SSA phi(ssaSink2) |
-| SSA.cs:39:21:39:28 | [post] access to local variable ssaSink2 | SSA.cs:39:17:39:29 | [input] SSA phi(ssaSink2) |
-| SSA.cs:39:21:39:28 | access to local variable ssaSink2 | SSA.cs:39:17:39:29 | [input] SSA phi(ssaSink2) |
-| SSA.cs:41:17:41:29 | [input] SSA phi read(nonTainted) | SSA.cs:43:9:43:24 | SSA phi read(nonTainted) |
+| SSA.cs:39:21:39:28 | [post] access to local variable ssaSink2 | SSA.cs:43:15:43:22 | access to local variable ssaSink2 |
+| SSA.cs:39:21:39:28 | access to local variable ssaSink2 | SSA.cs:43:15:43:22 | access to local variable ssaSink2 |
+| SSA.cs:41:17:41:29 | [input] SSA phi read(nonTainted) | SSA.cs:47:13:47:22 | access to parameter nonTainted |
| SSA.cs:41:17:41:29 | [input] SSA phi read(ssaSink0) | SSA.cs:43:9:43:24 | SSA phi read(ssaSink0) |
-| SSA.cs:41:17:41:29 | [input] SSA phi(ssaSink2) | SSA.cs:43:9:43:24 | SSA phi(ssaSink2) |
-| SSA.cs:41:21:41:28 | [post] access to local variable ssaSink2 | SSA.cs:41:17:41:29 | [input] SSA phi(ssaSink2) |
-| SSA.cs:41:21:41:28 | access to local variable ssaSink2 | SSA.cs:41:17:41:29 | [input] SSA phi(ssaSink2) |
-| SSA.cs:43:9:43:24 | SSA phi read(nonTainted) | SSA.cs:47:13:47:22 | access to parameter nonTainted |
+| SSA.cs:41:21:41:28 | [post] access to local variable ssaSink2 | SSA.cs:43:15:43:22 | access to local variable ssaSink2 |
+| SSA.cs:41:21:41:28 | access to local variable ssaSink2 | SSA.cs:43:15:43:22 | access to local variable ssaSink2 |
| SSA.cs:43:9:43:24 | SSA phi read(ssaSink0) | SSA.cs:89:13:89:33 | [input] SSA phi read(ssaSink0) |
| SSA.cs:43:9:43:24 | SSA phi read(ssaSink0) | SSA.cs:91:24:91:31 | access to local variable ssaSink0 |
-| SSA.cs:43:9:43:24 | SSA phi(ssaSink2) | SSA.cs:43:15:43:22 | access to local variable ssaSink2 |
| SSA.cs:46:16:46:23 | access to local variable nonSink2 | SSA.cs:46:16:46:28 | SSA def(nonSink2) |
-| SSA.cs:46:16:46:28 | SSA def(nonSink2) | SSA.cs:47:13:47:33 | [input] SSA phi(nonSink2) |
+| SSA.cs:46:16:46:28 | SSA def(nonSink2) | SSA.cs:55:15:55:22 | access to local variable nonSink2 |
| SSA.cs:46:27:46:28 | "" | SSA.cs:46:16:46:23 | access to local variable nonSink2 |
| SSA.cs:47:13:47:22 | [post] access to parameter nonTainted | SSA.cs:47:13:47:33 | [input] SSA phi read(nonTainted) |
| SSA.cs:47:13:47:22 | [post] access to parameter nonTainted | SSA.cs:50:17:50:26 | access to parameter nonTainted |
| SSA.cs:47:13:47:22 | access to parameter nonTainted | SSA.cs:47:13:47:33 | [input] SSA phi read(nonTainted) |
| SSA.cs:47:13:47:22 | access to parameter nonTainted | SSA.cs:50:17:50:26 | access to parameter nonTainted |
| SSA.cs:47:13:47:29 | access to property Length | SSA.cs:47:13:47:33 | ... > ... |
-| SSA.cs:47:13:47:33 | [input] SSA phi read(nonSink0) | SSA.cs:55:9:55:24 | SSA phi read(nonSink0) |
-| SSA.cs:47:13:47:33 | [input] SSA phi read(nonTainted) | SSA.cs:55:9:55:24 | SSA phi read(nonTainted) |
-| SSA.cs:47:13:47:33 | [input] SSA phi(nonSink2) | SSA.cs:55:9:55:24 | SSA phi(nonSink2) |
+| SSA.cs:47:13:47:33 | [input] SSA phi read(nonSink0) | SSA.cs:63:23:63:30 | access to local variable nonSink0 |
+| SSA.cs:47:13:47:33 | [input] SSA phi read(nonTainted) | SSA.cs:89:13:89:22 | access to parameter nonTainted |
| SSA.cs:49:13:49:20 | access to local variable nonSink2 | SSA.cs:49:13:49:31 | SSA def(nonSink2) |
| SSA.cs:49:13:49:31 | SSA def(nonSink2) | SSA.cs:51:21:51:28 | access to local variable nonSink2 |
| SSA.cs:49:13:49:31 | SSA def(nonSink2) | SSA.cs:53:21:53:28 | access to local variable nonSink2 |
@@ -760,19 +741,14 @@
| SSA.cs:50:17:50:26 | access to parameter nonTainted | SSA.cs:51:17:51:29 | [input] SSA phi read(nonTainted) |
| SSA.cs:50:17:50:26 | access to parameter nonTainted | SSA.cs:53:17:53:29 | [input] SSA phi read(nonTainted) |
| SSA.cs:50:17:50:33 | access to property Length | SSA.cs:50:17:50:37 | ... > ... |
-| SSA.cs:51:17:51:29 | [input] SSA phi read(nonSink0) | SSA.cs:55:9:55:24 | SSA phi read(nonSink0) |
-| SSA.cs:51:17:51:29 | [input] SSA phi read(nonTainted) | SSA.cs:55:9:55:24 | SSA phi read(nonTainted) |
-| SSA.cs:51:17:51:29 | [input] SSA phi(nonSink2) | SSA.cs:55:9:55:24 | SSA phi(nonSink2) |
-| SSA.cs:51:21:51:28 | [post] access to local variable nonSink2 | SSA.cs:51:17:51:29 | [input] SSA phi(nonSink2) |
-| SSA.cs:51:21:51:28 | access to local variable nonSink2 | SSA.cs:51:17:51:29 | [input] SSA phi(nonSink2) |
-| SSA.cs:53:17:53:29 | [input] SSA phi read(nonSink0) | SSA.cs:55:9:55:24 | SSA phi read(nonSink0) |
-| SSA.cs:53:17:53:29 | [input] SSA phi read(nonTainted) | SSA.cs:55:9:55:24 | SSA phi read(nonTainted) |
-| SSA.cs:53:17:53:29 | [input] SSA phi(nonSink2) | SSA.cs:55:9:55:24 | SSA phi(nonSink2) |
-| SSA.cs:53:21:53:28 | [post] access to local variable nonSink2 | SSA.cs:53:17:53:29 | [input] SSA phi(nonSink2) |
-| SSA.cs:53:21:53:28 | access to local variable nonSink2 | SSA.cs:53:17:53:29 | [input] SSA phi(nonSink2) |
-| SSA.cs:55:9:55:24 | SSA phi read(nonSink0) | SSA.cs:63:23:63:30 | access to local variable nonSink0 |
-| SSA.cs:55:9:55:24 | SSA phi read(nonTainted) | SSA.cs:89:13:89:22 | access to parameter nonTainted |
-| SSA.cs:55:9:55:24 | SSA phi(nonSink2) | SSA.cs:55:15:55:22 | access to local variable nonSink2 |
+| SSA.cs:51:17:51:29 | [input] SSA phi read(nonSink0) | SSA.cs:63:23:63:30 | access to local variable nonSink0 |
+| SSA.cs:51:17:51:29 | [input] SSA phi read(nonTainted) | SSA.cs:89:13:89:22 | access to parameter nonTainted |
+| SSA.cs:51:21:51:28 | [post] access to local variable nonSink2 | SSA.cs:55:15:55:22 | access to local variable nonSink2 |
+| SSA.cs:51:21:51:28 | access to local variable nonSink2 | SSA.cs:55:15:55:22 | access to local variable nonSink2 |
+| SSA.cs:53:17:53:29 | [input] SSA phi read(nonSink0) | SSA.cs:63:23:63:30 | access to local variable nonSink0 |
+| SSA.cs:53:17:53:29 | [input] SSA phi read(nonTainted) | SSA.cs:89:13:89:22 | access to parameter nonTainted |
+| SSA.cs:53:21:53:28 | [post] access to local variable nonSink2 | SSA.cs:55:15:55:22 | access to local variable nonSink2 |
+| SSA.cs:53:21:53:28 | access to local variable nonSink2 | SSA.cs:55:15:55:22 | access to local variable nonSink2 |
| SSA.cs:58:16:58:23 | access to local variable ssaSink3 | SSA.cs:58:16:58:33 | SSA def(ssaSink3) |
| SSA.cs:58:16:58:33 | SSA def(ssaSink3) | SSA.cs:59:23:59:30 | access to local variable ssaSink3 |
| SSA.cs:58:27:58:33 | access to parameter tainted | SSA.cs:58:16:58:23 | access to local variable ssaSink3 |
@@ -860,16 +836,15 @@
| SSA.cs:85:15:85:20 | [post] access to field S | SSA.cs:114:9:114:14 | access to field S |
| SSA.cs:85:15:85:20 | access to field S | SSA.cs:114:9:114:14 | access to field S |
| SSA.cs:88:16:88:23 | access to local variable ssaSink4 | SSA.cs:88:16:88:28 | SSA def(ssaSink4) |
-| SSA.cs:88:16:88:28 | SSA def(ssaSink4) | SSA.cs:89:13:89:33 | [input] SSA phi(ssaSink4) |
+| SSA.cs:88:16:88:28 | SSA def(ssaSink4) | SSA.cs:97:23:97:30 | access to local variable ssaSink4 |
| SSA.cs:88:27:88:28 | "" | SSA.cs:88:16:88:23 | access to local variable ssaSink4 |
| SSA.cs:89:13:89:22 | [post] access to parameter nonTainted | SSA.cs:89:13:89:33 | [input] SSA phi read(nonTainted) |
| SSA.cs:89:13:89:22 | [post] access to parameter nonTainted | SSA.cs:92:17:92:26 | access to parameter nonTainted |
| SSA.cs:89:13:89:22 | access to parameter nonTainted | SSA.cs:89:13:89:33 | [input] SSA phi read(nonTainted) |
| SSA.cs:89:13:89:22 | access to parameter nonTainted | SSA.cs:92:17:92:26 | access to parameter nonTainted |
| SSA.cs:89:13:89:29 | access to property Length | SSA.cs:89:13:89:33 | ... > ... |
-| SSA.cs:89:13:89:33 | [input] SSA phi read(nonTainted) | SSA.cs:97:9:97:32 | SSA phi read(nonTainted) |
-| SSA.cs:89:13:89:33 | [input] SSA phi read(ssaSink0) | SSA.cs:97:9:97:32 | SSA phi read(ssaSink0) |
-| SSA.cs:89:13:89:33 | [input] SSA phi(ssaSink4) | SSA.cs:97:9:97:32 | SSA phi(ssaSink4) |
+| SSA.cs:89:13:89:33 | [input] SSA phi read(nonTainted) | SSA.cs:102:13:102:22 | access to parameter nonTainted |
+| SSA.cs:89:13:89:33 | [input] SSA phi read(ssaSink0) | SSA.cs:117:36:117:43 | access to local variable ssaSink0 |
| SSA.cs:91:13:91:20 | access to local variable ssaSink4 | SSA.cs:91:13:91:31 | SSA def(ssaSink4) |
| SSA.cs:91:13:91:31 | SSA def(ssaSink4) | SSA.cs:93:21:93:28 | access to local variable ssaSink4 |
| SSA.cs:91:13:91:31 | SSA def(ssaSink4) | SSA.cs:95:21:95:28 | access to local variable ssaSink4 |
@@ -881,34 +856,28 @@
| SSA.cs:92:17:92:26 | access to parameter nonTainted | SSA.cs:93:17:93:29 | [input] SSA phi read(nonTainted) |
| SSA.cs:92:17:92:26 | access to parameter nonTainted | SSA.cs:95:17:95:29 | [input] SSA phi read(nonTainted) |
| SSA.cs:92:17:92:33 | access to property Length | SSA.cs:92:17:92:37 | ... > ... |
-| SSA.cs:93:17:93:29 | [input] SSA phi read(nonTainted) | SSA.cs:97:9:97:32 | SSA phi read(nonTainted) |
-| SSA.cs:93:17:93:29 | [input] SSA phi read(ssaSink0) | SSA.cs:97:9:97:32 | SSA phi read(ssaSink0) |
-| SSA.cs:93:17:93:29 | [input] SSA phi(ssaSink4) | SSA.cs:97:9:97:32 | SSA phi(ssaSink4) |
-| SSA.cs:93:21:93:28 | [post] access to local variable ssaSink4 | SSA.cs:93:17:93:29 | [input] SSA phi(ssaSink4) |
-| SSA.cs:93:21:93:28 | access to local variable ssaSink4 | SSA.cs:93:17:93:29 | [input] SSA phi(ssaSink4) |
-| SSA.cs:95:17:95:29 | [input] SSA phi read(nonTainted) | SSA.cs:97:9:97:32 | SSA phi read(nonTainted) |
-| SSA.cs:95:17:95:29 | [input] SSA phi read(ssaSink0) | SSA.cs:97:9:97:32 | SSA phi read(ssaSink0) |
-| SSA.cs:95:17:95:29 | [input] SSA phi(ssaSink4) | SSA.cs:97:9:97:32 | SSA phi(ssaSink4) |
-| SSA.cs:95:21:95:28 | [post] access to local variable ssaSink4 | SSA.cs:95:17:95:29 | [input] SSA phi(ssaSink4) |
-| SSA.cs:95:21:95:28 | access to local variable ssaSink4 | SSA.cs:95:17:95:29 | [input] SSA phi(ssaSink4) |
-| SSA.cs:97:9:97:32 | SSA phi read(nonTainted) | SSA.cs:102:13:102:22 | access to parameter nonTainted |
-| SSA.cs:97:9:97:32 | SSA phi read(ssaSink0) | SSA.cs:117:36:117:43 | access to local variable ssaSink0 |
-| SSA.cs:97:9:97:32 | SSA phi(ssaSink4) | SSA.cs:97:23:97:30 | access to local variable ssaSink4 |
+| SSA.cs:93:17:93:29 | [input] SSA phi read(nonTainted) | SSA.cs:102:13:102:22 | access to parameter nonTainted |
+| SSA.cs:93:17:93:29 | [input] SSA phi read(ssaSink0) | SSA.cs:117:36:117:43 | access to local variable ssaSink0 |
+| SSA.cs:93:21:93:28 | [post] access to local variable ssaSink4 | SSA.cs:97:23:97:30 | access to local variable ssaSink4 |
+| SSA.cs:93:21:93:28 | access to local variable ssaSink4 | SSA.cs:97:23:97:30 | access to local variable ssaSink4 |
+| SSA.cs:95:17:95:29 | [input] SSA phi read(nonTainted) | SSA.cs:102:13:102:22 | access to parameter nonTainted |
+| SSA.cs:95:17:95:29 | [input] SSA phi read(ssaSink0) | SSA.cs:117:36:117:43 | access to local variable ssaSink0 |
+| SSA.cs:95:21:95:28 | [post] access to local variable ssaSink4 | SSA.cs:97:23:97:30 | access to local variable ssaSink4 |
+| SSA.cs:95:21:95:28 | access to local variable ssaSink4 | SSA.cs:97:23:97:30 | access to local variable ssaSink4 |
| SSA.cs:97:23:97:30 | SSA def(ssaSink4) | SSA.cs:98:15:98:22 | access to local variable ssaSink4 |
| SSA.cs:97:23:97:30 | [post] access to local variable ssaSink4 | SSA.cs:97:23:97:30 | SSA def(ssaSink4) |
| SSA.cs:97:23:97:30 | access to local variable ssaSink4 | SSA.cs:97:23:97:30 | SSA def(ssaSink4) |
| SSA.cs:97:23:97:30 | access to local variable ssaSink4 | SSA.cs:97:23:97:30 | SSA def(ssaSink4) |
| SSA.cs:101:16:101:23 | access to local variable nonSink3 | SSA.cs:101:16:101:28 | SSA def(nonSink3) |
-| SSA.cs:101:16:101:28 | SSA def(nonSink3) | SSA.cs:102:13:102:33 | [input] SSA phi(nonSink3) |
+| SSA.cs:101:16:101:28 | SSA def(nonSink3) | SSA.cs:110:23:110:30 | access to local variable nonSink3 |
| SSA.cs:101:27:101:28 | "" | SSA.cs:101:16:101:23 | access to local variable nonSink3 |
| SSA.cs:102:13:102:22 | [post] access to parameter nonTainted | SSA.cs:102:13:102:33 | [input] SSA phi read(nonTainted) |
| SSA.cs:102:13:102:22 | [post] access to parameter nonTainted | SSA.cs:105:17:105:26 | access to parameter nonTainted |
| SSA.cs:102:13:102:22 | access to parameter nonTainted | SSA.cs:102:13:102:33 | [input] SSA phi read(nonTainted) |
| SSA.cs:102:13:102:22 | access to parameter nonTainted | SSA.cs:105:17:105:26 | access to parameter nonTainted |
| SSA.cs:102:13:102:29 | access to property Length | SSA.cs:102:13:102:33 | ... > ... |
-| SSA.cs:102:13:102:33 | [input] SSA phi read(nonSink0) | SSA.cs:110:9:110:32 | SSA phi read(nonSink0) |
-| SSA.cs:102:13:102:33 | [input] SSA phi read(nonTainted) | SSA.cs:110:9:110:32 | SSA phi read(nonTainted) |
-| SSA.cs:102:13:102:33 | [input] SSA phi(nonSink3) | SSA.cs:110:9:110:32 | SSA phi(nonSink3) |
+| SSA.cs:102:13:102:33 | [input] SSA phi read(nonSink0) | SSA.cs:130:39:130:46 | access to local variable nonSink0 |
+| SSA.cs:102:13:102:33 | [input] SSA phi read(nonTainted) | SSA.cs:115:13:115:22 | access to parameter nonTainted |
| SSA.cs:104:13:104:20 | access to local variable nonSink3 | SSA.cs:104:13:104:31 | SSA def(nonSink3) |
| SSA.cs:104:13:104:31 | SSA def(nonSink3) | SSA.cs:106:21:106:28 | access to local variable nonSink3 |
| SSA.cs:104:13:104:31 | SSA def(nonSink3) | SSA.cs:108:21:108:28 | access to local variable nonSink3 |
@@ -920,19 +889,14 @@
| SSA.cs:105:17:105:26 | access to parameter nonTainted | SSA.cs:106:17:106:29 | [input] SSA phi read(nonTainted) |
| SSA.cs:105:17:105:26 | access to parameter nonTainted | SSA.cs:108:17:108:29 | [input] SSA phi read(nonTainted) |
| SSA.cs:105:17:105:33 | access to property Length | SSA.cs:105:17:105:37 | ... > ... |
-| SSA.cs:106:17:106:29 | [input] SSA phi read(nonSink0) | SSA.cs:110:9:110:32 | SSA phi read(nonSink0) |
-| SSA.cs:106:17:106:29 | [input] SSA phi read(nonTainted) | SSA.cs:110:9:110:32 | SSA phi read(nonTainted) |
-| SSA.cs:106:17:106:29 | [input] SSA phi(nonSink3) | SSA.cs:110:9:110:32 | SSA phi(nonSink3) |
-| SSA.cs:106:21:106:28 | [post] access to local variable nonSink3 | SSA.cs:106:17:106:29 | [input] SSA phi(nonSink3) |
-| SSA.cs:106:21:106:28 | access to local variable nonSink3 | SSA.cs:106:17:106:29 | [input] SSA phi(nonSink3) |
-| SSA.cs:108:17:108:29 | [input] SSA phi read(nonSink0) | SSA.cs:110:9:110:32 | SSA phi read(nonSink0) |
-| SSA.cs:108:17:108:29 | [input] SSA phi read(nonTainted) | SSA.cs:110:9:110:32 | SSA phi read(nonTainted) |
-| SSA.cs:108:17:108:29 | [input] SSA phi(nonSink3) | SSA.cs:110:9:110:32 | SSA phi(nonSink3) |
-| SSA.cs:108:21:108:28 | [post] access to local variable nonSink3 | SSA.cs:108:17:108:29 | [input] SSA phi(nonSink3) |
-| SSA.cs:108:21:108:28 | access to local variable nonSink3 | SSA.cs:108:17:108:29 | [input] SSA phi(nonSink3) |
-| SSA.cs:110:9:110:32 | SSA phi read(nonSink0) | SSA.cs:130:39:130:46 | access to local variable nonSink0 |
-| SSA.cs:110:9:110:32 | SSA phi read(nonTainted) | SSA.cs:115:13:115:22 | access to parameter nonTainted |
-| SSA.cs:110:9:110:32 | SSA phi(nonSink3) | SSA.cs:110:23:110:30 | access to local variable nonSink3 |
+| SSA.cs:106:17:106:29 | [input] SSA phi read(nonSink0) | SSA.cs:130:39:130:46 | access to local variable nonSink0 |
+| SSA.cs:106:17:106:29 | [input] SSA phi read(nonTainted) | SSA.cs:115:13:115:22 | access to parameter nonTainted |
+| SSA.cs:106:21:106:28 | [post] access to local variable nonSink3 | SSA.cs:110:23:110:30 | access to local variable nonSink3 |
+| SSA.cs:106:21:106:28 | access to local variable nonSink3 | SSA.cs:110:23:110:30 | access to local variable nonSink3 |
+| SSA.cs:108:17:108:29 | [input] SSA phi read(nonSink0) | SSA.cs:130:39:130:46 | access to local variable nonSink0 |
+| SSA.cs:108:17:108:29 | [input] SSA phi read(nonTainted) | SSA.cs:115:13:115:22 | access to parameter nonTainted |
+| SSA.cs:108:21:108:28 | [post] access to local variable nonSink3 | SSA.cs:110:23:110:30 | access to local variable nonSink3 |
+| SSA.cs:108:21:108:28 | access to local variable nonSink3 | SSA.cs:110:23:110:30 | access to local variable nonSink3 |
| SSA.cs:110:23:110:30 | SSA def(nonSink3) | SSA.cs:111:15:111:22 | access to local variable nonSink3 |
| SSA.cs:110:23:110:30 | [post] access to local variable nonSink3 | SSA.cs:110:23:110:30 | SSA def(nonSink3) |
| SSA.cs:110:23:110:30 | access to local variable nonSink3 | SSA.cs:110:23:110:30 | SSA def(nonSink3) |
@@ -946,16 +910,15 @@
| SSA.cs:114:9:114:14 | access to field S | SSA.cs:115:13:115:33 | [input] SSA phi read(this.S) |
| SSA.cs:114:9:114:14 | access to field S | SSA.cs:117:13:117:18 | access to field S |
| SSA.cs:114:9:114:28 | access to field SsaFieldSink1 | SSA.cs:114:9:114:33 | SSA def(this.S.SsaFieldSink1) |
-| SSA.cs:114:9:114:33 | SSA def(this.S.SsaFieldSink1) | SSA.cs:115:13:115:33 | [input] SSA phi(this.S.SsaFieldSink1) |
+| SSA.cs:114:9:114:33 | SSA def(this.S.SsaFieldSink1) | SSA.cs:123:23:123:28 | SSA qualifier def(this.S.SsaFieldSink1) |
| SSA.cs:114:32:114:33 | "" | SSA.cs:114:9:114:28 | access to field SsaFieldSink1 |
| SSA.cs:115:13:115:22 | [post] access to parameter nonTainted | SSA.cs:115:13:115:33 | [input] SSA phi read(nonTainted) |
| SSA.cs:115:13:115:22 | [post] access to parameter nonTainted | SSA.cs:118:17:118:26 | access to parameter nonTainted |
| SSA.cs:115:13:115:22 | access to parameter nonTainted | SSA.cs:115:13:115:33 | [input] SSA phi read(nonTainted) |
| SSA.cs:115:13:115:22 | access to parameter nonTainted | SSA.cs:118:17:118:26 | access to parameter nonTainted |
| SSA.cs:115:13:115:29 | access to property Length | SSA.cs:115:13:115:33 | ... > ... |
-| SSA.cs:115:13:115:33 | [input] SSA phi read(nonTainted) | SSA.cs:123:9:123:30 | SSA phi read(nonTainted) |
-| SSA.cs:115:13:115:33 | [input] SSA phi read(this.S) | SSA.cs:123:9:123:30 | SSA phi read(this.S) |
-| SSA.cs:115:13:115:33 | [input] SSA phi(this.S.SsaFieldSink1) | SSA.cs:123:9:123:30 | SSA phi(this.S.SsaFieldSink1) |
+| SSA.cs:115:13:115:33 | [input] SSA phi read(nonTainted) | SSA.cs:128:13:128:22 | access to parameter nonTainted |
+| SSA.cs:115:13:115:33 | [input] SSA phi read(this.S) | SSA.cs:123:23:123:28 | access to field S |
| SSA.cs:117:13:117:16 | [post] this access | SSA.cs:119:21:119:24 | this access |
| SSA.cs:117:13:117:16 | [post] this access | SSA.cs:121:21:121:24 | this access |
| SSA.cs:117:13:117:16 | this access | SSA.cs:119:21:119:24 | this access |
@@ -973,27 +936,20 @@
| SSA.cs:118:17:118:26 | access to parameter nonTainted | SSA.cs:119:17:119:41 | [input] SSA phi read(nonTainted) |
| SSA.cs:118:17:118:26 | access to parameter nonTainted | SSA.cs:121:17:121:41 | [input] SSA phi read(nonTainted) |
| SSA.cs:118:17:118:33 | access to property Length | SSA.cs:118:17:118:37 | ... > ... |
-| SSA.cs:119:17:119:41 | [input] SSA phi read(nonTainted) | SSA.cs:123:9:123:30 | SSA phi read(nonTainted) |
-| SSA.cs:119:17:119:41 | [input] SSA phi read(this.S) | SSA.cs:123:9:123:30 | SSA phi read(this.S) |
-| SSA.cs:119:17:119:41 | [input] SSA phi(this.S.SsaFieldSink1) | SSA.cs:123:9:123:30 | SSA phi(this.S.SsaFieldSink1) |
+| SSA.cs:119:17:119:41 | [input] SSA phi read(nonTainted) | SSA.cs:128:13:128:22 | access to parameter nonTainted |
| SSA.cs:119:21:119:24 | [post] this access | SSA.cs:123:23:123:26 | this access |
| SSA.cs:119:21:119:24 | this access | SSA.cs:123:23:123:26 | this access |
-| SSA.cs:119:21:119:26 | [post] access to field S | SSA.cs:119:17:119:41 | [input] SSA phi read(this.S) |
-| SSA.cs:119:21:119:26 | access to field S | SSA.cs:119:17:119:41 | [input] SSA phi read(this.S) |
-| SSA.cs:119:21:119:40 | [post] access to field SsaFieldSink1 | SSA.cs:119:17:119:41 | [input] SSA phi(this.S.SsaFieldSink1) |
-| SSA.cs:119:21:119:40 | access to field SsaFieldSink1 | SSA.cs:119:17:119:41 | [input] SSA phi(this.S.SsaFieldSink1) |
-| SSA.cs:121:17:121:41 | [input] SSA phi read(nonTainted) | SSA.cs:123:9:123:30 | SSA phi read(nonTainted) |
-| SSA.cs:121:17:121:41 | [input] SSA phi read(this.S) | SSA.cs:123:9:123:30 | SSA phi read(this.S) |
-| SSA.cs:121:17:121:41 | [input] SSA phi(this.S.SsaFieldSink1) | SSA.cs:123:9:123:30 | SSA phi(this.S.SsaFieldSink1) |
+| SSA.cs:119:21:119:26 | [post] access to field S | SSA.cs:123:23:123:28 | access to field S |
+| SSA.cs:119:21:119:26 | access to field S | SSA.cs:123:23:123:28 | access to field S |
+| SSA.cs:119:21:119:40 | [post] access to field SsaFieldSink1 | SSA.cs:123:23:123:28 | SSA qualifier def(this.S.SsaFieldSink1) |
+| SSA.cs:119:21:119:40 | access to field SsaFieldSink1 | SSA.cs:123:23:123:28 | SSA qualifier def(this.S.SsaFieldSink1) |
+| SSA.cs:121:17:121:41 | [input] SSA phi read(nonTainted) | SSA.cs:128:13:128:22 | access to parameter nonTainted |
| SSA.cs:121:21:121:24 | [post] this access | SSA.cs:123:23:123:26 | this access |
| SSA.cs:121:21:121:24 | this access | SSA.cs:123:23:123:26 | this access |
-| SSA.cs:121:21:121:26 | [post] access to field S | SSA.cs:121:17:121:41 | [input] SSA phi read(this.S) |
-| SSA.cs:121:21:121:26 | access to field S | SSA.cs:121:17:121:41 | [input] SSA phi read(this.S) |
-| SSA.cs:121:21:121:40 | [post] access to field SsaFieldSink1 | SSA.cs:121:17:121:41 | [input] SSA phi(this.S.SsaFieldSink1) |
-| SSA.cs:121:21:121:40 | access to field SsaFieldSink1 | SSA.cs:121:17:121:41 | [input] SSA phi(this.S.SsaFieldSink1) |
-| SSA.cs:123:9:123:30 | SSA phi read(nonTainted) | SSA.cs:128:13:128:22 | access to parameter nonTainted |
-| SSA.cs:123:9:123:30 | SSA phi read(this.S) | SSA.cs:123:23:123:28 | access to field S |
-| SSA.cs:123:9:123:30 | SSA phi(this.S.SsaFieldSink1) | SSA.cs:123:23:123:28 | SSA qualifier def(this.S.SsaFieldSink1) |
+| SSA.cs:121:21:121:26 | [post] access to field S | SSA.cs:123:23:123:28 | access to field S |
+| SSA.cs:121:21:121:26 | access to field S | SSA.cs:123:23:123:28 | access to field S |
+| SSA.cs:121:21:121:40 | [post] access to field SsaFieldSink1 | SSA.cs:123:23:123:28 | SSA qualifier def(this.S.SsaFieldSink1) |
+| SSA.cs:121:21:121:40 | access to field SsaFieldSink1 | SSA.cs:123:23:123:28 | SSA qualifier def(this.S.SsaFieldSink1) |
| SSA.cs:123:23:123:26 | [post] this access | SSA.cs:124:15:124:18 | this access |
| SSA.cs:123:23:123:26 | this access | SSA.cs:124:15:124:18 | this access |
| SSA.cs:123:23:123:28 | SSA def(this.S) | SSA.cs:124:15:124:20 | access to field S |
@@ -1014,13 +970,12 @@
| SSA.cs:127:9:127:14 | access to field S | SSA.cs:128:13:128:33 | [input] SSA phi read(this.S) |
| SSA.cs:127:9:127:14 | access to field S | SSA.cs:130:13:130:18 | access to field S |
| SSA.cs:127:9:127:31 | access to field SsaFieldNonSink0 | SSA.cs:127:9:127:36 | SSA def(this.S.SsaFieldNonSink0) |
-| SSA.cs:127:9:127:36 | SSA def(this.S.SsaFieldNonSink0) | SSA.cs:128:13:128:33 | [input] SSA phi(this.S.SsaFieldNonSink0) |
+| SSA.cs:127:9:127:36 | SSA def(this.S.SsaFieldNonSink0) | SSA.cs:136:23:136:28 | SSA qualifier def(this.S.SsaFieldNonSink0) |
| SSA.cs:127:35:127:36 | "" | SSA.cs:127:9:127:31 | access to field SsaFieldNonSink0 |
| SSA.cs:128:13:128:22 | [post] access to parameter nonTainted | SSA.cs:131:17:131:26 | access to parameter nonTainted |
| SSA.cs:128:13:128:22 | access to parameter nonTainted | SSA.cs:131:17:131:26 | access to parameter nonTainted |
| SSA.cs:128:13:128:29 | access to property Length | SSA.cs:128:13:128:33 | ... > ... |
-| SSA.cs:128:13:128:33 | [input] SSA phi read(this.S) | SSA.cs:136:9:136:30 | SSA phi read(this.S) |
-| SSA.cs:128:13:128:33 | [input] SSA phi(this.S.SsaFieldNonSink0) | SSA.cs:136:9:136:30 | SSA phi(this.S.SsaFieldNonSink0) |
+| SSA.cs:128:13:128:33 | [input] SSA phi read(this.S) | SSA.cs:136:23:136:28 | access to field S |
| SSA.cs:130:13:130:16 | [post] this access | SSA.cs:132:21:132:24 | this access |
| SSA.cs:130:13:130:16 | [post] this access | SSA.cs:134:21:134:24 | this access |
| SSA.cs:130:13:130:16 | this access | SSA.cs:132:21:132:24 | this access |
@@ -1034,24 +989,18 @@
| SSA.cs:130:13:130:46 | SSA def(this.S.SsaFieldNonSink0) | SSA.cs:134:21:134:43 | access to field SsaFieldNonSink0 |
| SSA.cs:130:39:130:46 | access to local variable nonSink0 | SSA.cs:130:13:130:35 | access to field SsaFieldNonSink0 |
| SSA.cs:131:17:131:33 | access to property Length | SSA.cs:131:17:131:37 | ... > ... |
-| SSA.cs:132:17:132:44 | [input] SSA phi read(this.S) | SSA.cs:136:9:136:30 | SSA phi read(this.S) |
-| SSA.cs:132:17:132:44 | [input] SSA phi(this.S.SsaFieldNonSink0) | SSA.cs:136:9:136:30 | SSA phi(this.S.SsaFieldNonSink0) |
| SSA.cs:132:21:132:24 | [post] this access | SSA.cs:136:23:136:26 | this access |
| SSA.cs:132:21:132:24 | this access | SSA.cs:136:23:136:26 | this access |
-| SSA.cs:132:21:132:26 | [post] access to field S | SSA.cs:132:17:132:44 | [input] SSA phi read(this.S) |
-| SSA.cs:132:21:132:26 | access to field S | SSA.cs:132:17:132:44 | [input] SSA phi read(this.S) |
-| SSA.cs:132:21:132:43 | [post] access to field SsaFieldNonSink0 | SSA.cs:132:17:132:44 | [input] SSA phi(this.S.SsaFieldNonSink0) |
-| SSA.cs:132:21:132:43 | access to field SsaFieldNonSink0 | SSA.cs:132:17:132:44 | [input] SSA phi(this.S.SsaFieldNonSink0) |
-| SSA.cs:134:17:134:44 | [input] SSA phi read(this.S) | SSA.cs:136:9:136:30 | SSA phi read(this.S) |
-| SSA.cs:134:17:134:44 | [input] SSA phi(this.S.SsaFieldNonSink0) | SSA.cs:136:9:136:30 | SSA phi(this.S.SsaFieldNonSink0) |
+| SSA.cs:132:21:132:26 | [post] access to field S | SSA.cs:136:23:136:28 | access to field S |
+| SSA.cs:132:21:132:26 | access to field S | SSA.cs:136:23:136:28 | access to field S |
+| SSA.cs:132:21:132:43 | [post] access to field SsaFieldNonSink0 | SSA.cs:136:23:136:28 | SSA qualifier def(this.S.SsaFieldNonSink0) |
+| SSA.cs:132:21:132:43 | access to field SsaFieldNonSink0 | SSA.cs:136:23:136:28 | SSA qualifier def(this.S.SsaFieldNonSink0) |
| SSA.cs:134:21:134:24 | [post] this access | SSA.cs:136:23:136:26 | this access |
| SSA.cs:134:21:134:24 | this access | SSA.cs:136:23:136:26 | this access |
-| SSA.cs:134:21:134:26 | [post] access to field S | SSA.cs:134:17:134:44 | [input] SSA phi read(this.S) |
-| SSA.cs:134:21:134:26 | access to field S | SSA.cs:134:17:134:44 | [input] SSA phi read(this.S) |
-| SSA.cs:134:21:134:43 | [post] access to field SsaFieldNonSink0 | SSA.cs:134:17:134:44 | [input] SSA phi(this.S.SsaFieldNonSink0) |
-| SSA.cs:134:21:134:43 | access to field SsaFieldNonSink0 | SSA.cs:134:17:134:44 | [input] SSA phi(this.S.SsaFieldNonSink0) |
-| SSA.cs:136:9:136:30 | SSA phi read(this.S) | SSA.cs:136:23:136:28 | access to field S |
-| SSA.cs:136:9:136:30 | SSA phi(this.S.SsaFieldNonSink0) | SSA.cs:136:23:136:28 | SSA qualifier def(this.S.SsaFieldNonSink0) |
+| SSA.cs:134:21:134:26 | [post] access to field S | SSA.cs:136:23:136:28 | access to field S |
+| SSA.cs:134:21:134:26 | access to field S | SSA.cs:136:23:136:28 | access to field S |
+| SSA.cs:134:21:134:43 | [post] access to field SsaFieldNonSink0 | SSA.cs:136:23:136:28 | SSA qualifier def(this.S.SsaFieldNonSink0) |
+| SSA.cs:134:21:134:43 | access to field SsaFieldNonSink0 | SSA.cs:136:23:136:28 | SSA qualifier def(this.S.SsaFieldNonSink0) |
| SSA.cs:136:23:136:26 | [post] this access | SSA.cs:137:15:137:18 | this access |
| SSA.cs:136:23:136:26 | this access | SSA.cs:137:15:137:18 | this access |
| SSA.cs:136:23:136:28 | SSA def(this.S) | SSA.cs:137:15:137:20 | access to field S |
@@ -1065,12 +1014,10 @@
| SSA.cs:146:13:146:13 | access to parameter t | SSA.cs:146:13:146:13 | (...) ... |
| SSA.cs:146:13:146:13 | access to parameter t | SSA.cs:149:17:149:17 | access to parameter t |
| SSA.cs:147:13:147:13 | access to parameter t | SSA.cs:147:13:147:26 | SSA def(t) |
-| SSA.cs:147:13:147:26 | SSA def(t) | SSA.cs:147:13:147:26 | [input] SSA phi(t) |
-| SSA.cs:147:13:147:26 | [input] SSA phi(t) | SSA.cs:144:17:144:26 | SSA phi(t) |
+| SSA.cs:147:13:147:26 | SSA def(t) | SSA.cs:144:17:144:26 | SSA phi(t) |
| SSA.cs:147:17:147:26 | default(...) | SSA.cs:147:13:147:13 | access to parameter t |
| SSA.cs:149:13:149:13 | access to parameter t | SSA.cs:149:13:149:17 | SSA def(t) |
-| SSA.cs:149:13:149:17 | SSA def(t) | SSA.cs:149:13:149:17 | [input] SSA phi(t) |
-| SSA.cs:149:13:149:17 | [input] SSA phi(t) | SSA.cs:144:17:144:26 | SSA phi(t) |
+| SSA.cs:149:13:149:17 | SSA def(t) | SSA.cs:144:17:144:26 | SSA phi(t) |
| SSA.cs:149:17:149:17 | access to parameter t | SSA.cs:149:13:149:13 | access to parameter t |
| SSA.cs:152:36:152:36 | SSA param(t) | SSA.cs:154:13:154:13 | access to parameter t |
| SSA.cs:152:36:152:36 | t | SSA.cs:152:36:152:36 | SSA param(t) |
@@ -1079,8 +1026,7 @@
| SSA.cs:154:13:154:13 | access to parameter t | SSA.cs:154:13:154:21 | [input] SSA phi(t) |
| SSA.cs:154:13:154:13 | access to parameter t | SSA.cs:155:25:155:25 | access to parameter t |
| SSA.cs:154:13:154:21 | [input] SSA phi(t) | SSA.cs:152:17:152:28 | SSA phi(t) |
-| SSA.cs:155:13:155:26 | [input] SSA phi(t) | SSA.cs:152:17:152:28 | SSA phi(t) |
-| SSA.cs:155:25:155:25 | SSA def(t) | SSA.cs:155:13:155:26 | [input] SSA phi(t) |
+| SSA.cs:155:25:155:25 | SSA def(t) | SSA.cs:152:17:152:28 | SSA phi(t) |
| SSA.cs:155:25:155:25 | access to parameter t | SSA.cs:155:25:155:25 | SSA def(t) |
| SSA.cs:166:10:166:13 | this | SSA.cs:166:19:166:22 | this access |
| SSA.cs:166:28:166:31 | null | SSA.cs:166:19:166:24 | access to field S |
@@ -1089,31 +1035,24 @@
| SSA.cs:168:35:168:35 | SSA param(i) | SSA.cs:171:13:171:13 | access to parameter i |
| SSA.cs:168:35:168:35 | i | SSA.cs:168:35:168:35 | SSA param(i) |
| SSA.cs:170:16:170:23 | access to local variable ssaSink5 | SSA.cs:170:16:170:28 | SSA def(ssaSink5) |
-| SSA.cs:170:16:170:28 | SSA def(ssaSink5) | SSA.cs:171:13:171:19 | [input] SSA phi(ssaSink5) |
+| SSA.cs:170:16:170:28 | SSA def(ssaSink5) | SSA.cs:180:15:180:22 | access to local variable ssaSink5 |
| SSA.cs:170:27:170:28 | "" | SSA.cs:170:16:170:23 | access to local variable ssaSink5 |
| SSA.cs:171:13:171:13 | access to parameter i | SSA.cs:171:13:171:15 | SSA def(i) |
| SSA.cs:171:13:171:15 | ...-- | SSA.cs:171:13:171:19 | ... > ... |
-| SSA.cs:171:13:171:15 | SSA def(i) | SSA.cs:174:13:178:13 | [input] SSA phi(i) |
-| SSA.cs:171:13:171:19 | [input] SSA phi(ssaSink5) | SSA.cs:180:9:180:24 | SSA phi(ssaSink5) |
+| SSA.cs:171:13:171:15 | SSA def(i) | SSA.cs:174:20:174:20 | access to parameter i |
| SSA.cs:173:13:173:20 | access to local variable ssaSink5 | SSA.cs:173:13:173:30 | SSA def(ssaSink5) |
-| SSA.cs:173:13:173:30 | SSA def(ssaSink5) | SSA.cs:174:13:178:13 | [input] SSA phi read(ssaSink5) |
+| SSA.cs:173:13:173:30 | SSA def(ssaSink5) | SSA.cs:174:20:174:20 | SSA phi read(ssaSink5) |
| SSA.cs:173:24:173:30 | access to parameter tainted | SSA.cs:173:13:173:20 | access to local variable ssaSink5 |
-| SSA.cs:174:13:178:13 | [input] SSA phi read(ssaSink5) | SSA.cs:174:20:174:20 | SSA phi read(ssaSink5) |
-| SSA.cs:174:13:178:13 | [input] SSA phi(i) | SSA.cs:174:20:174:20 | SSA phi(i) |
| SSA.cs:174:20:174:20 | SSA phi read(ssaSink5) | SSA.cs:174:20:174:26 | [input] SSA phi(ssaSink5) |
| SSA.cs:174:20:174:20 | SSA phi read(ssaSink5) | SSA.cs:176:21:176:28 | access to local variable ssaSink5 |
-| SSA.cs:174:20:174:20 | SSA phi(i) | SSA.cs:174:20:174:20 | access to parameter i |
| SSA.cs:174:20:174:20 | access to parameter i | SSA.cs:174:20:174:22 | SSA def(i) |
| SSA.cs:174:20:174:22 | ...-- | SSA.cs:174:20:174:26 | ... > ... |
-| SSA.cs:174:20:174:22 | SSA def(i) | SSA.cs:177:17:177:29 | [input] SSA phi(i) |
-| SSA.cs:174:20:174:26 | [input] SSA phi(ssaSink5) | SSA.cs:180:9:180:24 | SSA phi(ssaSink5) |
+| SSA.cs:174:20:174:22 | SSA def(i) | SSA.cs:174:20:174:20 | access to parameter i |
+| SSA.cs:174:20:174:26 | [input] SSA phi(ssaSink5) | SSA.cs:180:15:180:22 | access to local variable ssaSink5 |
| SSA.cs:176:21:176:28 | [post] access to local variable ssaSink5 | SSA.cs:177:21:177:28 | access to local variable ssaSink5 |
| SSA.cs:176:21:176:28 | access to local variable ssaSink5 | SSA.cs:177:21:177:28 | access to local variable ssaSink5 |
-| SSA.cs:177:17:177:29 | [input] SSA phi read(ssaSink5) | SSA.cs:174:20:174:20 | SSA phi read(ssaSink5) |
-| SSA.cs:177:17:177:29 | [input] SSA phi(i) | SSA.cs:174:20:174:20 | SSA phi(i) |
-| SSA.cs:177:21:177:28 | [post] access to local variable ssaSink5 | SSA.cs:177:17:177:29 | [input] SSA phi read(ssaSink5) |
-| SSA.cs:177:21:177:28 | access to local variable ssaSink5 | SSA.cs:177:17:177:29 | [input] SSA phi read(ssaSink5) |
-| SSA.cs:180:9:180:24 | SSA phi(ssaSink5) | SSA.cs:180:15:180:22 | access to local variable ssaSink5 |
+| SSA.cs:177:21:177:28 | [post] access to local variable ssaSink5 | SSA.cs:174:20:174:20 | SSA phi read(ssaSink5) |
+| SSA.cs:177:21:177:28 | access to local variable ssaSink5 | SSA.cs:174:20:174:20 | SSA phi read(ssaSink5) |
| Splitting.cs:3:18:3:18 | SSA param(b) | Splitting.cs:6:13:6:13 | access to parameter b |
| Splitting.cs:3:18:3:18 | b | Splitting.cs:3:18:3:18 | SSA param(b) |
| Splitting.cs:3:28:3:34 | SSA param(tainted) | Splitting.cs:5:17:5:23 | access to parameter tainted |
@@ -2054,509 +1993,408 @@
| UseUseExplosion.cs:24:1689:24:1692 | access to property Prop | UseUseExplosion.cs:24:1708:24:1713 | [input] SSA phi read(this.Prop) |
| UseUseExplosion.cs:24:1689:24:1692 | this access | UseUseExplosion.cs:24:1708:24:1713 | this access |
| UseUseExplosion.cs:24:1689:24:1692 | this access | UseUseExplosion.cs:25:13:25:16 | this access |
-| UseUseExplosion.cs:24:1699:24:1701 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(this.Prop) |
+| UseUseExplosion.cs:24:1699:24:1701 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:13:25:16 | access to property Prop |
| UseUseExplosion.cs:24:1699:24:1701 | [input] SSA phi read(x) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
-| UseUseExplosion.cs:24:1708:24:1713 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(this.Prop) |
-| UseUseExplosion.cs:24:1708:24:1713 | [input] SSA phi read(x) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:1708:24:1713 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:13:25:16 | access to property Prop |
| UseUseExplosion.cs:24:1708:24:1713 | [post] this access | UseUseExplosion.cs:25:13:25:16 | this access |
| UseUseExplosion.cs:24:1708:24:1713 | this access | UseUseExplosion.cs:25:13:25:16 | this access |
-| UseUseExplosion.cs:24:1712:24:1712 | access to local variable x | UseUseExplosion.cs:24:1708:24:1713 | [input] SSA phi read(x) |
-| UseUseExplosion.cs:24:1723:24:1728 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(this.Prop) |
-| UseUseExplosion.cs:24:1723:24:1728 | [input] SSA phi read(x) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:1712:24:1712 | access to local variable x | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:1723:24:1728 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:13:25:16 | access to property Prop |
| UseUseExplosion.cs:24:1723:24:1728 | [post] this access | UseUseExplosion.cs:25:13:25:16 | this access |
| UseUseExplosion.cs:24:1723:24:1728 | this access | UseUseExplosion.cs:25:13:25:16 | this access |
-| UseUseExplosion.cs:24:1727:24:1727 | access to local variable x | UseUseExplosion.cs:24:1723:24:1728 | [input] SSA phi read(x) |
-| UseUseExplosion.cs:24:1738:24:1743 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(this.Prop) |
-| UseUseExplosion.cs:24:1738:24:1743 | [input] SSA phi read(x) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:1727:24:1727 | access to local variable x | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:1738:24:1743 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:13:25:16 | access to property Prop |
| UseUseExplosion.cs:24:1738:24:1743 | [post] this access | UseUseExplosion.cs:25:13:25:16 | this access |
| UseUseExplosion.cs:24:1738:24:1743 | this access | UseUseExplosion.cs:25:13:25:16 | this access |
-| UseUseExplosion.cs:24:1742:24:1742 | access to local variable x | UseUseExplosion.cs:24:1738:24:1743 | [input] SSA phi read(x) |
-| UseUseExplosion.cs:24:1753:24:1758 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(this.Prop) |
-| UseUseExplosion.cs:24:1753:24:1758 | [input] SSA phi read(x) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:1742:24:1742 | access to local variable x | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:1753:24:1758 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:13:25:16 | access to property Prop |
| UseUseExplosion.cs:24:1753:24:1758 | [post] this access | UseUseExplosion.cs:25:13:25:16 | this access |
| UseUseExplosion.cs:24:1753:24:1758 | this access | UseUseExplosion.cs:25:13:25:16 | this access |
-| UseUseExplosion.cs:24:1757:24:1757 | access to local variable x | UseUseExplosion.cs:24:1753:24:1758 | [input] SSA phi read(x) |
-| UseUseExplosion.cs:24:1768:24:1773 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(this.Prop) |
-| UseUseExplosion.cs:24:1768:24:1773 | [input] SSA phi read(x) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:1757:24:1757 | access to local variable x | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:1768:24:1773 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:13:25:16 | access to property Prop |
| UseUseExplosion.cs:24:1768:24:1773 | [post] this access | UseUseExplosion.cs:25:13:25:16 | this access |
| UseUseExplosion.cs:24:1768:24:1773 | this access | UseUseExplosion.cs:25:13:25:16 | this access |
-| UseUseExplosion.cs:24:1772:24:1772 | access to local variable x | UseUseExplosion.cs:24:1768:24:1773 | [input] SSA phi read(x) |
-| UseUseExplosion.cs:24:1783:24:1788 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(this.Prop) |
-| UseUseExplosion.cs:24:1783:24:1788 | [input] SSA phi read(x) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:1772:24:1772 | access to local variable x | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:1783:24:1788 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:13:25:16 | access to property Prop |
| UseUseExplosion.cs:24:1783:24:1788 | [post] this access | UseUseExplosion.cs:25:13:25:16 | this access |
| UseUseExplosion.cs:24:1783:24:1788 | this access | UseUseExplosion.cs:25:13:25:16 | this access |
-| UseUseExplosion.cs:24:1787:24:1787 | access to local variable x | UseUseExplosion.cs:24:1783:24:1788 | [input] SSA phi read(x) |
-| UseUseExplosion.cs:24:1798:24:1803 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(this.Prop) |
-| UseUseExplosion.cs:24:1798:24:1803 | [input] SSA phi read(x) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:1787:24:1787 | access to local variable x | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:1798:24:1803 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:13:25:16 | access to property Prop |
| UseUseExplosion.cs:24:1798:24:1803 | [post] this access | UseUseExplosion.cs:25:13:25:16 | this access |
| UseUseExplosion.cs:24:1798:24:1803 | this access | UseUseExplosion.cs:25:13:25:16 | this access |
-| UseUseExplosion.cs:24:1802:24:1802 | access to local variable x | UseUseExplosion.cs:24:1798:24:1803 | [input] SSA phi read(x) |
-| UseUseExplosion.cs:24:1813:24:1818 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(this.Prop) |
-| UseUseExplosion.cs:24:1813:24:1818 | [input] SSA phi read(x) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:1802:24:1802 | access to local variable x | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:1813:24:1818 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:13:25:16 | access to property Prop |
| UseUseExplosion.cs:24:1813:24:1818 | [post] this access | UseUseExplosion.cs:25:13:25:16 | this access |
| UseUseExplosion.cs:24:1813:24:1818 | this access | UseUseExplosion.cs:25:13:25:16 | this access |
-| UseUseExplosion.cs:24:1817:24:1817 | access to local variable x | UseUseExplosion.cs:24:1813:24:1818 | [input] SSA phi read(x) |
-| UseUseExplosion.cs:24:1828:24:1833 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(this.Prop) |
-| UseUseExplosion.cs:24:1828:24:1833 | [input] SSA phi read(x) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:1817:24:1817 | access to local variable x | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:1828:24:1833 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:13:25:16 | access to property Prop |
| UseUseExplosion.cs:24:1828:24:1833 | [post] this access | UseUseExplosion.cs:25:13:25:16 | this access |
| UseUseExplosion.cs:24:1828:24:1833 | this access | UseUseExplosion.cs:25:13:25:16 | this access |
-| UseUseExplosion.cs:24:1832:24:1832 | access to local variable x | UseUseExplosion.cs:24:1828:24:1833 | [input] SSA phi read(x) |
-| UseUseExplosion.cs:24:1843:24:1848 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(this.Prop) |
-| UseUseExplosion.cs:24:1843:24:1848 | [input] SSA phi read(x) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:1832:24:1832 | access to local variable x | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:1843:24:1848 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:13:25:16 | access to property Prop |
| UseUseExplosion.cs:24:1843:24:1848 | [post] this access | UseUseExplosion.cs:25:13:25:16 | this access |
| UseUseExplosion.cs:24:1843:24:1848 | this access | UseUseExplosion.cs:25:13:25:16 | this access |
-| UseUseExplosion.cs:24:1847:24:1847 | access to local variable x | UseUseExplosion.cs:24:1843:24:1848 | [input] SSA phi read(x) |
-| UseUseExplosion.cs:24:1858:24:1863 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(this.Prop) |
-| UseUseExplosion.cs:24:1858:24:1863 | [input] SSA phi read(x) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:1847:24:1847 | access to local variable x | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:1858:24:1863 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:13:25:16 | access to property Prop |
| UseUseExplosion.cs:24:1858:24:1863 | [post] this access | UseUseExplosion.cs:25:13:25:16 | this access |
| UseUseExplosion.cs:24:1858:24:1863 | this access | UseUseExplosion.cs:25:13:25:16 | this access |
-| UseUseExplosion.cs:24:1862:24:1862 | access to local variable x | UseUseExplosion.cs:24:1858:24:1863 | [input] SSA phi read(x) |
-| UseUseExplosion.cs:24:1873:24:1878 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(this.Prop) |
-| UseUseExplosion.cs:24:1873:24:1878 | [input] SSA phi read(x) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:1862:24:1862 | access to local variable x | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:1873:24:1878 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:13:25:16 | access to property Prop |
| UseUseExplosion.cs:24:1873:24:1878 | [post] this access | UseUseExplosion.cs:25:13:25:16 | this access |
| UseUseExplosion.cs:24:1873:24:1878 | this access | UseUseExplosion.cs:25:13:25:16 | this access |
-| UseUseExplosion.cs:24:1877:24:1877 | access to local variable x | UseUseExplosion.cs:24:1873:24:1878 | [input] SSA phi read(x) |
-| UseUseExplosion.cs:24:1888:24:1893 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(this.Prop) |
-| UseUseExplosion.cs:24:1888:24:1893 | [input] SSA phi read(x) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:1877:24:1877 | access to local variable x | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:1888:24:1893 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:13:25:16 | access to property Prop |
| UseUseExplosion.cs:24:1888:24:1893 | [post] this access | UseUseExplosion.cs:25:13:25:16 | this access |
| UseUseExplosion.cs:24:1888:24:1893 | this access | UseUseExplosion.cs:25:13:25:16 | this access |
-| UseUseExplosion.cs:24:1892:24:1892 | access to local variable x | UseUseExplosion.cs:24:1888:24:1893 | [input] SSA phi read(x) |
-| UseUseExplosion.cs:24:1903:24:1908 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(this.Prop) |
-| UseUseExplosion.cs:24:1903:24:1908 | [input] SSA phi read(x) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:1892:24:1892 | access to local variable x | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:1903:24:1908 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:13:25:16 | access to property Prop |
| UseUseExplosion.cs:24:1903:24:1908 | [post] this access | UseUseExplosion.cs:25:13:25:16 | this access |
| UseUseExplosion.cs:24:1903:24:1908 | this access | UseUseExplosion.cs:25:13:25:16 | this access |
-| UseUseExplosion.cs:24:1907:24:1907 | access to local variable x | UseUseExplosion.cs:24:1903:24:1908 | [input] SSA phi read(x) |
-| UseUseExplosion.cs:24:1918:24:1923 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(this.Prop) |
-| UseUseExplosion.cs:24:1918:24:1923 | [input] SSA phi read(x) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:1907:24:1907 | access to local variable x | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:1918:24:1923 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:13:25:16 | access to property Prop |
| UseUseExplosion.cs:24:1918:24:1923 | [post] this access | UseUseExplosion.cs:25:13:25:16 | this access |
| UseUseExplosion.cs:24:1918:24:1923 | this access | UseUseExplosion.cs:25:13:25:16 | this access |
-| UseUseExplosion.cs:24:1922:24:1922 | access to local variable x | UseUseExplosion.cs:24:1918:24:1923 | [input] SSA phi read(x) |
-| UseUseExplosion.cs:24:1933:24:1938 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(this.Prop) |
-| UseUseExplosion.cs:24:1933:24:1938 | [input] SSA phi read(x) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:1922:24:1922 | access to local variable x | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:1933:24:1938 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:13:25:16 | access to property Prop |
| UseUseExplosion.cs:24:1933:24:1938 | [post] this access | UseUseExplosion.cs:25:13:25:16 | this access |
| UseUseExplosion.cs:24:1933:24:1938 | this access | UseUseExplosion.cs:25:13:25:16 | this access |
-| UseUseExplosion.cs:24:1937:24:1937 | access to local variable x | UseUseExplosion.cs:24:1933:24:1938 | [input] SSA phi read(x) |
-| UseUseExplosion.cs:24:1948:24:1953 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(this.Prop) |
-| UseUseExplosion.cs:24:1948:24:1953 | [input] SSA phi read(x) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:1937:24:1937 | access to local variable x | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:1948:24:1953 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:13:25:16 | access to property Prop |
| UseUseExplosion.cs:24:1948:24:1953 | [post] this access | UseUseExplosion.cs:25:13:25:16 | this access |
| UseUseExplosion.cs:24:1948:24:1953 | this access | UseUseExplosion.cs:25:13:25:16 | this access |
-| UseUseExplosion.cs:24:1952:24:1952 | access to local variable x | UseUseExplosion.cs:24:1948:24:1953 | [input] SSA phi read(x) |
-| UseUseExplosion.cs:24:1963:24:1968 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(this.Prop) |
-| UseUseExplosion.cs:24:1963:24:1968 | [input] SSA phi read(x) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:1952:24:1952 | access to local variable x | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:1963:24:1968 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:13:25:16 | access to property Prop |
| UseUseExplosion.cs:24:1963:24:1968 | [post] this access | UseUseExplosion.cs:25:13:25:16 | this access |
| UseUseExplosion.cs:24:1963:24:1968 | this access | UseUseExplosion.cs:25:13:25:16 | this access |
-| UseUseExplosion.cs:24:1967:24:1967 | access to local variable x | UseUseExplosion.cs:24:1963:24:1968 | [input] SSA phi read(x) |
-| UseUseExplosion.cs:24:1978:24:1983 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(this.Prop) |
-| UseUseExplosion.cs:24:1978:24:1983 | [input] SSA phi read(x) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:1967:24:1967 | access to local variable x | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:1978:24:1983 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:13:25:16 | access to property Prop |
| UseUseExplosion.cs:24:1978:24:1983 | [post] this access | UseUseExplosion.cs:25:13:25:16 | this access |
| UseUseExplosion.cs:24:1978:24:1983 | this access | UseUseExplosion.cs:25:13:25:16 | this access |
-| UseUseExplosion.cs:24:1982:24:1982 | access to local variable x | UseUseExplosion.cs:24:1978:24:1983 | [input] SSA phi read(x) |
-| UseUseExplosion.cs:24:1993:24:1998 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(this.Prop) |
-| UseUseExplosion.cs:24:1993:24:1998 | [input] SSA phi read(x) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:1982:24:1982 | access to local variable x | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:1993:24:1998 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:13:25:16 | access to property Prop |
| UseUseExplosion.cs:24:1993:24:1998 | [post] this access | UseUseExplosion.cs:25:13:25:16 | this access |
| UseUseExplosion.cs:24:1993:24:1998 | this access | UseUseExplosion.cs:25:13:25:16 | this access |
-| UseUseExplosion.cs:24:1997:24:1997 | access to local variable x | UseUseExplosion.cs:24:1993:24:1998 | [input] SSA phi read(x) |
-| UseUseExplosion.cs:24:2008:24:2013 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(this.Prop) |
-| UseUseExplosion.cs:24:2008:24:2013 | [input] SSA phi read(x) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:1997:24:1997 | access to local variable x | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:2008:24:2013 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:13:25:16 | access to property Prop |
| UseUseExplosion.cs:24:2008:24:2013 | [post] this access | UseUseExplosion.cs:25:13:25:16 | this access |
| UseUseExplosion.cs:24:2008:24:2013 | this access | UseUseExplosion.cs:25:13:25:16 | this access |
-| UseUseExplosion.cs:24:2012:24:2012 | access to local variable x | UseUseExplosion.cs:24:2008:24:2013 | [input] SSA phi read(x) |
-| UseUseExplosion.cs:24:2023:24:2028 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(this.Prop) |
-| UseUseExplosion.cs:24:2023:24:2028 | [input] SSA phi read(x) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:2012:24:2012 | access to local variable x | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:2023:24:2028 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:13:25:16 | access to property Prop |
| UseUseExplosion.cs:24:2023:24:2028 | [post] this access | UseUseExplosion.cs:25:13:25:16 | this access |
| UseUseExplosion.cs:24:2023:24:2028 | this access | UseUseExplosion.cs:25:13:25:16 | this access |
-| UseUseExplosion.cs:24:2027:24:2027 | access to local variable x | UseUseExplosion.cs:24:2023:24:2028 | [input] SSA phi read(x) |
-| UseUseExplosion.cs:24:2038:24:2043 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(this.Prop) |
-| UseUseExplosion.cs:24:2038:24:2043 | [input] SSA phi read(x) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:2027:24:2027 | access to local variable x | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:2038:24:2043 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:13:25:16 | access to property Prop |
| UseUseExplosion.cs:24:2038:24:2043 | [post] this access | UseUseExplosion.cs:25:13:25:16 | this access |
| UseUseExplosion.cs:24:2038:24:2043 | this access | UseUseExplosion.cs:25:13:25:16 | this access |
-| UseUseExplosion.cs:24:2042:24:2042 | access to local variable x | UseUseExplosion.cs:24:2038:24:2043 | [input] SSA phi read(x) |
-| UseUseExplosion.cs:24:2053:24:2058 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(this.Prop) |
-| UseUseExplosion.cs:24:2053:24:2058 | [input] SSA phi read(x) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:2042:24:2042 | access to local variable x | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:2053:24:2058 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:13:25:16 | access to property Prop |
| UseUseExplosion.cs:24:2053:24:2058 | [post] this access | UseUseExplosion.cs:25:13:25:16 | this access |
| UseUseExplosion.cs:24:2053:24:2058 | this access | UseUseExplosion.cs:25:13:25:16 | this access |
-| UseUseExplosion.cs:24:2057:24:2057 | access to local variable x | UseUseExplosion.cs:24:2053:24:2058 | [input] SSA phi read(x) |
-| UseUseExplosion.cs:24:2068:24:2073 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(this.Prop) |
-| UseUseExplosion.cs:24:2068:24:2073 | [input] SSA phi read(x) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:2057:24:2057 | access to local variable x | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:2068:24:2073 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:13:25:16 | access to property Prop |
| UseUseExplosion.cs:24:2068:24:2073 | [post] this access | UseUseExplosion.cs:25:13:25:16 | this access |
| UseUseExplosion.cs:24:2068:24:2073 | this access | UseUseExplosion.cs:25:13:25:16 | this access |
-| UseUseExplosion.cs:24:2072:24:2072 | access to local variable x | UseUseExplosion.cs:24:2068:24:2073 | [input] SSA phi read(x) |
-| UseUseExplosion.cs:24:2083:24:2088 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(this.Prop) |
-| UseUseExplosion.cs:24:2083:24:2088 | [input] SSA phi read(x) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:2072:24:2072 | access to local variable x | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:2083:24:2088 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:13:25:16 | access to property Prop |
| UseUseExplosion.cs:24:2083:24:2088 | [post] this access | UseUseExplosion.cs:25:13:25:16 | this access |
| UseUseExplosion.cs:24:2083:24:2088 | this access | UseUseExplosion.cs:25:13:25:16 | this access |
-| UseUseExplosion.cs:24:2087:24:2087 | access to local variable x | UseUseExplosion.cs:24:2083:24:2088 | [input] SSA phi read(x) |
-| UseUseExplosion.cs:24:2098:24:2103 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(this.Prop) |
-| UseUseExplosion.cs:24:2098:24:2103 | [input] SSA phi read(x) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:2087:24:2087 | access to local variable x | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:2098:24:2103 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:13:25:16 | access to property Prop |
| UseUseExplosion.cs:24:2098:24:2103 | [post] this access | UseUseExplosion.cs:25:13:25:16 | this access |
| UseUseExplosion.cs:24:2098:24:2103 | this access | UseUseExplosion.cs:25:13:25:16 | this access |
-| UseUseExplosion.cs:24:2102:24:2102 | access to local variable x | UseUseExplosion.cs:24:2098:24:2103 | [input] SSA phi read(x) |
-| UseUseExplosion.cs:24:2113:24:2118 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(this.Prop) |
-| UseUseExplosion.cs:24:2113:24:2118 | [input] SSA phi read(x) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:2102:24:2102 | access to local variable x | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:2113:24:2118 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:13:25:16 | access to property Prop |
| UseUseExplosion.cs:24:2113:24:2118 | [post] this access | UseUseExplosion.cs:25:13:25:16 | this access |
| UseUseExplosion.cs:24:2113:24:2118 | this access | UseUseExplosion.cs:25:13:25:16 | this access |
-| UseUseExplosion.cs:24:2117:24:2117 | access to local variable x | UseUseExplosion.cs:24:2113:24:2118 | [input] SSA phi read(x) |
-| UseUseExplosion.cs:24:2128:24:2133 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(this.Prop) |
-| UseUseExplosion.cs:24:2128:24:2133 | [input] SSA phi read(x) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:2117:24:2117 | access to local variable x | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:2128:24:2133 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:13:25:16 | access to property Prop |
| UseUseExplosion.cs:24:2128:24:2133 | [post] this access | UseUseExplosion.cs:25:13:25:16 | this access |
| UseUseExplosion.cs:24:2128:24:2133 | this access | UseUseExplosion.cs:25:13:25:16 | this access |
-| UseUseExplosion.cs:24:2132:24:2132 | access to local variable x | UseUseExplosion.cs:24:2128:24:2133 | [input] SSA phi read(x) |
-| UseUseExplosion.cs:24:2143:24:2148 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(this.Prop) |
-| UseUseExplosion.cs:24:2143:24:2148 | [input] SSA phi read(x) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:2132:24:2132 | access to local variable x | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:2143:24:2148 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:13:25:16 | access to property Prop |
| UseUseExplosion.cs:24:2143:24:2148 | [post] this access | UseUseExplosion.cs:25:13:25:16 | this access |
| UseUseExplosion.cs:24:2143:24:2148 | this access | UseUseExplosion.cs:25:13:25:16 | this access |
-| UseUseExplosion.cs:24:2147:24:2147 | access to local variable x | UseUseExplosion.cs:24:2143:24:2148 | [input] SSA phi read(x) |
-| UseUseExplosion.cs:24:2158:24:2163 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(this.Prop) |
-| UseUseExplosion.cs:24:2158:24:2163 | [input] SSA phi read(x) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:2147:24:2147 | access to local variable x | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:2158:24:2163 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:13:25:16 | access to property Prop |
| UseUseExplosion.cs:24:2158:24:2163 | [post] this access | UseUseExplosion.cs:25:13:25:16 | this access |
| UseUseExplosion.cs:24:2158:24:2163 | this access | UseUseExplosion.cs:25:13:25:16 | this access |
-| UseUseExplosion.cs:24:2162:24:2162 | access to local variable x | UseUseExplosion.cs:24:2158:24:2163 | [input] SSA phi read(x) |
-| UseUseExplosion.cs:24:2173:24:2178 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(this.Prop) |
-| UseUseExplosion.cs:24:2173:24:2178 | [input] SSA phi read(x) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:2162:24:2162 | access to local variable x | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:2173:24:2178 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:13:25:16 | access to property Prop |
| UseUseExplosion.cs:24:2173:24:2178 | [post] this access | UseUseExplosion.cs:25:13:25:16 | this access |
| UseUseExplosion.cs:24:2173:24:2178 | this access | UseUseExplosion.cs:25:13:25:16 | this access |
-| UseUseExplosion.cs:24:2177:24:2177 | access to local variable x | UseUseExplosion.cs:24:2173:24:2178 | [input] SSA phi read(x) |
-| UseUseExplosion.cs:24:2188:24:2193 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(this.Prop) |
-| UseUseExplosion.cs:24:2188:24:2193 | [input] SSA phi read(x) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:2177:24:2177 | access to local variable x | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:2188:24:2193 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:13:25:16 | access to property Prop |
| UseUseExplosion.cs:24:2188:24:2193 | [post] this access | UseUseExplosion.cs:25:13:25:16 | this access |
| UseUseExplosion.cs:24:2188:24:2193 | this access | UseUseExplosion.cs:25:13:25:16 | this access |
-| UseUseExplosion.cs:24:2192:24:2192 | access to local variable x | UseUseExplosion.cs:24:2188:24:2193 | [input] SSA phi read(x) |
-| UseUseExplosion.cs:24:2203:24:2208 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(this.Prop) |
-| UseUseExplosion.cs:24:2203:24:2208 | [input] SSA phi read(x) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:2192:24:2192 | access to local variable x | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:2203:24:2208 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:13:25:16 | access to property Prop |
| UseUseExplosion.cs:24:2203:24:2208 | [post] this access | UseUseExplosion.cs:25:13:25:16 | this access |
| UseUseExplosion.cs:24:2203:24:2208 | this access | UseUseExplosion.cs:25:13:25:16 | this access |
-| UseUseExplosion.cs:24:2207:24:2207 | access to local variable x | UseUseExplosion.cs:24:2203:24:2208 | [input] SSA phi read(x) |
-| UseUseExplosion.cs:24:2218:24:2223 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(this.Prop) |
-| UseUseExplosion.cs:24:2218:24:2223 | [input] SSA phi read(x) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:2207:24:2207 | access to local variable x | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:2218:24:2223 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:13:25:16 | access to property Prop |
| UseUseExplosion.cs:24:2218:24:2223 | [post] this access | UseUseExplosion.cs:25:13:25:16 | this access |
| UseUseExplosion.cs:24:2218:24:2223 | this access | UseUseExplosion.cs:25:13:25:16 | this access |
-| UseUseExplosion.cs:24:2222:24:2222 | access to local variable x | UseUseExplosion.cs:24:2218:24:2223 | [input] SSA phi read(x) |
-| UseUseExplosion.cs:24:2233:24:2238 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(this.Prop) |
-| UseUseExplosion.cs:24:2233:24:2238 | [input] SSA phi read(x) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:2222:24:2222 | access to local variable x | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:2233:24:2238 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:13:25:16 | access to property Prop |
| UseUseExplosion.cs:24:2233:24:2238 | [post] this access | UseUseExplosion.cs:25:13:25:16 | this access |
| UseUseExplosion.cs:24:2233:24:2238 | this access | UseUseExplosion.cs:25:13:25:16 | this access |
-| UseUseExplosion.cs:24:2237:24:2237 | access to local variable x | UseUseExplosion.cs:24:2233:24:2238 | [input] SSA phi read(x) |
-| UseUseExplosion.cs:24:2248:24:2253 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(this.Prop) |
-| UseUseExplosion.cs:24:2248:24:2253 | [input] SSA phi read(x) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:2237:24:2237 | access to local variable x | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:2248:24:2253 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:13:25:16 | access to property Prop |
| UseUseExplosion.cs:24:2248:24:2253 | [post] this access | UseUseExplosion.cs:25:13:25:16 | this access |
| UseUseExplosion.cs:24:2248:24:2253 | this access | UseUseExplosion.cs:25:13:25:16 | this access |
-| UseUseExplosion.cs:24:2252:24:2252 | access to local variable x | UseUseExplosion.cs:24:2248:24:2253 | [input] SSA phi read(x) |
-| UseUseExplosion.cs:24:2263:24:2268 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(this.Prop) |
-| UseUseExplosion.cs:24:2263:24:2268 | [input] SSA phi read(x) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:2252:24:2252 | access to local variable x | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:2263:24:2268 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:13:25:16 | access to property Prop |
| UseUseExplosion.cs:24:2263:24:2268 | [post] this access | UseUseExplosion.cs:25:13:25:16 | this access |
| UseUseExplosion.cs:24:2263:24:2268 | this access | UseUseExplosion.cs:25:13:25:16 | this access |
-| UseUseExplosion.cs:24:2267:24:2267 | access to local variable x | UseUseExplosion.cs:24:2263:24:2268 | [input] SSA phi read(x) |
-| UseUseExplosion.cs:24:2278:24:2283 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(this.Prop) |
-| UseUseExplosion.cs:24:2278:24:2283 | [input] SSA phi read(x) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:2267:24:2267 | access to local variable x | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:2278:24:2283 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:13:25:16 | access to property Prop |
| UseUseExplosion.cs:24:2278:24:2283 | [post] this access | UseUseExplosion.cs:25:13:25:16 | this access |
| UseUseExplosion.cs:24:2278:24:2283 | this access | UseUseExplosion.cs:25:13:25:16 | this access |
-| UseUseExplosion.cs:24:2282:24:2282 | access to local variable x | UseUseExplosion.cs:24:2278:24:2283 | [input] SSA phi read(x) |
-| UseUseExplosion.cs:24:2293:24:2298 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(this.Prop) |
-| UseUseExplosion.cs:24:2293:24:2298 | [input] SSA phi read(x) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:2282:24:2282 | access to local variable x | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:2293:24:2298 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:13:25:16 | access to property Prop |
| UseUseExplosion.cs:24:2293:24:2298 | [post] this access | UseUseExplosion.cs:25:13:25:16 | this access |
| UseUseExplosion.cs:24:2293:24:2298 | this access | UseUseExplosion.cs:25:13:25:16 | this access |
-| UseUseExplosion.cs:24:2297:24:2297 | access to local variable x | UseUseExplosion.cs:24:2293:24:2298 | [input] SSA phi read(x) |
-| UseUseExplosion.cs:24:2308:24:2313 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(this.Prop) |
-| UseUseExplosion.cs:24:2308:24:2313 | [input] SSA phi read(x) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:2297:24:2297 | access to local variable x | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:2308:24:2313 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:13:25:16 | access to property Prop |
| UseUseExplosion.cs:24:2308:24:2313 | [post] this access | UseUseExplosion.cs:25:13:25:16 | this access |
| UseUseExplosion.cs:24:2308:24:2313 | this access | UseUseExplosion.cs:25:13:25:16 | this access |
-| UseUseExplosion.cs:24:2312:24:2312 | access to local variable x | UseUseExplosion.cs:24:2308:24:2313 | [input] SSA phi read(x) |
-| UseUseExplosion.cs:24:2323:24:2328 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(this.Prop) |
-| UseUseExplosion.cs:24:2323:24:2328 | [input] SSA phi read(x) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:2312:24:2312 | access to local variable x | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:2323:24:2328 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:13:25:16 | access to property Prop |
| UseUseExplosion.cs:24:2323:24:2328 | [post] this access | UseUseExplosion.cs:25:13:25:16 | this access |
| UseUseExplosion.cs:24:2323:24:2328 | this access | UseUseExplosion.cs:25:13:25:16 | this access |
-| UseUseExplosion.cs:24:2327:24:2327 | access to local variable x | UseUseExplosion.cs:24:2323:24:2328 | [input] SSA phi read(x) |
-| UseUseExplosion.cs:24:2338:24:2343 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(this.Prop) |
-| UseUseExplosion.cs:24:2338:24:2343 | [input] SSA phi read(x) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:2327:24:2327 | access to local variable x | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:2338:24:2343 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:13:25:16 | access to property Prop |
| UseUseExplosion.cs:24:2338:24:2343 | [post] this access | UseUseExplosion.cs:25:13:25:16 | this access |
| UseUseExplosion.cs:24:2338:24:2343 | this access | UseUseExplosion.cs:25:13:25:16 | this access |
-| UseUseExplosion.cs:24:2342:24:2342 | access to local variable x | UseUseExplosion.cs:24:2338:24:2343 | [input] SSA phi read(x) |
-| UseUseExplosion.cs:24:2353:24:2358 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(this.Prop) |
-| UseUseExplosion.cs:24:2353:24:2358 | [input] SSA phi read(x) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:2342:24:2342 | access to local variable x | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:2353:24:2358 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:13:25:16 | access to property Prop |
| UseUseExplosion.cs:24:2353:24:2358 | [post] this access | UseUseExplosion.cs:25:13:25:16 | this access |
| UseUseExplosion.cs:24:2353:24:2358 | this access | UseUseExplosion.cs:25:13:25:16 | this access |
-| UseUseExplosion.cs:24:2357:24:2357 | access to local variable x | UseUseExplosion.cs:24:2353:24:2358 | [input] SSA phi read(x) |
-| UseUseExplosion.cs:24:2368:24:2373 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(this.Prop) |
-| UseUseExplosion.cs:24:2368:24:2373 | [input] SSA phi read(x) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:2357:24:2357 | access to local variable x | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:2368:24:2373 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:13:25:16 | access to property Prop |
| UseUseExplosion.cs:24:2368:24:2373 | [post] this access | UseUseExplosion.cs:25:13:25:16 | this access |
| UseUseExplosion.cs:24:2368:24:2373 | this access | UseUseExplosion.cs:25:13:25:16 | this access |
-| UseUseExplosion.cs:24:2372:24:2372 | access to local variable x | UseUseExplosion.cs:24:2368:24:2373 | [input] SSA phi read(x) |
-| UseUseExplosion.cs:24:2383:24:2388 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(this.Prop) |
-| UseUseExplosion.cs:24:2383:24:2388 | [input] SSA phi read(x) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:2372:24:2372 | access to local variable x | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:2383:24:2388 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:13:25:16 | access to property Prop |
| UseUseExplosion.cs:24:2383:24:2388 | [post] this access | UseUseExplosion.cs:25:13:25:16 | this access |
| UseUseExplosion.cs:24:2383:24:2388 | this access | UseUseExplosion.cs:25:13:25:16 | this access |
-| UseUseExplosion.cs:24:2387:24:2387 | access to local variable x | UseUseExplosion.cs:24:2383:24:2388 | [input] SSA phi read(x) |
-| UseUseExplosion.cs:24:2398:24:2403 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(this.Prop) |
-| UseUseExplosion.cs:24:2398:24:2403 | [input] SSA phi read(x) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:2387:24:2387 | access to local variable x | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:2398:24:2403 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:13:25:16 | access to property Prop |
| UseUseExplosion.cs:24:2398:24:2403 | [post] this access | UseUseExplosion.cs:25:13:25:16 | this access |
| UseUseExplosion.cs:24:2398:24:2403 | this access | UseUseExplosion.cs:25:13:25:16 | this access |
-| UseUseExplosion.cs:24:2402:24:2402 | access to local variable x | UseUseExplosion.cs:24:2398:24:2403 | [input] SSA phi read(x) |
-| UseUseExplosion.cs:24:2413:24:2418 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(this.Prop) |
-| UseUseExplosion.cs:24:2413:24:2418 | [input] SSA phi read(x) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:2402:24:2402 | access to local variable x | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:2413:24:2418 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:13:25:16 | access to property Prop |
| UseUseExplosion.cs:24:2413:24:2418 | [post] this access | UseUseExplosion.cs:25:13:25:16 | this access |
| UseUseExplosion.cs:24:2413:24:2418 | this access | UseUseExplosion.cs:25:13:25:16 | this access |
-| UseUseExplosion.cs:24:2417:24:2417 | access to local variable x | UseUseExplosion.cs:24:2413:24:2418 | [input] SSA phi read(x) |
-| UseUseExplosion.cs:24:2428:24:2433 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(this.Prop) |
-| UseUseExplosion.cs:24:2428:24:2433 | [input] SSA phi read(x) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:2417:24:2417 | access to local variable x | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:2428:24:2433 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:13:25:16 | access to property Prop |
| UseUseExplosion.cs:24:2428:24:2433 | [post] this access | UseUseExplosion.cs:25:13:25:16 | this access |
| UseUseExplosion.cs:24:2428:24:2433 | this access | UseUseExplosion.cs:25:13:25:16 | this access |
-| UseUseExplosion.cs:24:2432:24:2432 | access to local variable x | UseUseExplosion.cs:24:2428:24:2433 | [input] SSA phi read(x) |
-| UseUseExplosion.cs:24:2443:24:2448 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(this.Prop) |
-| UseUseExplosion.cs:24:2443:24:2448 | [input] SSA phi read(x) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:2432:24:2432 | access to local variable x | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:2443:24:2448 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:13:25:16 | access to property Prop |
| UseUseExplosion.cs:24:2443:24:2448 | [post] this access | UseUseExplosion.cs:25:13:25:16 | this access |
| UseUseExplosion.cs:24:2443:24:2448 | this access | UseUseExplosion.cs:25:13:25:16 | this access |
-| UseUseExplosion.cs:24:2447:24:2447 | access to local variable x | UseUseExplosion.cs:24:2443:24:2448 | [input] SSA phi read(x) |
-| UseUseExplosion.cs:24:2458:24:2463 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(this.Prop) |
-| UseUseExplosion.cs:24:2458:24:2463 | [input] SSA phi read(x) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:2447:24:2447 | access to local variable x | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:2458:24:2463 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:13:25:16 | access to property Prop |
| UseUseExplosion.cs:24:2458:24:2463 | [post] this access | UseUseExplosion.cs:25:13:25:16 | this access |
| UseUseExplosion.cs:24:2458:24:2463 | this access | UseUseExplosion.cs:25:13:25:16 | this access |
-| UseUseExplosion.cs:24:2462:24:2462 | access to local variable x | UseUseExplosion.cs:24:2458:24:2463 | [input] SSA phi read(x) |
-| UseUseExplosion.cs:24:2473:24:2478 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(this.Prop) |
-| UseUseExplosion.cs:24:2473:24:2478 | [input] SSA phi read(x) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:2462:24:2462 | access to local variable x | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:2473:24:2478 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:13:25:16 | access to property Prop |
| UseUseExplosion.cs:24:2473:24:2478 | [post] this access | UseUseExplosion.cs:25:13:25:16 | this access |
| UseUseExplosion.cs:24:2473:24:2478 | this access | UseUseExplosion.cs:25:13:25:16 | this access |
-| UseUseExplosion.cs:24:2477:24:2477 | access to local variable x | UseUseExplosion.cs:24:2473:24:2478 | [input] SSA phi read(x) |
-| UseUseExplosion.cs:24:2488:24:2493 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(this.Prop) |
-| UseUseExplosion.cs:24:2488:24:2493 | [input] SSA phi read(x) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:2477:24:2477 | access to local variable x | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:2488:24:2493 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:13:25:16 | access to property Prop |
| UseUseExplosion.cs:24:2488:24:2493 | [post] this access | UseUseExplosion.cs:25:13:25:16 | this access |
| UseUseExplosion.cs:24:2488:24:2493 | this access | UseUseExplosion.cs:25:13:25:16 | this access |
-| UseUseExplosion.cs:24:2492:24:2492 | access to local variable x | UseUseExplosion.cs:24:2488:24:2493 | [input] SSA phi read(x) |
-| UseUseExplosion.cs:24:2503:24:2508 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(this.Prop) |
-| UseUseExplosion.cs:24:2503:24:2508 | [input] SSA phi read(x) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:2492:24:2492 | access to local variable x | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:2503:24:2508 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:13:25:16 | access to property Prop |
| UseUseExplosion.cs:24:2503:24:2508 | [post] this access | UseUseExplosion.cs:25:13:25:16 | this access |
| UseUseExplosion.cs:24:2503:24:2508 | this access | UseUseExplosion.cs:25:13:25:16 | this access |
-| UseUseExplosion.cs:24:2507:24:2507 | access to local variable x | UseUseExplosion.cs:24:2503:24:2508 | [input] SSA phi read(x) |
-| UseUseExplosion.cs:24:2518:24:2523 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(this.Prop) |
-| UseUseExplosion.cs:24:2518:24:2523 | [input] SSA phi read(x) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:2507:24:2507 | access to local variable x | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:2518:24:2523 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:13:25:16 | access to property Prop |
| UseUseExplosion.cs:24:2518:24:2523 | [post] this access | UseUseExplosion.cs:25:13:25:16 | this access |
| UseUseExplosion.cs:24:2518:24:2523 | this access | UseUseExplosion.cs:25:13:25:16 | this access |
-| UseUseExplosion.cs:24:2522:24:2522 | access to local variable x | UseUseExplosion.cs:24:2518:24:2523 | [input] SSA phi read(x) |
-| UseUseExplosion.cs:24:2533:24:2538 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(this.Prop) |
-| UseUseExplosion.cs:24:2533:24:2538 | [input] SSA phi read(x) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:2522:24:2522 | access to local variable x | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:2533:24:2538 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:13:25:16 | access to property Prop |
| UseUseExplosion.cs:24:2533:24:2538 | [post] this access | UseUseExplosion.cs:25:13:25:16 | this access |
| UseUseExplosion.cs:24:2533:24:2538 | this access | UseUseExplosion.cs:25:13:25:16 | this access |
-| UseUseExplosion.cs:24:2537:24:2537 | access to local variable x | UseUseExplosion.cs:24:2533:24:2538 | [input] SSA phi read(x) |
-| UseUseExplosion.cs:24:2548:24:2553 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(this.Prop) |
-| UseUseExplosion.cs:24:2548:24:2553 | [input] SSA phi read(x) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:2537:24:2537 | access to local variable x | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:2548:24:2553 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:13:25:16 | access to property Prop |
| UseUseExplosion.cs:24:2548:24:2553 | [post] this access | UseUseExplosion.cs:25:13:25:16 | this access |
| UseUseExplosion.cs:24:2548:24:2553 | this access | UseUseExplosion.cs:25:13:25:16 | this access |
-| UseUseExplosion.cs:24:2552:24:2552 | access to local variable x | UseUseExplosion.cs:24:2548:24:2553 | [input] SSA phi read(x) |
-| UseUseExplosion.cs:24:2563:24:2568 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(this.Prop) |
-| UseUseExplosion.cs:24:2563:24:2568 | [input] SSA phi read(x) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:2552:24:2552 | access to local variable x | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:2563:24:2568 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:13:25:16 | access to property Prop |
| UseUseExplosion.cs:24:2563:24:2568 | [post] this access | UseUseExplosion.cs:25:13:25:16 | this access |
| UseUseExplosion.cs:24:2563:24:2568 | this access | UseUseExplosion.cs:25:13:25:16 | this access |
-| UseUseExplosion.cs:24:2567:24:2567 | access to local variable x | UseUseExplosion.cs:24:2563:24:2568 | [input] SSA phi read(x) |
-| UseUseExplosion.cs:24:2578:24:2583 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(this.Prop) |
-| UseUseExplosion.cs:24:2578:24:2583 | [input] SSA phi read(x) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:2567:24:2567 | access to local variable x | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:2578:24:2583 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:13:25:16 | access to property Prop |
| UseUseExplosion.cs:24:2578:24:2583 | [post] this access | UseUseExplosion.cs:25:13:25:16 | this access |
| UseUseExplosion.cs:24:2578:24:2583 | this access | UseUseExplosion.cs:25:13:25:16 | this access |
-| UseUseExplosion.cs:24:2582:24:2582 | access to local variable x | UseUseExplosion.cs:24:2578:24:2583 | [input] SSA phi read(x) |
-| UseUseExplosion.cs:24:2593:24:2598 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(this.Prop) |
-| UseUseExplosion.cs:24:2593:24:2598 | [input] SSA phi read(x) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:2582:24:2582 | access to local variable x | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:2593:24:2598 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:13:25:16 | access to property Prop |
| UseUseExplosion.cs:24:2593:24:2598 | [post] this access | UseUseExplosion.cs:25:13:25:16 | this access |
| UseUseExplosion.cs:24:2593:24:2598 | this access | UseUseExplosion.cs:25:13:25:16 | this access |
-| UseUseExplosion.cs:24:2597:24:2597 | access to local variable x | UseUseExplosion.cs:24:2593:24:2598 | [input] SSA phi read(x) |
-| UseUseExplosion.cs:24:2608:24:2613 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(this.Prop) |
-| UseUseExplosion.cs:24:2608:24:2613 | [input] SSA phi read(x) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:2597:24:2597 | access to local variable x | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:2608:24:2613 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:13:25:16 | access to property Prop |
| UseUseExplosion.cs:24:2608:24:2613 | [post] this access | UseUseExplosion.cs:25:13:25:16 | this access |
| UseUseExplosion.cs:24:2608:24:2613 | this access | UseUseExplosion.cs:25:13:25:16 | this access |
-| UseUseExplosion.cs:24:2612:24:2612 | access to local variable x | UseUseExplosion.cs:24:2608:24:2613 | [input] SSA phi read(x) |
-| UseUseExplosion.cs:24:2623:24:2628 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(this.Prop) |
-| UseUseExplosion.cs:24:2623:24:2628 | [input] SSA phi read(x) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:2612:24:2612 | access to local variable x | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:2623:24:2628 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:13:25:16 | access to property Prop |
| UseUseExplosion.cs:24:2623:24:2628 | [post] this access | UseUseExplosion.cs:25:13:25:16 | this access |
| UseUseExplosion.cs:24:2623:24:2628 | this access | UseUseExplosion.cs:25:13:25:16 | this access |
-| UseUseExplosion.cs:24:2627:24:2627 | access to local variable x | UseUseExplosion.cs:24:2623:24:2628 | [input] SSA phi read(x) |
-| UseUseExplosion.cs:24:2638:24:2643 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(this.Prop) |
-| UseUseExplosion.cs:24:2638:24:2643 | [input] SSA phi read(x) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:2627:24:2627 | access to local variable x | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:2638:24:2643 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:13:25:16 | access to property Prop |
| UseUseExplosion.cs:24:2638:24:2643 | [post] this access | UseUseExplosion.cs:25:13:25:16 | this access |
| UseUseExplosion.cs:24:2638:24:2643 | this access | UseUseExplosion.cs:25:13:25:16 | this access |
-| UseUseExplosion.cs:24:2642:24:2642 | access to local variable x | UseUseExplosion.cs:24:2638:24:2643 | [input] SSA phi read(x) |
-| UseUseExplosion.cs:24:2653:24:2658 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(this.Prop) |
-| UseUseExplosion.cs:24:2653:24:2658 | [input] SSA phi read(x) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:2642:24:2642 | access to local variable x | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:2653:24:2658 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:13:25:16 | access to property Prop |
| UseUseExplosion.cs:24:2653:24:2658 | [post] this access | UseUseExplosion.cs:25:13:25:16 | this access |
| UseUseExplosion.cs:24:2653:24:2658 | this access | UseUseExplosion.cs:25:13:25:16 | this access |
-| UseUseExplosion.cs:24:2657:24:2657 | access to local variable x | UseUseExplosion.cs:24:2653:24:2658 | [input] SSA phi read(x) |
-| UseUseExplosion.cs:24:2668:24:2673 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(this.Prop) |
-| UseUseExplosion.cs:24:2668:24:2673 | [input] SSA phi read(x) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:2657:24:2657 | access to local variable x | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:2668:24:2673 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:13:25:16 | access to property Prop |
| UseUseExplosion.cs:24:2668:24:2673 | [post] this access | UseUseExplosion.cs:25:13:25:16 | this access |
| UseUseExplosion.cs:24:2668:24:2673 | this access | UseUseExplosion.cs:25:13:25:16 | this access |
-| UseUseExplosion.cs:24:2672:24:2672 | access to local variable x | UseUseExplosion.cs:24:2668:24:2673 | [input] SSA phi read(x) |
-| UseUseExplosion.cs:24:2683:24:2688 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(this.Prop) |
-| UseUseExplosion.cs:24:2683:24:2688 | [input] SSA phi read(x) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:2672:24:2672 | access to local variable x | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:2683:24:2688 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:13:25:16 | access to property Prop |
| UseUseExplosion.cs:24:2683:24:2688 | [post] this access | UseUseExplosion.cs:25:13:25:16 | this access |
| UseUseExplosion.cs:24:2683:24:2688 | this access | UseUseExplosion.cs:25:13:25:16 | this access |
-| UseUseExplosion.cs:24:2687:24:2687 | access to local variable x | UseUseExplosion.cs:24:2683:24:2688 | [input] SSA phi read(x) |
-| UseUseExplosion.cs:24:2698:24:2703 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(this.Prop) |
-| UseUseExplosion.cs:24:2698:24:2703 | [input] SSA phi read(x) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:2687:24:2687 | access to local variable x | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:2698:24:2703 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:13:25:16 | access to property Prop |
| UseUseExplosion.cs:24:2698:24:2703 | [post] this access | UseUseExplosion.cs:25:13:25:16 | this access |
| UseUseExplosion.cs:24:2698:24:2703 | this access | UseUseExplosion.cs:25:13:25:16 | this access |
-| UseUseExplosion.cs:24:2702:24:2702 | access to local variable x | UseUseExplosion.cs:24:2698:24:2703 | [input] SSA phi read(x) |
-| UseUseExplosion.cs:24:2713:24:2718 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(this.Prop) |
-| UseUseExplosion.cs:24:2713:24:2718 | [input] SSA phi read(x) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:2702:24:2702 | access to local variable x | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:2713:24:2718 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:13:25:16 | access to property Prop |
| UseUseExplosion.cs:24:2713:24:2718 | [post] this access | UseUseExplosion.cs:25:13:25:16 | this access |
| UseUseExplosion.cs:24:2713:24:2718 | this access | UseUseExplosion.cs:25:13:25:16 | this access |
-| UseUseExplosion.cs:24:2717:24:2717 | access to local variable x | UseUseExplosion.cs:24:2713:24:2718 | [input] SSA phi read(x) |
-| UseUseExplosion.cs:24:2728:24:2733 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(this.Prop) |
-| UseUseExplosion.cs:24:2728:24:2733 | [input] SSA phi read(x) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:2717:24:2717 | access to local variable x | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:2728:24:2733 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:13:25:16 | access to property Prop |
| UseUseExplosion.cs:24:2728:24:2733 | [post] this access | UseUseExplosion.cs:25:13:25:16 | this access |
| UseUseExplosion.cs:24:2728:24:2733 | this access | UseUseExplosion.cs:25:13:25:16 | this access |
-| UseUseExplosion.cs:24:2732:24:2732 | access to local variable x | UseUseExplosion.cs:24:2728:24:2733 | [input] SSA phi read(x) |
-| UseUseExplosion.cs:24:2743:24:2748 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(this.Prop) |
-| UseUseExplosion.cs:24:2743:24:2748 | [input] SSA phi read(x) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:2732:24:2732 | access to local variable x | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:2743:24:2748 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:13:25:16 | access to property Prop |
| UseUseExplosion.cs:24:2743:24:2748 | [post] this access | UseUseExplosion.cs:25:13:25:16 | this access |
| UseUseExplosion.cs:24:2743:24:2748 | this access | UseUseExplosion.cs:25:13:25:16 | this access |
-| UseUseExplosion.cs:24:2747:24:2747 | access to local variable x | UseUseExplosion.cs:24:2743:24:2748 | [input] SSA phi read(x) |
-| UseUseExplosion.cs:24:2758:24:2763 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(this.Prop) |
-| UseUseExplosion.cs:24:2758:24:2763 | [input] SSA phi read(x) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:2747:24:2747 | access to local variable x | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:2758:24:2763 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:13:25:16 | access to property Prop |
| UseUseExplosion.cs:24:2758:24:2763 | [post] this access | UseUseExplosion.cs:25:13:25:16 | this access |
| UseUseExplosion.cs:24:2758:24:2763 | this access | UseUseExplosion.cs:25:13:25:16 | this access |
-| UseUseExplosion.cs:24:2762:24:2762 | access to local variable x | UseUseExplosion.cs:24:2758:24:2763 | [input] SSA phi read(x) |
-| UseUseExplosion.cs:24:2773:24:2778 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(this.Prop) |
-| UseUseExplosion.cs:24:2773:24:2778 | [input] SSA phi read(x) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:2762:24:2762 | access to local variable x | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:2773:24:2778 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:13:25:16 | access to property Prop |
| UseUseExplosion.cs:24:2773:24:2778 | [post] this access | UseUseExplosion.cs:25:13:25:16 | this access |
| UseUseExplosion.cs:24:2773:24:2778 | this access | UseUseExplosion.cs:25:13:25:16 | this access |
-| UseUseExplosion.cs:24:2777:24:2777 | access to local variable x | UseUseExplosion.cs:24:2773:24:2778 | [input] SSA phi read(x) |
-| UseUseExplosion.cs:24:2788:24:2793 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(this.Prop) |
-| UseUseExplosion.cs:24:2788:24:2793 | [input] SSA phi read(x) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:2777:24:2777 | access to local variable x | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:2788:24:2793 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:13:25:16 | access to property Prop |
| UseUseExplosion.cs:24:2788:24:2793 | [post] this access | UseUseExplosion.cs:25:13:25:16 | this access |
| UseUseExplosion.cs:24:2788:24:2793 | this access | UseUseExplosion.cs:25:13:25:16 | this access |
-| UseUseExplosion.cs:24:2792:24:2792 | access to local variable x | UseUseExplosion.cs:24:2788:24:2793 | [input] SSA phi read(x) |
-| UseUseExplosion.cs:24:2803:24:2808 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(this.Prop) |
-| UseUseExplosion.cs:24:2803:24:2808 | [input] SSA phi read(x) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:2792:24:2792 | access to local variable x | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:2803:24:2808 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:13:25:16 | access to property Prop |
| UseUseExplosion.cs:24:2803:24:2808 | [post] this access | UseUseExplosion.cs:25:13:25:16 | this access |
| UseUseExplosion.cs:24:2803:24:2808 | this access | UseUseExplosion.cs:25:13:25:16 | this access |
-| UseUseExplosion.cs:24:2807:24:2807 | access to local variable x | UseUseExplosion.cs:24:2803:24:2808 | [input] SSA phi read(x) |
-| UseUseExplosion.cs:24:2818:24:2823 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(this.Prop) |
-| UseUseExplosion.cs:24:2818:24:2823 | [input] SSA phi read(x) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:2807:24:2807 | access to local variable x | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:2818:24:2823 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:13:25:16 | access to property Prop |
| UseUseExplosion.cs:24:2818:24:2823 | [post] this access | UseUseExplosion.cs:25:13:25:16 | this access |
| UseUseExplosion.cs:24:2818:24:2823 | this access | UseUseExplosion.cs:25:13:25:16 | this access |
-| UseUseExplosion.cs:24:2822:24:2822 | access to local variable x | UseUseExplosion.cs:24:2818:24:2823 | [input] SSA phi read(x) |
-| UseUseExplosion.cs:24:2833:24:2838 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(this.Prop) |
-| UseUseExplosion.cs:24:2833:24:2838 | [input] SSA phi read(x) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:2822:24:2822 | access to local variable x | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:2833:24:2838 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:13:25:16 | access to property Prop |
| UseUseExplosion.cs:24:2833:24:2838 | [post] this access | UseUseExplosion.cs:25:13:25:16 | this access |
| UseUseExplosion.cs:24:2833:24:2838 | this access | UseUseExplosion.cs:25:13:25:16 | this access |
-| UseUseExplosion.cs:24:2837:24:2837 | access to local variable x | UseUseExplosion.cs:24:2833:24:2838 | [input] SSA phi read(x) |
-| UseUseExplosion.cs:24:2848:24:2853 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(this.Prop) |
-| UseUseExplosion.cs:24:2848:24:2853 | [input] SSA phi read(x) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:2837:24:2837 | access to local variable x | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:2848:24:2853 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:13:25:16 | access to property Prop |
| UseUseExplosion.cs:24:2848:24:2853 | [post] this access | UseUseExplosion.cs:25:13:25:16 | this access |
| UseUseExplosion.cs:24:2848:24:2853 | this access | UseUseExplosion.cs:25:13:25:16 | this access |
-| UseUseExplosion.cs:24:2852:24:2852 | access to local variable x | UseUseExplosion.cs:24:2848:24:2853 | [input] SSA phi read(x) |
-| UseUseExplosion.cs:24:2863:24:2868 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(this.Prop) |
-| UseUseExplosion.cs:24:2863:24:2868 | [input] SSA phi read(x) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:2852:24:2852 | access to local variable x | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:2863:24:2868 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:13:25:16 | access to property Prop |
| UseUseExplosion.cs:24:2863:24:2868 | [post] this access | UseUseExplosion.cs:25:13:25:16 | this access |
| UseUseExplosion.cs:24:2863:24:2868 | this access | UseUseExplosion.cs:25:13:25:16 | this access |
-| UseUseExplosion.cs:24:2867:24:2867 | access to local variable x | UseUseExplosion.cs:24:2863:24:2868 | [input] SSA phi read(x) |
-| UseUseExplosion.cs:24:2878:24:2883 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(this.Prop) |
-| UseUseExplosion.cs:24:2878:24:2883 | [input] SSA phi read(x) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:2867:24:2867 | access to local variable x | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:2878:24:2883 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:13:25:16 | access to property Prop |
| UseUseExplosion.cs:24:2878:24:2883 | [post] this access | UseUseExplosion.cs:25:13:25:16 | this access |
| UseUseExplosion.cs:24:2878:24:2883 | this access | UseUseExplosion.cs:25:13:25:16 | this access |
-| UseUseExplosion.cs:24:2882:24:2882 | access to local variable x | UseUseExplosion.cs:24:2878:24:2883 | [input] SSA phi read(x) |
-| UseUseExplosion.cs:24:2893:24:2898 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(this.Prop) |
-| UseUseExplosion.cs:24:2893:24:2898 | [input] SSA phi read(x) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:2882:24:2882 | access to local variable x | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:2893:24:2898 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:13:25:16 | access to property Prop |
| UseUseExplosion.cs:24:2893:24:2898 | [post] this access | UseUseExplosion.cs:25:13:25:16 | this access |
| UseUseExplosion.cs:24:2893:24:2898 | this access | UseUseExplosion.cs:25:13:25:16 | this access |
-| UseUseExplosion.cs:24:2897:24:2897 | access to local variable x | UseUseExplosion.cs:24:2893:24:2898 | [input] SSA phi read(x) |
-| UseUseExplosion.cs:24:2908:24:2913 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(this.Prop) |
-| UseUseExplosion.cs:24:2908:24:2913 | [input] SSA phi read(x) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:2897:24:2897 | access to local variable x | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:2908:24:2913 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:13:25:16 | access to property Prop |
| UseUseExplosion.cs:24:2908:24:2913 | [post] this access | UseUseExplosion.cs:25:13:25:16 | this access |
| UseUseExplosion.cs:24:2908:24:2913 | this access | UseUseExplosion.cs:25:13:25:16 | this access |
-| UseUseExplosion.cs:24:2912:24:2912 | access to local variable x | UseUseExplosion.cs:24:2908:24:2913 | [input] SSA phi read(x) |
-| UseUseExplosion.cs:24:2923:24:2928 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(this.Prop) |
-| UseUseExplosion.cs:24:2923:24:2928 | [input] SSA phi read(x) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:2912:24:2912 | access to local variable x | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:2923:24:2928 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:13:25:16 | access to property Prop |
| UseUseExplosion.cs:24:2923:24:2928 | [post] this access | UseUseExplosion.cs:25:13:25:16 | this access |
| UseUseExplosion.cs:24:2923:24:2928 | this access | UseUseExplosion.cs:25:13:25:16 | this access |
-| UseUseExplosion.cs:24:2927:24:2927 | access to local variable x | UseUseExplosion.cs:24:2923:24:2928 | [input] SSA phi read(x) |
-| UseUseExplosion.cs:24:2938:24:2943 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(this.Prop) |
-| UseUseExplosion.cs:24:2938:24:2943 | [input] SSA phi read(x) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:2927:24:2927 | access to local variable x | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:2938:24:2943 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:13:25:16 | access to property Prop |
| UseUseExplosion.cs:24:2938:24:2943 | [post] this access | UseUseExplosion.cs:25:13:25:16 | this access |
| UseUseExplosion.cs:24:2938:24:2943 | this access | UseUseExplosion.cs:25:13:25:16 | this access |
-| UseUseExplosion.cs:24:2942:24:2942 | access to local variable x | UseUseExplosion.cs:24:2938:24:2943 | [input] SSA phi read(x) |
-| UseUseExplosion.cs:24:2953:24:2958 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(this.Prop) |
-| UseUseExplosion.cs:24:2953:24:2958 | [input] SSA phi read(x) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:2942:24:2942 | access to local variable x | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:2953:24:2958 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:13:25:16 | access to property Prop |
| UseUseExplosion.cs:24:2953:24:2958 | [post] this access | UseUseExplosion.cs:25:13:25:16 | this access |
| UseUseExplosion.cs:24:2953:24:2958 | this access | UseUseExplosion.cs:25:13:25:16 | this access |
-| UseUseExplosion.cs:24:2957:24:2957 | access to local variable x | UseUseExplosion.cs:24:2953:24:2958 | [input] SSA phi read(x) |
-| UseUseExplosion.cs:24:2968:24:2973 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(this.Prop) |
-| UseUseExplosion.cs:24:2968:24:2973 | [input] SSA phi read(x) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:2957:24:2957 | access to local variable x | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:2968:24:2973 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:13:25:16 | access to property Prop |
| UseUseExplosion.cs:24:2968:24:2973 | [post] this access | UseUseExplosion.cs:25:13:25:16 | this access |
| UseUseExplosion.cs:24:2968:24:2973 | this access | UseUseExplosion.cs:25:13:25:16 | this access |
-| UseUseExplosion.cs:24:2972:24:2972 | access to local variable x | UseUseExplosion.cs:24:2968:24:2973 | [input] SSA phi read(x) |
-| UseUseExplosion.cs:24:2983:24:2988 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(this.Prop) |
-| UseUseExplosion.cs:24:2983:24:2988 | [input] SSA phi read(x) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:2972:24:2972 | access to local variable x | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:2983:24:2988 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:13:25:16 | access to property Prop |
| UseUseExplosion.cs:24:2983:24:2988 | [post] this access | UseUseExplosion.cs:25:13:25:16 | this access |
| UseUseExplosion.cs:24:2983:24:2988 | this access | UseUseExplosion.cs:25:13:25:16 | this access |
-| UseUseExplosion.cs:24:2987:24:2987 | access to local variable x | UseUseExplosion.cs:24:2983:24:2988 | [input] SSA phi read(x) |
-| UseUseExplosion.cs:24:2998:24:3003 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(this.Prop) |
-| UseUseExplosion.cs:24:2998:24:3003 | [input] SSA phi read(x) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:2987:24:2987 | access to local variable x | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:2998:24:3003 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:13:25:16 | access to property Prop |
| UseUseExplosion.cs:24:2998:24:3003 | [post] this access | UseUseExplosion.cs:25:13:25:16 | this access |
| UseUseExplosion.cs:24:2998:24:3003 | this access | UseUseExplosion.cs:25:13:25:16 | this access |
-| UseUseExplosion.cs:24:3002:24:3002 | access to local variable x | UseUseExplosion.cs:24:2998:24:3003 | [input] SSA phi read(x) |
-| UseUseExplosion.cs:24:3013:24:3018 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(this.Prop) |
-| UseUseExplosion.cs:24:3013:24:3018 | [input] SSA phi read(x) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:3002:24:3002 | access to local variable x | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:3013:24:3018 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:13:25:16 | access to property Prop |
| UseUseExplosion.cs:24:3013:24:3018 | [post] this access | UseUseExplosion.cs:25:13:25:16 | this access |
| UseUseExplosion.cs:24:3013:24:3018 | this access | UseUseExplosion.cs:25:13:25:16 | this access |
-| UseUseExplosion.cs:24:3017:24:3017 | access to local variable x | UseUseExplosion.cs:24:3013:24:3018 | [input] SSA phi read(x) |
-| UseUseExplosion.cs:24:3028:24:3033 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(this.Prop) |
-| UseUseExplosion.cs:24:3028:24:3033 | [input] SSA phi read(x) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:3017:24:3017 | access to local variable x | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:3028:24:3033 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:13:25:16 | access to property Prop |
| UseUseExplosion.cs:24:3028:24:3033 | [post] this access | UseUseExplosion.cs:25:13:25:16 | this access |
| UseUseExplosion.cs:24:3028:24:3033 | this access | UseUseExplosion.cs:25:13:25:16 | this access |
-| UseUseExplosion.cs:24:3032:24:3032 | access to local variable x | UseUseExplosion.cs:24:3028:24:3033 | [input] SSA phi read(x) |
-| UseUseExplosion.cs:24:3043:24:3048 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(this.Prop) |
-| UseUseExplosion.cs:24:3043:24:3048 | [input] SSA phi read(x) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:3032:24:3032 | access to local variable x | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:3043:24:3048 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:13:25:16 | access to property Prop |
| UseUseExplosion.cs:24:3043:24:3048 | [post] this access | UseUseExplosion.cs:25:13:25:16 | this access |
| UseUseExplosion.cs:24:3043:24:3048 | this access | UseUseExplosion.cs:25:13:25:16 | this access |
-| UseUseExplosion.cs:24:3047:24:3047 | access to local variable x | UseUseExplosion.cs:24:3043:24:3048 | [input] SSA phi read(x) |
-| UseUseExplosion.cs:24:3058:24:3063 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(this.Prop) |
-| UseUseExplosion.cs:24:3058:24:3063 | [input] SSA phi read(x) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:3047:24:3047 | access to local variable x | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:3058:24:3063 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:13:25:16 | access to property Prop |
| UseUseExplosion.cs:24:3058:24:3063 | [post] this access | UseUseExplosion.cs:25:13:25:16 | this access |
| UseUseExplosion.cs:24:3058:24:3063 | this access | UseUseExplosion.cs:25:13:25:16 | this access |
-| UseUseExplosion.cs:24:3062:24:3062 | access to local variable x | UseUseExplosion.cs:24:3058:24:3063 | [input] SSA phi read(x) |
-| UseUseExplosion.cs:24:3073:24:3078 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(this.Prop) |
-| UseUseExplosion.cs:24:3073:24:3078 | [input] SSA phi read(x) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:3062:24:3062 | access to local variable x | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:3073:24:3078 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:13:25:16 | access to property Prop |
| UseUseExplosion.cs:24:3073:24:3078 | [post] this access | UseUseExplosion.cs:25:13:25:16 | this access |
| UseUseExplosion.cs:24:3073:24:3078 | this access | UseUseExplosion.cs:25:13:25:16 | this access |
-| UseUseExplosion.cs:24:3077:24:3077 | access to local variable x | UseUseExplosion.cs:24:3073:24:3078 | [input] SSA phi read(x) |
-| UseUseExplosion.cs:24:3088:24:3093 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(this.Prop) |
-| UseUseExplosion.cs:24:3088:24:3093 | [input] SSA phi read(x) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:3077:24:3077 | access to local variable x | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:3088:24:3093 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:13:25:16 | access to property Prop |
| UseUseExplosion.cs:24:3088:24:3093 | [post] this access | UseUseExplosion.cs:25:13:25:16 | this access |
| UseUseExplosion.cs:24:3088:24:3093 | this access | UseUseExplosion.cs:25:13:25:16 | this access |
-| UseUseExplosion.cs:24:3092:24:3092 | access to local variable x | UseUseExplosion.cs:24:3088:24:3093 | [input] SSA phi read(x) |
-| UseUseExplosion.cs:24:3103:24:3108 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(this.Prop) |
-| UseUseExplosion.cs:24:3103:24:3108 | [input] SSA phi read(x) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:3092:24:3092 | access to local variable x | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:3103:24:3108 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:13:25:16 | access to property Prop |
| UseUseExplosion.cs:24:3103:24:3108 | [post] this access | UseUseExplosion.cs:25:13:25:16 | this access |
| UseUseExplosion.cs:24:3103:24:3108 | this access | UseUseExplosion.cs:25:13:25:16 | this access |
-| UseUseExplosion.cs:24:3107:24:3107 | access to local variable x | UseUseExplosion.cs:24:3103:24:3108 | [input] SSA phi read(x) |
-| UseUseExplosion.cs:24:3118:24:3123 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(this.Prop) |
-| UseUseExplosion.cs:24:3118:24:3123 | [input] SSA phi read(x) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:3107:24:3107 | access to local variable x | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:3118:24:3123 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:13:25:16 | access to property Prop |
| UseUseExplosion.cs:24:3118:24:3123 | [post] this access | UseUseExplosion.cs:25:13:25:16 | this access |
| UseUseExplosion.cs:24:3118:24:3123 | this access | UseUseExplosion.cs:25:13:25:16 | this access |
-| UseUseExplosion.cs:24:3122:24:3122 | access to local variable x | UseUseExplosion.cs:24:3118:24:3123 | [input] SSA phi read(x) |
-| UseUseExplosion.cs:24:3133:24:3138 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(this.Prop) |
-| UseUseExplosion.cs:24:3133:24:3138 | [input] SSA phi read(x) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:3122:24:3122 | access to local variable x | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:3133:24:3138 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:13:25:16 | access to property Prop |
| UseUseExplosion.cs:24:3133:24:3138 | [post] this access | UseUseExplosion.cs:25:13:25:16 | this access |
| UseUseExplosion.cs:24:3133:24:3138 | this access | UseUseExplosion.cs:25:13:25:16 | this access |
-| UseUseExplosion.cs:24:3137:24:3137 | access to local variable x | UseUseExplosion.cs:24:3133:24:3138 | [input] SSA phi read(x) |
-| UseUseExplosion.cs:24:3148:24:3153 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(this.Prop) |
-| UseUseExplosion.cs:24:3148:24:3153 | [input] SSA phi read(x) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:3137:24:3137 | access to local variable x | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:3148:24:3153 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:13:25:16 | access to property Prop |
| UseUseExplosion.cs:24:3148:24:3153 | [post] this access | UseUseExplosion.cs:25:13:25:16 | this access |
| UseUseExplosion.cs:24:3148:24:3153 | this access | UseUseExplosion.cs:25:13:25:16 | this access |
-| UseUseExplosion.cs:24:3152:24:3152 | access to local variable x | UseUseExplosion.cs:24:3148:24:3153 | [input] SSA phi read(x) |
-| UseUseExplosion.cs:24:3163:24:3168 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(this.Prop) |
-| UseUseExplosion.cs:24:3163:24:3168 | [input] SSA phi read(x) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:3152:24:3152 | access to local variable x | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:3163:24:3168 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:13:25:16 | access to property Prop |
| UseUseExplosion.cs:24:3163:24:3168 | [post] this access | UseUseExplosion.cs:25:13:25:16 | this access |
| UseUseExplosion.cs:24:3163:24:3168 | this access | UseUseExplosion.cs:25:13:25:16 | this access |
-| UseUseExplosion.cs:24:3167:24:3167 | access to local variable x | UseUseExplosion.cs:24:3163:24:3168 | [input] SSA phi read(x) |
-| UseUseExplosion.cs:24:3178:24:3183 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(this.Prop) |
-| UseUseExplosion.cs:24:3178:24:3183 | [input] SSA phi read(x) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:3167:24:3167 | access to local variable x | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:3178:24:3183 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:13:25:16 | access to property Prop |
| UseUseExplosion.cs:24:3178:24:3183 | [post] this access | UseUseExplosion.cs:25:13:25:16 | this access |
| UseUseExplosion.cs:24:3178:24:3183 | this access | UseUseExplosion.cs:25:13:25:16 | this access |
-| UseUseExplosion.cs:24:3182:24:3182 | access to local variable x | UseUseExplosion.cs:24:3178:24:3183 | [input] SSA phi read(x) |
-| UseUseExplosion.cs:24:3193:24:3198 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(this.Prop) |
-| UseUseExplosion.cs:24:3193:24:3198 | [input] SSA phi read(x) | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:3182:24:3182 | access to local variable x | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
+| UseUseExplosion.cs:24:3193:24:3198 | [input] SSA phi read(this.Prop) | UseUseExplosion.cs:25:13:25:16 | access to property Prop |
| UseUseExplosion.cs:24:3193:24:3198 | [post] this access | UseUseExplosion.cs:25:13:25:16 | this access |
| UseUseExplosion.cs:24:3193:24:3198 | this access | UseUseExplosion.cs:25:13:25:16 | this access |
-| UseUseExplosion.cs:24:3197:24:3197 | access to local variable x | UseUseExplosion.cs:24:3193:24:3198 | [input] SSA phi read(x) |
-| UseUseExplosion.cs:25:9:25:3199 | SSA phi read(this.Prop) | UseUseExplosion.cs:25:13:25:16 | access to property Prop |
+| UseUseExplosion.cs:24:3197:24:3197 | access to local variable x | UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) |
| UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) | UseUseExplosion.cs:25:1712:25:1712 | access to local variable x |
| UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) | UseUseExplosion.cs:25:1727:25:1727 | access to local variable x |
| UseUseExplosion.cs:25:9:25:3199 | SSA phi read(x) | UseUseExplosion.cs:25:1742:25:1742 | access to local variable x |
diff --git a/csharp/ql/test/utils/modelgenerator/dataflow/Summaries.cs b/csharp/ql/test/utils/modelgenerator/dataflow/Summaries.cs
index 2d8bbc8912b..7a6f16f383e 100644
--- a/csharp/ql/test/utils/modelgenerator/dataflow/Summaries.cs
+++ b/csharp/ql/test/utils/modelgenerator/dataflow/Summaries.cs
@@ -1034,3 +1034,40 @@ public class AvoidDuplicateLifted
}
}
}
+
+public class ParameterModifiers
+{
+ // contentbased-summary=Models;ParameterModifiers;false;Copy;(System.Object,System.Object);;Argument[0];Argument[1];value;dfc-generated
+ // summary=Models;ParameterModifiers;false;Copy;(System.Object,System.Object);;Argument[0];Argument[1];taint;df-generated
+ public void Copy(object key, out object value)
+ {
+ value = key;
+ }
+
+ // contentbased-summary=Models;ParameterModifiers;false;CopyToRef;(System.Object,System.Object);;Argument[0];Argument[1];value;dfc-generated
+ // summary=Models;ParameterModifiers;false;CopyToRef;(System.Object,System.Object);;Argument[0];Argument[1];taint;df-generated
+ public void CopyToRef(object key, ref object value)
+ {
+ value = key;
+ }
+
+ // No summaries as we disregard flow from a parameter to itself.
+ // neutral=Models;ParameterModifiers;RefParamFlowToSelf;(System.Object,System.Boolean);summary;df-generated
+ public void RefParamFlowToSelf(ref object value, bool b)
+ {
+ value = b ? value : null;
+ }
+
+ // neutral=Models;ParameterModifiers;RefParamUse;(System.Object);summary;df-generated
+ public void RefParamUse(ref object value)
+ {
+ var b = value is null;
+ }
+
+ // contentbased-summary=Models;ParameterModifiers;false;InReturn;(System.Object);;Argument[0];ReturnValue;value;dfc-generated
+ // summary=Models;ParameterModifiers;false;InReturn;(System.Object);;Argument[0];ReturnValue;taint;df-generated
+ public object InReturn(in object v)
+ {
+ return v;
+ }
+}
diff --git a/docs/codeql/codeql-language-guides/customizing-library-models-for-javascript.rst b/docs/codeql/codeql-language-guides/customizing-library-models-for-javascript.rst
index b4a3446e942..fa2c1d4e8a8 100644
--- a/docs/codeql/codeql-language-guides/customizing-library-models-for-javascript.rst
+++ b/docs/codeql/codeql-language-guides/customizing-library-models-for-javascript.rst
@@ -349,6 +349,48 @@ Note that this flow is already recognized by the CodeQL JS analysis, but for thi
- The last column, **value**, indicates the kind of flow to add. The value **value** means the input value is unchanged as
it flows to the output.
+
+Example: Modeling properties injected by a middleware function
+--------------------------------------------------------------
+
+In this example, we'll show how to model a hypothetical middleware function that adds a tainted value
+on the incoming request objects:
+
+.. code-block:: js
+
+ const express = require('express')
+ const app = express()
+
+ app.use(require('@example/middleware').injectData())
+
+ app.get('/foo', (req, res) => {
+ req.data; // <-- mark 'req.data' as a taint source
+ });
+
+This can be achieved with the following data extension:
+
+.. code-block:: yaml
+
+ extensions:
+ - addsTo:
+ pack: codeql/javascript-all
+ extensible: sourceModel
+ data:
+ - [
+ "@example/middleware",
+ "Member[injectData].ReturnValue.GuardedRouteHandler.Parameter[0].Member[data]",
+ "remote",
+ ]
+
+- Since we're adding a new taint source, we add a tuple to the **sourceModel** extensible predicate.
+- The first column, **"@example/middleware"**, begins the search at imports of the hypothetical NPM package **@example/middleware**.
+- **Member[injectData]** selects accesses to the **injectData** member.
+- **ReturnValue** selects the return value of the call to **injectData**.
+- **GuardedRouteHandler** interprets the current value as a middleware function and selects all route handlers guarded by that middleware. Since the current value is passd to **app.use()**, the callback subsequently passed to **app.get()** is seen as a guarded route handler.
+- **Parameter[0]** selects the first parameter of the callback (the parameter named **req**).
+- **Member[data]** selects accesses to the **data** property of the **req** object.
+- Finally, the kind **remote** indicates that this is considered a source of remote flow.
+
Reference material
------------------
@@ -494,6 +536,12 @@ Components related to decorators:
- **DecoratedParameter** selects a parameter that is decorated by the current value.
- **DecoratedMember** selects a method, field, or accessor that is decorated by the current value.
+Additionally there is a component related to middleware functions:
+
+- **GuardedRouteHandler** interprets the current value as a middleware function, and selects any route handler function that comes after it in the routing hierarchy.
+ This can be used to model properties injected onto request and response objects, such as **req.db** after a middleware that injects a database connection.
+ Note that this currently over-approximates the set of route handlers but may be made more accurate in the future.
+
Additional notes about the syntax of operands:
- Multiple operands may be given to a single component, as a shorthand for the union of the operands. For example, **Member[foo,bar]** matches the union of **Member[foo]** and **Member[bar]**.
diff --git a/go/documentation/library-coverage/coverage.csv b/go/documentation/library-coverage/coverage.csv
index aa938f4c2bb..d8091bbda64 100644
--- a/go/documentation/library-coverage/coverage.csv
+++ b/go/documentation/library-coverage/coverage.csv
@@ -21,7 +21,7 @@ errors,,,3,,,,,,,,,,,,,,,,,,,,,,,3,
expvar,,,6,,,,,,,,,,,,,,,,,,,,,,,6,
fmt,3,,16,,,,3,,,,,,,,,,,,,,,,,,,16,
github.com/ChrisTrenkamp/goxpath,3,,,,,,,,,,,,,,,,,,3,,,,,,,,
-github.com/Masterminds/squirrel,32,,,,,,,,,,,,,,32,,,,,,,,,,,,
+github.com/Masterminds/squirrel,32,27,,,,,,,,,,,,,32,,,,,,27,,,,,,
github.com/Sirupsen/logrus,145,,,,,,145,,,,,,,,,,,,,,,,,,,,
github.com/antchfx/htmlquery,4,,,,,,,,,,,,,,,,,,4,,,,,,,,
github.com/antchfx/jsonquery,4,,,,,,,,,,,,,,,,,,4,,,,,,,,
@@ -77,7 +77,7 @@ github.com/kataras/iris/server/web/context,6,,,,,,,,6,,,,,,,,,,,,,,,,,,
github.com/kataras/jwt,5,,,,5,,,,,,,,,,,,,,,,,,,,,,
github.com/kelseyhightower/envconfig,,6,,,,,,,,,,,,,,,,,,,,6,,,,,
github.com/labstack/echo,3,12,2,,,,,,2,,,,,,,1,,,,,,,,12,,2,
-github.com/lann/squirrel,32,,,,,,,,,,,,,,32,,,,,,,,,,,,
+github.com/lann/squirrel,32,27,,,,,,,,,,,,,32,,,,,,27,,,,,,
github.com/lestrrat-go/jwx,2,,,,2,,,,,,,,,,,,,,,,,,,,,,
github.com/lestrrat-go/libxml2/parser,3,,,,,,,,,,,,,,,,,,3,,,,,,,,
github.com/lestrrat/go-jwx/jwk,1,,,,1,,,,,,,,,,,,,,,,,,,,,,
@@ -106,7 +106,7 @@ google.golang.org/protobuf/internal/encoding/text,,,1,,,,,,,,,,,,,,,,,,,,,,,1,
google.golang.org/protobuf/internal/impl,,,2,,,,,,,,,,,,,,,,,,,,,,,2,
google.golang.org/protobuf/proto,,,8,,,,,,,,,,,,,,,,,,,,,,,8,
google.golang.org/protobuf/reflect/protoreflect,,,1,,,,,,,,,,,,,,,,,,,,,,,1,
-gopkg.in/Masterminds/squirrel,32,,,,,,,,,,,,,,32,,,,,,,,,,,,
+gopkg.in/Masterminds/squirrel,32,27,,,,,,,,,,,,,32,,,,,,27,,,,,,
gopkg.in/couchbase/gocb,8,22,48,,,,,8,,,,,,,,,,,,,22,,,,,48,
gopkg.in/glog,90,,,,,,90,,,,,,,,,,,,,,,,,,,,
gopkg.in/go-jose/go-jose,3,,4,,2,1,,,,,,,,,,,,,,,,,,,,4,
diff --git a/go/documentation/library-coverage/coverage.rst b/go/documentation/library-coverage/coverage.rst
index 08f7b73d800..2f45f4b7e33 100644
--- a/go/documentation/library-coverage/coverage.rst
+++ b/go/documentation/library-coverage/coverage.rst
@@ -31,7 +31,7 @@ Go framework & library support
`MongoDB Go Driver `_,``go.mongodb.org/mongo-driver*``,11,5,14
`Revel `_,"``github.com/revel/revel*``, ``github.com/robfig/revel*``",46,20,4
`SendGrid `_,``github.com/sendgrid/sendgrid-go*``,,1,
- `Squirrel `_,"``github.com/Masterminds/squirrel*``, ``github.com/lann/squirrel*``, ``gopkg.in/Masterminds/squirrel``",,,96
+ `Squirrel `_,"``github.com/Masterminds/squirrel*``, ``github.com/lann/squirrel*``, ``gopkg.in/Masterminds/squirrel``",81,,96
`Standard library `_,"````, ``archive/*``, ``bufio``, ``bytes``, ``cmp``, ``compress/*``, ``container/*``, ``context``, ``crypto``, ``crypto/*``, ``database/*``, ``debug/*``, ``embed``, ``encoding``, ``encoding/*``, ``errors``, ``expvar``, ``flag``, ``fmt``, ``go/*``, ``hash``, ``hash/*``, ``html``, ``html/*``, ``image``, ``image/*``, ``index/*``, ``io``, ``io/*``, ``log``, ``log/*``, ``maps``, ``math``, ``math/*``, ``mime``, ``mime/*``, ``net``, ``net/*``, ``os``, ``os/*``, ``path``, ``path/*``, ``plugin``, ``reflect``, ``reflect/*``, ``regexp``, ``regexp/*``, ``slices``, ``sort``, ``strconv``, ``strings``, ``sync``, ``sync/*``, ``syscall``, ``syscall/*``, ``testing``, ``testing/*``, ``text/*``, ``time``, ``time/*``, ``unicode``, ``unicode/*``, ``unsafe``, ``weak``",52,609,104
`XORM `_,"``github.com/go-xorm/xorm*``, ``xorm.io/xorm*``",,,68
`XPath `_,``github.com/antchfx/xpath*``,,,4
@@ -74,5 +74,5 @@ Go framework & library support
`yaml `_,``gopkg.in/yaml*``,,9,
`zap `_,``go.uber.org/zap*``,,11,33
Others,``github.com/kanikanema/gorqlite``,8,2,24
- Totals,,560,1048,1556
+ Totals,,641,1048,1556
diff --git a/go/ql/lib/change-notes/2025-03-02-squirrel-source-models.md b/go/ql/lib/change-notes/2025-03-02-squirrel-source-models.md
new file mode 100644
index 00000000000..05896168630
--- /dev/null
+++ b/go/ql/lib/change-notes/2025-03-02-squirrel-source-models.md
@@ -0,0 +1,5 @@
+---
+category: minorAnalysis
+---
+* Added `database` source models for the `github.com/Masterminds/squirrel` ORM package.
+
diff --git a/go/ql/lib/ext/github.com.mastermind.squirrel.model.yml b/go/ql/lib/ext/github.com.masterminds.squirrel.model.yml
similarity index 59%
rename from go/ql/lib/ext/github.com.mastermind.squirrel.model.yml
rename to go/ql/lib/ext/github.com.masterminds.squirrel.model.yml
index 6f3c5830e45..3544f0ac3cf 100644
--- a/go/ql/lib/ext/github.com.mastermind.squirrel.model.yml
+++ b/go/ql/lib/ext/github.com.masterminds.squirrel.model.yml
@@ -6,6 +6,37 @@ extensions:
- ["squirrel", "github.com/Masterminds/squirrel"]
- ["squirrel", "gopkg.in/Masterminds/squirrel"]
- ["squirrel", "github.com/lann/squirrel"]
+ - addsTo:
+ pack: codeql/go-all
+ extensible: sourceModel
+ data:
+ - ["group:squirrel", "", True, "QueryContextWith", "", "", "ReturnValue[0]", "database", "manual"]
+ - ["group:squirrel", "", True, "QueryRowContextWith", "", "", "ReturnValue", "database", "manual"]
+ - ["group:squirrel", "", True, "QueryRowWith", "", "", "ReturnValue", "database", "manual"]
+ - ["group:squirrel", "", True, "QueryWith", "", "", "ReturnValue[0]", "database", "manual"]
+ - ["group:squirrel", "DeleteBuilder", True, "Query", "", "", "ReturnValue[0]", "database", "manual"]
+ - ["group:squirrel", "DeleteBuilder", True, "QueryContext", "", "", "ReturnValue[0]", "database", "manual"]
+ - ["group:squirrel", "DeleteBuilder", True, "QueryRowContext", "", "", "ReturnValue[0]", "database", "manual"]
+ - ["group:squirrel", "InsertBuilder", True, "Query", "", "", "ReturnValue[0]", "database", "manual"]
+ - ["group:squirrel", "InsertBuilder", True, "QueryContext", "", "", "ReturnValue[0]", "database", "manual"]
+ - ["group:squirrel", "InsertBuilder", True, "QueryRow", "", "", "ReturnValue[0]", "database", "manual"]
+ - ["group:squirrel", "InsertBuilder", True, "QueryRowContext", "", "", "ReturnValue[0]", "database", "manual"]
+ - ["group:squirrel", "QueryRower", True, "QueryRow", "", "", "ReturnValue[0]", "database", "manual"]
+ - ["group:squirrel", "QueryRowerContext", True, "QueryRowContext", "", "", "ReturnValue[0]", "database", "manual"]
+ - ["group:squirrel", "Queryer", True, "Query", "", "", "ReturnValue[0]", "database", "manual"]
+ - ["group:squirrel", "QueryerContext", True, "QueryContext", "", "", "ReturnValue[0]", "database", "manual"]
+ - ["group:squirrel", "SelectBuilder", True, "Query", "", "", "ReturnValue[0]", "database", "manual"]
+ - ["group:squirrel", "SelectBuilder", True, "QueryContext", "", "", "ReturnValue[0]", "database", "manual"]
+ - ["group:squirrel", "SelectBuilder", True, "QueryRow", "", "", "ReturnValue[0]", "database", "manual"]
+ - ["group:squirrel", "SelectBuilder", True, "QueryRowContext", "", "", "ReturnValue[0]", "database", "manual"]
+ - ["group:squirrel", "StdSql", True, "Query", "", "", "ReturnValue[0]", "database", "manual"]
+ - ["group:squirrel", "StdSql", True, "QueryRow", "", "", "ReturnValue", "database", "manual"]
+ - ["group:squirrel", "StdSqlCtx", True, "QueryContext", "", "", "ReturnValue[0]", "database", "manual"]
+ - ["group:squirrel", "StdSqlCtx", True, "QueryRowContext", "", "", "ReturnValue", "database", "manual"]
+ - ["group:squirrel", "UpdateBuilder", True, "Query", "", "", "ReturnValue[0]", "database", "manual"]
+ - ["group:squirrel", "UpdateBuilder", True, "QueryContext", "", "", "ReturnValue[0]", "database", "manual"]
+ - ["group:squirrel", "UpdateBuilder", True, "QueryRow", "", "", "ReturnValue[0]", "database", "manual"]
+ - ["group:squirrel", "UpdateBuilder", True, "QueryRowContext", "", "", "ReturnValue[0]", "database", "manual"]
- addsTo:
pack: codeql/go-all
extensible: sinkModel
@@ -49,3 +80,5 @@ extensions:
- ["group:squirrel", "UpdateBuilder", True, "Suffix", "", "", "Argument[0]", "sql-injection", "manual"]
- ["group:squirrel", "UpdateBuilder", True, "Table", "", "", "Argument[0]", "sql-injection", "manual"]
# UpdateBuilder.Where has to be modeled in QL to avoid FPs when a non-string argument is used
+
+ # There are summary models for Row.Scan, RowScanner.Scan, {Insert,Delete,Select,Update}Builder.Scan and {Insert,Delete,Select,Update}Builder.ScanContext modeled in QL
diff --git a/go/ql/lib/go.qll b/go/ql/lib/go.qll
index df725017dc8..51ff4916e16 100644
--- a/go/ql/lib/go.qll
+++ b/go/ql/lib/go.qll
@@ -57,6 +57,7 @@ import semmle.go.frameworks.Protobuf
import semmle.go.frameworks.Revel
import semmle.go.frameworks.Spew
import semmle.go.frameworks.SQL
+import semmle.go.frameworks.Squirrel
import semmle.go.frameworks.Stdlib
import semmle.go.frameworks.SystemCommandExecutors
import semmle.go.frameworks.Testing
diff --git a/go/ql/lib/semmle/go/frameworks/Squirrel.qll b/go/ql/lib/semmle/go/frameworks/Squirrel.qll
new file mode 100644
index 00000000000..c7d75003cfe
--- /dev/null
+++ b/go/ql/lib/semmle/go/frameworks/Squirrel.qll
@@ -0,0 +1,85 @@
+/**
+ * Provides classes modeling security-relevant aspects of the `squirrel` ORM package.
+ */
+
+import go
+
+/**
+ * Provides classes modeling security-relevant aspects of the `squirrel` ORM package.
+ */
+module Squirrel {
+ private string packagePath() {
+ result =
+ package([
+ "github.com/Masterminds/squirrel",
+ "github.com/lann/squirrel",
+ "gopkg.in/Masterminds/squirrel",
+ ], "")
+ }
+
+ private class RowScan extends TaintTracking::FunctionModel, Method {
+ FunctionInput inp;
+ FunctionOutput outp;
+
+ RowScan() {
+ // signature: func (r *Row) Scan(dest ...interface{}) error
+ this.hasQualifiedName(packagePath(), "Row", "Scan") and
+ inp.isReceiver() and
+ outp.isParameter(_)
+ }
+
+ override predicate hasTaintFlow(FunctionInput input, FunctionOutput output) {
+ input = inp and output = outp
+ }
+ }
+
+ private class RowScannerScan extends TaintTracking::FunctionModel, Method {
+ FunctionInput inp;
+ FunctionOutput outp;
+
+ RowScannerScan() {
+ // signature: func (rs *RowScanner) Scan(dest ...interface{}) error
+ this.hasQualifiedName(packagePath(), "RowScanner", "Scan") and
+ inp.isReceiver() and
+ outp.isParameter(_)
+ }
+
+ override predicate hasTaintFlow(FunctionInput input, FunctionOutput output) {
+ input = inp and output = outp
+ }
+ }
+
+ private class BuilderScan extends TaintTracking::FunctionModel, Method {
+ FunctionInput inp;
+ FunctionOutput outp;
+
+ BuilderScan() {
+ // signature: func (b {Insert,Delete,Select,Update}Builder) Scan(dest ...interface{}) error
+ this.hasQualifiedName(packagePath(),
+ ["DeleteBuilder", "InsertBuilder", "SelectBuilder", "UpdateBuilder"], "Scan") and
+ inp.isReceiver() and
+ outp.isParameter(_)
+ }
+
+ override predicate hasTaintFlow(FunctionInput input, FunctionOutput output) {
+ input = inp and output = outp
+ }
+ }
+
+ private class BuilderScanContext extends TaintTracking::FunctionModel, Method {
+ FunctionInput inp;
+ FunctionOutput outp;
+
+ BuilderScanContext() {
+ // signature: func (b {Insert,Delete,Select,Update}Builder) ScanContext(ctx context.Context, dest ...interface{}) error
+ this.hasQualifiedName(packagePath(),
+ ["DeleteBuilder", "InsertBuilder", "SelectBuilder", "UpdateBuilder"], "ScanContext") and
+ inp.isReceiver() and
+ exists(int i | i > 0 | outp.isParameter(i))
+ }
+
+ override predicate hasTaintFlow(FunctionInput input, FunctionOutput output) {
+ input = inp and output = outp
+ }
+ }
+}
diff --git a/go/ql/src/codeql-suites/go-ccr.qls b/go/ql/src/codeql-suites/go-code-quality.qls
similarity index 100%
rename from go/ql/src/codeql-suites/go-ccr.qls
rename to go/ql/src/codeql-suites/go-code-quality.qls
diff --git a/go/ql/test/library-tests/semmle/go/dataflow/flowsources/local/database/go.mod b/go/ql/test/library-tests/semmle/go/dataflow/flowsources/local/database/go.mod
index 9a16d637f9b..560bcd759c3 100644
--- a/go/ql/test/library-tests/semmle/go/dataflow/flowsources/local/database/go.mod
+++ b/go/ql/test/library-tests/semmle/go/dataflow/flowsources/local/database/go.mod
@@ -8,9 +8,11 @@ require (
github.com/couchbase/gocb v1.6.7
github.com/couchbase/gocb/v2 v2.9.4
github.com/jmoiron/sqlx v1.4.0
+ github.com/Masterminds/squirrel v1.5.4
github.com/rqlite/gorqlite v0.0.0-20250128004930-114c7828b55a
go.mongodb.org/mongo-driver v1.17.3
gorm.io/gorm v1.25.12
+ github.com/nonexistent/sources v0.0.0-20250300000000-000000000000
)
require (
diff --git a/go/ql/test/library-tests/semmle/go/dataflow/flowsources/local/database/source.ext.yml b/go/ql/test/library-tests/semmle/go/dataflow/flowsources/local/database/source.ext.yml
index 853b9e9a719..5e7e11e1b31 100644
--- a/go/ql/test/library-tests/semmle/go/dataflow/flowsources/local/database/source.ext.yml
+++ b/go/ql/test/library-tests/semmle/go/dataflow/flowsources/local/database/source.ext.yml
@@ -3,4 +3,9 @@ extensions:
pack: codeql/threat-models
extensible: threatModelConfiguration
data:
- - ["database", true, 0]
\ No newline at end of file
+ - ["database", true, 0]
+ - addsTo:
+ pack: codeql/go-all
+ extensible: sourceModel
+ data:
+ - ["github.com/nonexistent/sources", "", False, "Source", "", "", "ReturnValue", "database", "manual"]
\ No newline at end of file
diff --git a/go/ql/test/library-tests/semmle/go/dataflow/flowsources/local/database/test.ext.yml b/go/ql/test/library-tests/semmle/go/dataflow/flowsources/local/database/test.ext.yml
index 00f4b3659c3..45623fd20ad 100644
--- a/go/ql/test/library-tests/semmle/go/dataflow/flowsources/local/database/test.ext.yml
+++ b/go/ql/test/library-tests/semmle/go/dataflow/flowsources/local/database/test.ext.yml
@@ -5,3 +5,9 @@ extensions:
extensible: threatModelConfiguration
data:
- ["database", true, 0]
+
+ - addsTo:
+ pack: codeql/go-all
+ extensible: sourceModel
+ data:
+ - ["github.com/nonexistent/sources", "", False, "Source", "", "", "ReturnValue", "database", "manual"]
\ No newline at end of file
diff --git a/go/ql/test/library-tests/semmle/go/dataflow/flowsources/local/database/test_Masterminds_squirrel.go b/go/ql/test/library-tests/semmle/go/dataflow/flowsources/local/database/test_Masterminds_squirrel.go
new file mode 100644
index 00000000000..cc1418e884c
--- /dev/null
+++ b/go/ql/test/library-tests/semmle/go/dataflow/flowsources/local/database/test_Masterminds_squirrel.go
@@ -0,0 +1,291 @@
+package test
+
+//go:generate depstubber -vendor github.com/Masterminds/squirrel DeleteBuilder,InsertBuilder,QueryRower,QueryRowerContext,Queryer,QueryerContext,SelectBuilder,StdSql,StdSqlCtx,UpdateBuilder QueryContextWith,QueryRowContextWith,QueryRowWith,QueryWith
+
+import (
+ "context"
+
+ "github.com/Masterminds/squirrel"
+ src "github.com/nonexistent/sources"
+)
+
+func test_Masterminds_squirrel_QueryRower(ctx context.Context, db squirrel.QueryRower, sqlizer squirrel.Sqlizer) {
+ scanner := db.QueryRow("") // $ source
+
+ var r1, r2, r3 string
+ scanner.Scan(&r1, &r2, &r3)
+
+ sink(r1) // $ hasTaintFlow="r1"
+ sink(r2) // $ hasTaintFlow="r2"
+ sink(r3) // $ hasTaintFlow="r3"
+
+ scanner2 := squirrel.QueryRowWith(db, sqlizer) // $ source
+
+ var r4, r5, r6 string
+ scanner2.Scan(&r4, &r5, &r6)
+
+ sink(r4) // $ hasTaintFlow="r4"
+ sink(r5) // $ hasTaintFlow="r5"
+ sink(r6) // $ hasTaintFlow="r6"
+}
+
+func test_Masterminds_squirrel_QueryRowerContext(ctx context.Context, db squirrel.QueryRowerContext, sqlizer squirrel.Sqlizer) {
+ scanner := db.QueryRowContext(ctx, "") // $ source
+
+ var r1, r2, r3 string
+ scanner.Scan(&r1, &r2, &r3)
+
+ sink(r1) // $ hasTaintFlow="r1"
+ sink(r2) // $ hasTaintFlow="r2"
+ sink(r3) // $ hasTaintFlow="r3"
+
+ scanner2 := squirrel.QueryRowContextWith(ctx, db, sqlizer) // $ source
+
+ var r4, r5, r6 string
+ scanner2.Scan(&r4, &r5, &r6)
+
+ sink(r4) // $ hasTaintFlow="r4"
+ sink(r5) // $ hasTaintFlow="r5"
+ sink(r6) // $ hasTaintFlow="r6"
+}
+
+func test_Masterminds_squirrel_Queryer(ctx context.Context, db squirrel.Queryer, sqlizer squirrel.Sqlizer) {
+ v1, err := db.Query("") // $ source
+ if err != nil {
+ return
+ }
+ sink(v1) // $ hasTaintFlow="v1"
+
+ v2, err := squirrel.QueryWith(db, sqlizer) // $ source
+ if err != nil {
+ return
+ }
+ sink(v2) // $ hasTaintFlow="v2"
+}
+
+func test_Masterminds_squirrel_QueryerContext(ctx context.Context, db squirrel.QueryerContext, sqlizer squirrel.Sqlizer) {
+ v1, err := db.QueryContext(ctx, "") // $ source
+ if err != nil {
+ return
+ }
+ sink(v1) // $ hasTaintFlow="v1"
+
+ v2, err := squirrel.QueryContextWith(ctx, db, sqlizer) // $ source
+ if err != nil {
+ return
+ }
+ sink(v2) // $ hasTaintFlow="v2"
+}
+
+// StdSqlCtx extends StdSql so we can test both with a StdSqlCtx
+func test_Masterminds_squirrel_StdSql_StdSqlCtx(ctx context.Context, std squirrel.StdSqlCtx) {
+ v1, err := std.Query("") // $ source
+ if err != nil {
+ return
+ }
+ sink(v1) // $ hasTaintFlow="v1"
+
+ v2, err := std.QueryContext(ctx, "") // $ source
+ if err != nil {
+ return
+ }
+
+ sink(v2) // $ hasTaintFlow="v2"
+
+ s3 := std.QueryRow("") // $ source
+
+ if err != nil {
+ return
+ }
+ var r31, r32, r33 string
+ s3.Scan(&r31, &r32, &r33)
+
+ sink(r31) // $ hasTaintFlow="r31"
+ sink(r32) // $ hasTaintFlow="r32"
+ sink(r33) // $ hasTaintFlow="r33"
+
+ s4 := std.QueryRowContext(ctx, "") // $ source
+
+ var r41, r42, r43 string
+ s4.Scan(&r41, &r42, &r43)
+
+ sink(r41) // $ hasTaintFlow="r41"
+ sink(r42) // $ hasTaintFlow="r42"
+ sink(r43) // $ hasTaintFlow="r43"
+}
+
+func test_Masterminds_squirrel_DeleteBuilder(ctx context.Context, builder squirrel.DeleteBuilder) {
+ v1, err := builder.Query() // $ source
+ if err != nil {
+ return
+ }
+ sink(v1) // $ hasTaintFlow="v1"
+
+ v2, err := builder.QueryContext(ctx) // $ source
+ if err != nil {
+ return
+ }
+ sink(v2) // $ hasTaintFlow="v2"
+
+ s3 := builder.QueryRowContext(ctx) // $ source
+
+ var r31, r32, r33 string
+ s3.Scan(&r31, &r32, &r33)
+
+ sink(r31) // $ hasTaintFlow="r31"
+ sink(r32) // $ hasTaintFlow="r32"
+ sink(r33) // $ hasTaintFlow="r33"
+
+ builder2 := src.Source[squirrel.DeleteBuilder]() // $ source
+
+ var r41, r42, r43 string
+ builder2.ScanContext(ctx, &r41, &r42, &r43)
+
+ sink(r41) // $ hasTaintFlow="r41"
+ sink(r42) // $ hasTaintFlow="r42"
+ sink(r43) // $ hasTaintFlow="r43"
+}
+
+func test_Masterminds_squirrel_InsertBuilder(ctx context.Context, builder squirrel.InsertBuilder) {
+ v1, err := builder.Query() // $ source
+ if err != nil {
+ return
+ }
+ sink(v1) // $ hasTaintFlow="v1"
+
+ v2, err := builder.QueryContext(ctx) // $ source
+ if err != nil {
+ return
+ }
+ sink(v2) // $ hasTaintFlow="v2"
+
+ s3 := builder.QueryRow() // $ source
+
+ var r31, r32, r33 string
+ s3.Scan(&r31, &r32, &r33)
+
+ sink(r31) // $ hasTaintFlow="r31"
+ sink(r32) // $ hasTaintFlow="r32"
+ sink(r33) // $ hasTaintFlow="r33"
+
+ s4 := builder.QueryRowContext(ctx) // $ source
+
+ var r41, r42, r43 string
+ s4.Scan(&r41, &r42, &r43)
+
+ sink(r41) // $ hasTaintFlow="r41"
+ sink(r42) // $ hasTaintFlow="r42"
+ sink(r43) // $ hasTaintFlow="r43"
+
+ builder2 := src.Source[squirrel.InsertBuilder]() // $ source
+
+ var r51, r52, r53 string
+ builder2.Scan(&r51, &r52, &r53)
+
+ sink(r51) // $ hasTaintFlow="r51"
+ sink(r52) // $ hasTaintFlow="r52"
+ sink(r53) // $ hasTaintFlow="r53"
+
+ var r61, r62, r63 string
+ builder2.ScanContext(ctx, &r61, &r62, &r63)
+
+ sink(r61) // $ hasTaintFlow="r61"
+ sink(r62) // $ hasTaintFlow="r62"
+ sink(r63) // $ hasTaintFlow="r63"
+}
+
+func test_Masterminds_squirrel_SelectBuilder(ctx context.Context, builder squirrel.SelectBuilder) {
+ v1, err := builder.Query() // $ source
+ if err != nil {
+ return
+ }
+ sink(v1) // $ hasTaintFlow="v1"
+
+ v2, err := builder.QueryContext(ctx) // $ source
+ if err != nil {
+ return
+ }
+ sink(v2) // $ hasTaintFlow="v2"
+
+ s3 := builder.QueryRow() // $ source
+
+ var r31, r32, r33 string
+ s3.Scan(&r31, &r32, &r33)
+
+ sink(r31) // $ hasTaintFlow="r31"
+ sink(r32) // $ hasTaintFlow="r32"
+ sink(r33) // $ hasTaintFlow="r33"
+
+ s4 := builder.QueryRowContext(ctx) // $ source
+
+ var r41, r42, r43 string
+ s4.Scan(&r41, &r42, &r43)
+
+ sink(r41) // $ hasTaintFlow="r41"
+ sink(r42) // $ hasTaintFlow="r42"
+ sink(r43) // $ hasTaintFlow="r43"
+
+ builder2 := src.Source[squirrel.SelectBuilder]() // $ source
+
+ var r51, r52, r53 string
+ builder2.Scan(&r51, &r52, &r53)
+
+ sink(r51) // $ hasTaintFlow="r51"
+ sink(r52) // $ hasTaintFlow="r52"
+ sink(r53) // $ hasTaintFlow="r53"
+
+ var r61, r62, r63 string
+ builder2.ScanContext(ctx, &r61, &r62, &r63)
+
+ sink(r61) // $ hasTaintFlow="r61"
+ sink(r62) // $ hasTaintFlow="r62"
+ sink(r63) // $ hasTaintFlow="r63"
+}
+
+func test_Masterminds_squirrel_UpdateBuilder(ctx context.Context, builder squirrel.UpdateBuilder) {
+ v1, err := builder.Query() // $ source
+ if err != nil {
+ return
+ }
+ sink(v1) // $ hasTaintFlow="v1"
+
+ v2, err := builder.QueryContext(ctx) // $ source
+ if err != nil {
+ return
+ }
+ sink(v2) // $ hasTaintFlow="v2"
+
+ s3 := builder.QueryRow() // $ source
+
+ var r31, r32, r33 string
+ s3.Scan(&r31, &r32, &r33)
+
+ sink(r31) // $ hasTaintFlow="r31"
+ sink(r32) // $ hasTaintFlow="r32"
+ sink(r33) // $ hasTaintFlow="r33"
+
+ s4 := builder.QueryRowContext(ctx) // $ source
+
+ var r41, r42, r43 string
+ s4.Scan(&r41, &r42, &r43)
+
+ sink(r41) // $ hasTaintFlow="r41"
+ sink(r42) // $ hasTaintFlow="r42"
+ sink(r43) // $ hasTaintFlow="r43"
+
+ builder2 := src.Source[squirrel.UpdateBuilder]() // $ source
+
+ var r51, r52, r53 string
+ builder2.Scan(&r51, &r52, &r53)
+
+ sink(r51) // $ hasTaintFlow="r51"
+ sink(r52) // $ hasTaintFlow="r52"
+ sink(r53) // $ hasTaintFlow="r53"
+
+ var r61, r62, r63 string
+ builder2.ScanContext(ctx, &r61, &r62, &r63)
+
+ sink(r61) // $ hasTaintFlow="r61"
+ sink(r62) // $ hasTaintFlow="r62"
+ sink(r63) // $ hasTaintFlow="r63"
+}
diff --git a/go/ql/test/library-tests/semmle/go/dataflow/flowsources/local/database/vendor/github.com/Masterminds/squirrel/stub.go b/go/ql/test/library-tests/semmle/go/dataflow/flowsources/local/database/vendor/github.com/Masterminds/squirrel/stub.go
new file mode 100644
index 00000000000..5b77477bb68
--- /dev/null
+++ b/go/ql/test/library-tests/semmle/go/dataflow/flowsources/local/database/vendor/github.com/Masterminds/squirrel/stub.go
@@ -0,0 +1,501 @@
+// Code generated by depstubber. DO NOT EDIT.
+// This is a simple stub for github.com/Masterminds/squirrel, strictly for use in testing.
+
+// See the LICENSE file for information about the licensing of the original library.
+// Source: github.com/Masterminds/squirrel (exports: DeleteBuilder,InsertBuilder,QueryRower,QueryRowerContext,Queryer,QueryerContext,SelectBuilder,StdSql,StdSqlCtx,UpdateBuilder; functions: QueryContextWith,QueryRowContextWith,QueryRowWith,QueryWith)
+
+// Package squirrel is a stub of github.com/Masterminds/squirrel, generated by depstubber.
+package squirrel
+
+import (
+ context "context"
+ sql "database/sql"
+)
+
+type BaseRunner interface {
+ Exec(_ string, _ ...interface{}) (sql.Result, error)
+ Query(_ string, _ ...interface{}) (*sql.Rows, error)
+}
+
+type DeleteBuilder struct{}
+
+func (_ DeleteBuilder) Exec() (sql.Result, error) {
+ return nil, nil
+}
+
+func (_ DeleteBuilder) ExecContext(_ context.Context) (sql.Result, error) {
+ return nil, nil
+}
+
+func (_ DeleteBuilder) From(_ string) DeleteBuilder {
+ return DeleteBuilder{}
+}
+
+func (_ DeleteBuilder) Limit(_ uint64) DeleteBuilder {
+ return DeleteBuilder{}
+}
+
+func (_ DeleteBuilder) MustSql() (string, []interface{}) {
+ return "", nil
+}
+
+func (_ DeleteBuilder) Offset(_ uint64) DeleteBuilder {
+ return DeleteBuilder{}
+}
+
+func (_ DeleteBuilder) OrderBy(_ ...string) DeleteBuilder {
+ return DeleteBuilder{}
+}
+
+func (_ DeleteBuilder) PlaceholderFormat(_ PlaceholderFormat) DeleteBuilder {
+ return DeleteBuilder{}
+}
+
+func (_ DeleteBuilder) Prefix(_ string, _ ...interface{}) DeleteBuilder {
+ return DeleteBuilder{}
+}
+
+func (_ DeleteBuilder) PrefixExpr(_ Sqlizer) DeleteBuilder {
+ return DeleteBuilder{}
+}
+
+func (_ DeleteBuilder) Query() (*sql.Rows, error) {
+ return nil, nil
+}
+
+func (_ DeleteBuilder) QueryContext(_ context.Context) (*sql.Rows, error) {
+ return nil, nil
+}
+
+func (_ DeleteBuilder) QueryRowContext(_ context.Context) RowScanner {
+ return nil
+}
+
+func (_ DeleteBuilder) RunWith(_ BaseRunner) DeleteBuilder {
+ return DeleteBuilder{}
+}
+
+func (_ DeleteBuilder) ScanContext(_ context.Context, _ ...interface{}) error {
+ return nil
+}
+
+func (_ DeleteBuilder) Suffix(_ string, _ ...interface{}) DeleteBuilder {
+ return DeleteBuilder{}
+}
+
+func (_ DeleteBuilder) SuffixExpr(_ Sqlizer) DeleteBuilder {
+ return DeleteBuilder{}
+}
+
+func (_ DeleteBuilder) ToSql() (string, []interface{}, error) {
+ return "", nil, nil
+}
+
+func (_ DeleteBuilder) Where(_ interface{}, _ ...interface{}) DeleteBuilder {
+ return DeleteBuilder{}
+}
+
+type InsertBuilder struct{}
+
+func (_ InsertBuilder) Columns(_ ...string) InsertBuilder {
+ return InsertBuilder{}
+}
+
+func (_ InsertBuilder) Exec() (sql.Result, error) {
+ return nil, nil
+}
+
+func (_ InsertBuilder) ExecContext(_ context.Context) (sql.Result, error) {
+ return nil, nil
+}
+
+func (_ InsertBuilder) Into(_ string) InsertBuilder {
+ return InsertBuilder{}
+}
+
+func (_ InsertBuilder) MustSql() (string, []interface{}) {
+ return "", nil
+}
+
+func (_ InsertBuilder) Options(_ ...string) InsertBuilder {
+ return InsertBuilder{}
+}
+
+func (_ InsertBuilder) PlaceholderFormat(_ PlaceholderFormat) InsertBuilder {
+ return InsertBuilder{}
+}
+
+func (_ InsertBuilder) Prefix(_ string, _ ...interface{}) InsertBuilder {
+ return InsertBuilder{}
+}
+
+func (_ InsertBuilder) PrefixExpr(_ Sqlizer) InsertBuilder {
+ return InsertBuilder{}
+}
+
+func (_ InsertBuilder) Query() (*sql.Rows, error) {
+ return nil, nil
+}
+
+func (_ InsertBuilder) QueryContext(_ context.Context) (*sql.Rows, error) {
+ return nil, nil
+}
+
+func (_ InsertBuilder) QueryRow() RowScanner {
+ return nil
+}
+
+func (_ InsertBuilder) QueryRowContext(_ context.Context) RowScanner {
+ return nil
+}
+
+func (_ InsertBuilder) RunWith(_ BaseRunner) InsertBuilder {
+ return InsertBuilder{}
+}
+
+func (_ InsertBuilder) Scan(_ ...interface{}) error {
+ return nil
+}
+
+func (_ InsertBuilder) ScanContext(_ context.Context, _ ...interface{}) error {
+ return nil
+}
+
+func (_ InsertBuilder) Select(_ SelectBuilder) InsertBuilder {
+ return InsertBuilder{}
+}
+
+func (_ InsertBuilder) SetMap(_ map[string]interface{}) InsertBuilder {
+ return InsertBuilder{}
+}
+
+func (_ InsertBuilder) Suffix(_ string, _ ...interface{}) InsertBuilder {
+ return InsertBuilder{}
+}
+
+func (_ InsertBuilder) SuffixExpr(_ Sqlizer) InsertBuilder {
+ return InsertBuilder{}
+}
+
+func (_ InsertBuilder) ToSql() (string, []interface{}, error) {
+ return "", nil, nil
+}
+
+func (_ InsertBuilder) Values(_ ...interface{}) InsertBuilder {
+ return InsertBuilder{}
+}
+
+type PlaceholderFormat interface {
+ ReplacePlaceholders(_ string) (string, error)
+}
+
+func QueryContextWith(_ context.Context, _ QueryerContext, _ Sqlizer) (*sql.Rows, error) {
+ return nil, nil
+}
+
+func QueryRowContextWith(_ context.Context, _ QueryRowerContext, _ Sqlizer) RowScanner {
+ return nil
+}
+
+func QueryRowWith(_ QueryRower, _ Sqlizer) RowScanner {
+ return nil
+}
+
+type QueryRower interface {
+ QueryRow(_ string, _ ...interface{}) RowScanner
+}
+
+type QueryRowerContext interface {
+ QueryRowContext(_ context.Context, _ string, _ ...interface{}) RowScanner
+}
+
+func QueryWith(_ Queryer, _ Sqlizer) (*sql.Rows, error) {
+ return nil, nil
+}
+
+type Queryer interface {
+ Query(_ string, _ ...interface{}) (*sql.Rows, error)
+}
+
+type QueryerContext interface {
+ QueryContext(_ context.Context, _ string, _ ...interface{}) (*sql.Rows, error)
+}
+
+type RowScanner interface {
+ Scan(_ ...interface{}) error
+}
+
+type SelectBuilder struct{}
+
+func (_ SelectBuilder) Column(_ interface{}, _ ...interface{}) SelectBuilder {
+ return SelectBuilder{}
+}
+
+func (_ SelectBuilder) Columns(_ ...string) SelectBuilder {
+ return SelectBuilder{}
+}
+
+func (_ SelectBuilder) CrossJoin(_ string, _ ...interface{}) SelectBuilder {
+ return SelectBuilder{}
+}
+
+func (_ SelectBuilder) Distinct() SelectBuilder {
+ return SelectBuilder{}
+}
+
+func (_ SelectBuilder) Exec() (sql.Result, error) {
+ return nil, nil
+}
+
+func (_ SelectBuilder) ExecContext(_ context.Context) (sql.Result, error) {
+ return nil, nil
+}
+
+func (_ SelectBuilder) From(_ string) SelectBuilder {
+ return SelectBuilder{}
+}
+
+func (_ SelectBuilder) FromSelect(_ SelectBuilder, _ string) SelectBuilder {
+ return SelectBuilder{}
+}
+
+func (_ SelectBuilder) GroupBy(_ ...string) SelectBuilder {
+ return SelectBuilder{}
+}
+
+func (_ SelectBuilder) Having(_ interface{}, _ ...interface{}) SelectBuilder {
+ return SelectBuilder{}
+}
+
+func (_ SelectBuilder) InnerJoin(_ string, _ ...interface{}) SelectBuilder {
+ return SelectBuilder{}
+}
+
+func (_ SelectBuilder) Join(_ string, _ ...interface{}) SelectBuilder {
+ return SelectBuilder{}
+}
+
+func (_ SelectBuilder) JoinClause(_ interface{}, _ ...interface{}) SelectBuilder {
+ return SelectBuilder{}
+}
+
+func (_ SelectBuilder) LeftJoin(_ string, _ ...interface{}) SelectBuilder {
+ return SelectBuilder{}
+}
+
+func (_ SelectBuilder) Limit(_ uint64) SelectBuilder {
+ return SelectBuilder{}
+}
+
+func (_ SelectBuilder) MustSql() (string, []interface{}) {
+ return "", nil
+}
+
+func (_ SelectBuilder) Offset(_ uint64) SelectBuilder {
+ return SelectBuilder{}
+}
+
+func (_ SelectBuilder) Options(_ ...string) SelectBuilder {
+ return SelectBuilder{}
+}
+
+func (_ SelectBuilder) OrderBy(_ ...string) SelectBuilder {
+ return SelectBuilder{}
+}
+
+func (_ SelectBuilder) OrderByClause(_ interface{}, _ ...interface{}) SelectBuilder {
+ return SelectBuilder{}
+}
+
+func (_ SelectBuilder) PlaceholderFormat(_ PlaceholderFormat) SelectBuilder {
+ return SelectBuilder{}
+}
+
+func (_ SelectBuilder) Prefix(_ string, _ ...interface{}) SelectBuilder {
+ return SelectBuilder{}
+}
+
+func (_ SelectBuilder) PrefixExpr(_ Sqlizer) SelectBuilder {
+ return SelectBuilder{}
+}
+
+func (_ SelectBuilder) Query() (*sql.Rows, error) {
+ return nil, nil
+}
+
+func (_ SelectBuilder) QueryContext(_ context.Context) (*sql.Rows, error) {
+ return nil, nil
+}
+
+func (_ SelectBuilder) QueryRow() RowScanner {
+ return nil
+}
+
+func (_ SelectBuilder) QueryRowContext(_ context.Context) RowScanner {
+ return nil
+}
+
+func (_ SelectBuilder) RemoveColumns() SelectBuilder {
+ return SelectBuilder{}
+}
+
+func (_ SelectBuilder) RemoveLimit() SelectBuilder {
+ return SelectBuilder{}
+}
+
+func (_ SelectBuilder) RemoveOffset() SelectBuilder {
+ return SelectBuilder{}
+}
+
+func (_ SelectBuilder) RightJoin(_ string, _ ...interface{}) SelectBuilder {
+ return SelectBuilder{}
+}
+
+func (_ SelectBuilder) RunWith(_ BaseRunner) SelectBuilder {
+ return SelectBuilder{}
+}
+
+func (_ SelectBuilder) Scan(_ ...interface{}) error {
+ return nil
+}
+
+func (_ SelectBuilder) ScanContext(_ context.Context, _ ...interface{}) error {
+ return nil
+}
+
+func (_ SelectBuilder) Suffix(_ string, _ ...interface{}) SelectBuilder {
+ return SelectBuilder{}
+}
+
+func (_ SelectBuilder) SuffixExpr(_ Sqlizer) SelectBuilder {
+ return SelectBuilder{}
+}
+
+func (_ SelectBuilder) ToSql() (string, []interface{}, error) {
+ return "", nil, nil
+}
+
+func (_ SelectBuilder) Where(_ interface{}, _ ...interface{}) SelectBuilder {
+ return SelectBuilder{}
+}
+
+type Sqlizer interface {
+ ToSql() (string, []interface{}, error)
+}
+
+type StdSql interface {
+ Exec(_ string, _ ...interface{}) (sql.Result, error)
+ Query(_ string, _ ...interface{}) (*sql.Rows, error)
+ QueryRow(_ string, _ ...interface{}) *sql.Row
+}
+
+type StdSqlCtx interface {
+ Exec(_ string, _ ...interface{}) (sql.Result, error)
+ ExecContext(_ context.Context, _ string, _ ...interface{}) (sql.Result, error)
+ Query(_ string, _ ...interface{}) (*sql.Rows, error)
+ QueryContext(_ context.Context, _ string, _ ...interface{}) (*sql.Rows, error)
+ QueryRow(_ string, _ ...interface{}) *sql.Row
+ QueryRowContext(_ context.Context, _ string, _ ...interface{}) *sql.Row
+}
+
+type UpdateBuilder struct{}
+
+func (_ UpdateBuilder) Exec() (sql.Result, error) {
+ return nil, nil
+}
+
+func (_ UpdateBuilder) ExecContext(_ context.Context) (sql.Result, error) {
+ return nil, nil
+}
+
+func (_ UpdateBuilder) From(_ string) UpdateBuilder {
+ return UpdateBuilder{}
+}
+
+func (_ UpdateBuilder) FromSelect(_ SelectBuilder, _ string) UpdateBuilder {
+ return UpdateBuilder{}
+}
+
+func (_ UpdateBuilder) Limit(_ uint64) UpdateBuilder {
+ return UpdateBuilder{}
+}
+
+func (_ UpdateBuilder) MustSql() (string, []interface{}) {
+ return "", nil
+}
+
+func (_ UpdateBuilder) Offset(_ uint64) UpdateBuilder {
+ return UpdateBuilder{}
+}
+
+func (_ UpdateBuilder) OrderBy(_ ...string) UpdateBuilder {
+ return UpdateBuilder{}
+}
+
+func (_ UpdateBuilder) PlaceholderFormat(_ PlaceholderFormat) UpdateBuilder {
+ return UpdateBuilder{}
+}
+
+func (_ UpdateBuilder) Prefix(_ string, _ ...interface{}) UpdateBuilder {
+ return UpdateBuilder{}
+}
+
+func (_ UpdateBuilder) PrefixExpr(_ Sqlizer) UpdateBuilder {
+ return UpdateBuilder{}
+}
+
+func (_ UpdateBuilder) Query() (*sql.Rows, error) {
+ return nil, nil
+}
+
+func (_ UpdateBuilder) QueryContext(_ context.Context) (*sql.Rows, error) {
+ return nil, nil
+}
+
+func (_ UpdateBuilder) QueryRow() RowScanner {
+ return nil
+}
+
+func (_ UpdateBuilder) QueryRowContext(_ context.Context) RowScanner {
+ return nil
+}
+
+func (_ UpdateBuilder) RunWith(_ BaseRunner) UpdateBuilder {
+ return UpdateBuilder{}
+}
+
+func (_ UpdateBuilder) Scan(_ ...interface{}) error {
+ return nil
+}
+
+func (_ UpdateBuilder) ScanContext(_ context.Context, _ ...interface{}) error {
+ return nil
+}
+
+func (_ UpdateBuilder) Set(_ string, _ interface{}) UpdateBuilder {
+ return UpdateBuilder{}
+}
+
+func (_ UpdateBuilder) SetMap(_ map[string]interface{}) UpdateBuilder {
+ return UpdateBuilder{}
+}
+
+func (_ UpdateBuilder) Suffix(_ string, _ ...interface{}) UpdateBuilder {
+ return UpdateBuilder{}
+}
+
+func (_ UpdateBuilder) SuffixExpr(_ Sqlizer) UpdateBuilder {
+ return UpdateBuilder{}
+}
+
+func (_ UpdateBuilder) Table(_ string) UpdateBuilder {
+ return UpdateBuilder{}
+}
+
+func (_ UpdateBuilder) ToSql() (string, []interface{}, error) {
+ return "", nil, nil
+}
+
+func (_ UpdateBuilder) Where(_ interface{}, _ ...interface{}) UpdateBuilder {
+ return UpdateBuilder{}
+}
diff --git a/go/ql/test/library-tests/semmle/go/dataflow/flowsources/local/database/vendor/github.com/nonexistent/sources/stub.go b/go/ql/test/library-tests/semmle/go/dataflow/flowsources/local/database/vendor/github.com/nonexistent/sources/stub.go
new file mode 100644
index 00000000000..afc57a3900d
--- /dev/null
+++ b/go/ql/test/library-tests/semmle/go/dataflow/flowsources/local/database/vendor/github.com/nonexistent/sources/stub.go
@@ -0,0 +1,5 @@
+package sources
+
+func Source[T any]() T {
+ return *new(T)
+}
diff --git a/go/ql/test/library-tests/semmle/go/dataflow/flowsources/local/database/vendor/modules.txt b/go/ql/test/library-tests/semmle/go/dataflow/flowsources/local/database/vendor/modules.txt
index 874a14a5288..01fbca5130d 100644
--- a/go/ql/test/library-tests/semmle/go/dataflow/flowsources/local/database/vendor/modules.txt
+++ b/go/ql/test/library-tests/semmle/go/dataflow/flowsources/local/database/vendor/modules.txt
@@ -13,6 +13,9 @@ github.com/couchbase/gocb/v2
# github.com/jmoiron/sqlx v1.4.0
## explicit
github.com/jmoiron/sqlx
+# github.com/Masterminds/squirrel v1.5.4
+## explicit
+github.com/Masterminds/squirrel
# github.com/rqlite/gorqlite v0.0.0-20250128004930-114c7828b55a
## explicit
github.com/rqlite/gorqlite
@@ -22,6 +25,9 @@ go.mongodb.org/mongo-driver/mongo
# gorm.io/gorm v1.25.12
## explicit
gorm.io/gorm
+# github.com/nonexistent/sources v0.0.0-20250300000000-000000000000
+## explicit
+github.com/nonexistent/sources
# github.com/couchbase/gocbcore/v10 v10.5.4
## explicit
github.com/couchbase/gocbcore/v10
diff --git a/java/ql/lib/semmle/code/java/dataflow/internal/SsaImpl.qll b/java/ql/lib/semmle/code/java/dataflow/internal/SsaImpl.qll
index 2803445f48e..573f1cb51ea 100644
--- a/java/ql/lib/semmle/code/java/dataflow/internal/SsaImpl.qll
+++ b/java/ql/lib/semmle/code/java/dataflow/internal/SsaImpl.qll
@@ -680,10 +680,17 @@ private module DataFlowIntegrationInput implements Impl::DataFlowIntegrationInpu
}
}
+ /** Holds if the guard `guard` directly controls block `bb` upon evaluating to `branch`. */
+ predicate guardDirectlyControlsBlock(Guard guard, BasicBlock bb, boolean branch) {
+ guard.directlyControls(bb, branch)
+ }
+
/** Holds if the guard `guard` controls block `bb` upon evaluating to `branch`. */
predicate guardControlsBlock(Guard guard, BasicBlock bb, boolean branch) {
guard.controls(bb, branch)
}
+
+ predicate includeWriteDefsInFlowStep() { none() }
}
private module DataFlowIntegrationImpl = Impl::DataFlowIntegration;
diff --git a/java/ql/src/codeql-suites/java-ccr.qls b/java/ql/src/codeql-suites/java-code-quality.qls
similarity index 100%
rename from java/ql/src/codeql-suites/java-ccr.qls
rename to java/ql/src/codeql-suites/java-code-quality.qls
diff --git a/java/ql/test/library-tests/dataflow/capture/test.expected b/java/ql/test/library-tests/dataflow/capture/test.expected
index a98b4990228..1e8a2d7d334 100644
--- a/java/ql/test/library-tests/dataflow/capture/test.expected
+++ b/java/ql/test/library-tests/dataflow/capture/test.expected
@@ -1,10 +1,7 @@
-| A.java:14:14:14:16 | "A" : String | A.java:14:7:14:20 | SSA def(a) : new A(...) { ... } [p] |
| A.java:14:14:14:16 | "A" : String | A.java:14:11:14:20 | f2(...) : new A(...) { ... } [p] |
| A.java:14:14:14:16 | "A" : String | A.java:15:16:15:16 | a : new A(...) { ... } [p] |
| A.java:14:14:14:16 | "A" : String | A.java:15:16:15:22 | get(...) : String |
| A.java:14:14:14:16 | "A" : String | A.java:18:8:18:15 | p : String |
-| A.java:14:14:14:16 | "A" : String | A.java:18:25:40:3 | SSA def(p) : String |
-| A.java:14:14:14:16 | "A" : String | A.java:28:7:38:5 | SSA def(a) : new A(...) { ... } [p] |
| A.java:14:14:14:16 | "A" : String | A.java:28:11:38:5 | new (...) : new A(...) { ... } [p] |
| A.java:14:14:14:16 | "A" : String | A.java:28:11:38:5 | p : String |
| A.java:14:14:14:16 | "A" : String | A.java:30:14:30:16 | parameter this : new A(...) { ... } [p] |
@@ -16,16 +13,12 @@
| A.java:14:14:14:16 | "A" : String | A.java:35:26:35:27 | this : new A(...) { ... } [p] |
| A.java:14:14:14:16 | "A" : String | A.java:39:12:39:12 | a : new A(...) { ... } [p] |
| A.java:14:14:14:16 | "A" : String | A.java:39:12:39:12 | p : String |
-| A.java:21:11:21:13 | "B" : String | A.java:14:7:14:20 | SSA def(a) : new A(...) { ... } [String s] |
| A.java:21:11:21:13 | "B" : String | A.java:14:11:14:20 | f2(...) : new A(...) { ... } [String s] |
| A.java:21:11:21:13 | "B" : String | A.java:15:16:15:16 | a : new A(...) { ... } [String s] |
| A.java:21:11:21:13 | "B" : String | A.java:15:16:15:22 | get(...) : String |
| A.java:21:11:21:13 | "B" : String | A.java:21:7:21:13 | ...=... : String |
-| A.java:21:11:21:13 | "B" : String | A.java:21:7:21:13 | SSA def(s) : String |
-| A.java:21:11:21:13 | "B" : String | A.java:21:7:21:13 | [input] SSA phi(s) : String |
| A.java:21:11:21:13 | "B" : String | A.java:25:5:25:26 | SSA phi(s) : String |
| A.java:21:11:21:13 | "B" : String | A.java:25:5:25:26 | phi(String s) : String |
-| A.java:21:11:21:13 | "B" : String | A.java:28:7:38:5 | SSA def(a) : new A(...) { ... } [String s] |
| A.java:21:11:21:13 | "B" : String | A.java:28:11:38:5 | String s : String |
| A.java:21:11:21:13 | "B" : String | A.java:28:11:38:5 | new (...) : new A(...) { ... } [String s] |
| A.java:21:11:21:13 | "B" : String | A.java:30:14:30:16 | parameter this : new A(...) { ... } [String s] |
@@ -37,16 +30,12 @@
| A.java:21:11:21:13 | "B" : String | A.java:35:26:35:27 | this : new A(...) { ... } [String s] |
| A.java:21:11:21:13 | "B" : String | A.java:39:12:39:12 | String s : String |
| A.java:21:11:21:13 | "B" : String | A.java:39:12:39:12 | a : new A(...) { ... } [String s] |
-| A.java:23:11:23:13 | "C" : String | A.java:14:7:14:20 | SSA def(a) : new A(...) { ... } [String s] |
| A.java:23:11:23:13 | "C" : String | A.java:14:11:14:20 | f2(...) : new A(...) { ... } [String s] |
| A.java:23:11:23:13 | "C" : String | A.java:15:16:15:16 | a : new A(...) { ... } [String s] |
| A.java:23:11:23:13 | "C" : String | A.java:15:16:15:22 | get(...) : String |
| A.java:23:11:23:13 | "C" : String | A.java:23:7:23:13 | ...=... : String |
-| A.java:23:11:23:13 | "C" : String | A.java:23:7:23:13 | SSA def(s) : String |
-| A.java:23:11:23:13 | "C" : String | A.java:23:7:23:13 | [input] SSA phi(s) : String |
| A.java:23:11:23:13 | "C" : String | A.java:25:5:25:26 | SSA phi(s) : String |
| A.java:23:11:23:13 | "C" : String | A.java:25:5:25:26 | phi(String s) : String |
-| A.java:23:11:23:13 | "C" : String | A.java:28:7:38:5 | SSA def(a) : new A(...) { ... } [String s] |
| A.java:23:11:23:13 | "C" : String | A.java:28:11:38:5 | String s : String |
| A.java:23:11:23:13 | "C" : String | A.java:28:11:38:5 | new (...) : new A(...) { ... } [String s] |
| A.java:23:11:23:13 | "C" : String | A.java:30:14:30:16 | parameter this : new A(...) { ... } [String s] |
@@ -60,20 +49,16 @@
| A.java:23:11:23:13 | "C" : String | A.java:39:12:39:12 | a : new A(...) { ... } [String s] |
| A.java:25:22:25:24 | "D" : String | A.java:4:5:4:7 | parameter this [Return] : Box [elem] |
| A.java:25:22:25:24 | "D" : String | A.java:4:9:4:16 | e : String |
-| A.java:25:22:25:24 | "D" : String | A.java:4:19:4:31 | SSA def(e) : String |
| A.java:25:22:25:24 | "D" : String | A.java:4:21:4:24 | this <.field> [post update] : Box [elem] |
| A.java:25:22:25:24 | "D" : String | A.java:4:21:4:28 | ...=... : String |
| A.java:25:22:25:24 | "D" : String | A.java:4:28:4:28 | e : String |
| A.java:25:22:25:24 | "D" : String | A.java:6:12:6:18 | parameter this : Box [elem] |
| A.java:25:22:25:24 | "D" : String | A.java:6:31:6:34 | elem : String |
| A.java:25:22:25:24 | "D" : String | A.java:6:31:6:34 | this <.field> : Box [elem] |
-| A.java:25:22:25:24 | "D" : String | A.java:14:7:14:20 | SSA def(a) : new A(...) { ... } [Box b1, ... (2)] |
| A.java:25:22:25:24 | "D" : String | A.java:14:11:14:20 | f2(...) : new A(...) { ... } [Box b1, ... (2)] |
| A.java:25:22:25:24 | "D" : String | A.java:15:16:15:16 | a : new A(...) { ... } [Box b1, ... (2)] |
| A.java:25:22:25:24 | "D" : String | A.java:15:16:15:22 | get(...) : String |
-| A.java:25:22:25:24 | "D" : String | A.java:25:9:25:25 | SSA def(b1) : Box [elem] |
| A.java:25:22:25:24 | "D" : String | A.java:25:14:25:25 | new Box(...) : Box [elem] |
-| A.java:25:22:25:24 | "D" : String | A.java:28:7:38:5 | SSA def(a) : new A(...) { ... } [Box b1, ... (2)] |
| A.java:25:22:25:24 | "D" : String | A.java:28:11:38:5 | Box b1 : Box [elem] |
| A.java:25:22:25:24 | "D" : String | A.java:28:11:38:5 | new (...) : new A(...) { ... } [Box b1, ... (2)] |
| A.java:25:22:25:24 | "D" : String | A.java:30:14:30:16 | parameter this : new A(...) { ... } [Box b1, ... (2)] |
@@ -88,19 +73,16 @@
| A.java:25:22:25:24 | "D" : String | A.java:39:12:39:12 | a : new A(...) { ... } [Box b1, ... (2)] |
| A.java:27:16:27:18 | "E" : String | A.java:5:10:5:16 | parameter this [Return] : Box [elem] |
| A.java:27:16:27:18 | "E" : String | A.java:5:18:5:25 | e : String |
-| A.java:27:16:27:18 | "E" : String | A.java:5:28:5:40 | SSA def(e) : String |
| A.java:27:16:27:18 | "E" : String | A.java:5:30:5:33 | this <.field> [post update] : Box [elem] |
| A.java:27:16:27:18 | "E" : String | A.java:5:30:5:37 | ...=... : String |
| A.java:27:16:27:18 | "E" : String | A.java:5:37:5:37 | e : String |
| A.java:27:16:27:18 | "E" : String | A.java:6:12:6:18 | parameter this : Box [elem] |
| A.java:27:16:27:18 | "E" : String | A.java:6:31:6:34 | elem : String |
| A.java:27:16:27:18 | "E" : String | A.java:6:31:6:34 | this <.field> : Box [elem] |
-| A.java:27:16:27:18 | "E" : String | A.java:14:7:14:20 | SSA def(a) : new A(...) { ... } [Box b2, ... (2)] |
| A.java:27:16:27:18 | "E" : String | A.java:14:11:14:20 | f2(...) : new A(...) { ... } [Box b2, ... (2)] |
| A.java:27:16:27:18 | "E" : String | A.java:15:16:15:16 | a : new A(...) { ... } [Box b2, ... (2)] |
| A.java:27:16:27:18 | "E" : String | A.java:15:16:15:22 | get(...) : String |
| A.java:27:16:27:18 | "E" : String | A.java:27:5:27:6 | b2 [post update] : Box [elem] |
-| A.java:27:16:27:18 | "E" : String | A.java:28:7:38:5 | SSA def(a) : new A(...) { ... } [Box b2, ... (2)] |
| A.java:27:16:27:18 | "E" : String | A.java:28:11:38:5 | Box b2 : Box [elem] |
| A.java:27:16:27:18 | "E" : String | A.java:28:11:38:5 | new (...) : new A(...) { ... } [Box b2, ... (2)] |
| A.java:27:16:27:18 | "E" : String | A.java:30:14:30:16 | parameter this : new A(...) { ... } [Box b2, ... (2)] |
diff --git a/java/ql/test/library-tests/dataflow/null/testnullflow.expected b/java/ql/test/library-tests/dataflow/null/testnullflow.expected
index d73b00f0fef..532d64e81f8 100644
--- a/java/ql/test/library-tests/dataflow/null/testnullflow.expected
+++ b/java/ql/test/library-tests/dataflow/null/testnullflow.expected
@@ -1,6 +1,4 @@
| A.java:5:18:5:21 | null | A.java:2:13:2:20 | o |
-| A.java:5:18:5:21 | null | A.java:5:12:5:21 | SSA def(src) |
| A.java:5:18:5:21 | null | A.java:5:18:5:21 | null |
-| A.java:5:18:5:21 | null | A.java:6:12:6:18 | SSA def(x) |
| A.java:5:18:5:21 | null | A.java:6:16:6:18 | src |
| A.java:5:18:5:21 | null | A.java:7:10:7:10 | x |
diff --git a/java/ql/test/library-tests/dataflow/partial/test.expected b/java/ql/test/library-tests/dataflow/partial/test.expected
index 700c1b31dcf..ea7da3a9690 100644
--- a/java/ql/test/library-tests/dataflow/partial/test.expected
+++ b/java/ql/test/library-tests/dataflow/partial/test.expected
@@ -3,14 +3,12 @@ edges
| A.java:12:14:12:18 | src(...) : Object | A.java:12:5:12:5 | b [post update] : Box [elem] |
| A.java:12:14:12:18 | src(...) : Object | A.java:12:5:12:18 | ...=... : Object |
| A.java:13:12:13:12 | b : Box [elem] | A.java:17:13:17:16 | f1(...) : Box [elem] |
-| A.java:17:9:17:16 | SSA def(b) : Box [elem] | A.java:18:8:18:8 | b : Box [elem] |
-| A.java:17:13:17:16 | f1(...) : Box [elem] | A.java:17:9:17:16 | SSA def(b) : Box [elem] |
+| A.java:17:13:17:16 | f1(...) : Box [elem] | A.java:18:8:18:8 | b : Box [elem] |
| A.java:18:8:18:8 | b : Box [elem] | A.java:21:11:21:15 | b : Box [elem] |
#select
| 0 | A.java:12:5:12:5 | b [post update] : Box [elem] |
| 0 | A.java:12:5:12:18 | ...=... : Object |
| 0 | A.java:13:12:13:12 | b : Box [elem] |
-| 1 | A.java:17:9:17:16 | SSA def(b) : Box [elem] |
| 1 | A.java:17:13:17:16 | f1(...) : Box [elem] |
| 1 | A.java:18:8:18:8 | b : Box [elem] |
| 2 | A.java:21:11:21:15 | b : Box [elem] |
diff --git a/java/ql/test/library-tests/dataflow/partial/testRev.expected b/java/ql/test/library-tests/dataflow/partial/testRev.expected
index d798f443480..15ce5d56ace 100644
--- a/java/ql/test/library-tests/dataflow/partial/testRev.expected
+++ b/java/ql/test/library-tests/dataflow/partial/testRev.expected
@@ -2,8 +2,7 @@ edges
| A.java:4:16:4:18 | parameter this [Return] [elem] | A.java:22:17:22:25 | new Box(...) [elem] |
| A.java:4:16:4:18 | this [post update] [elem] | A.java:4:16:4:18 | parameter this [Return] [elem] |
| A.java:5:19:5:22 | elem | A.java:24:10:24:19 | other.elem |
-| A.java:22:9:22:25 | SSA def(other) [elem] | A.java:23:13:23:17 | other [elem] |
-| A.java:22:17:22:25 | new Box(...) [elem] | A.java:22:9:22:25 | SSA def(other) [elem] |
+| A.java:22:17:22:25 | new Box(...) [elem] | A.java:23:13:23:17 | other [elem] |
| A.java:23:13:23:17 | other [elem] | A.java:24:10:24:14 | other [elem] |
| A.java:23:13:23:17 | other [post update] [elem] | A.java:24:10:24:14 | other [elem] |
| A.java:24:10:24:14 | other [elem] | A.java:24:10:24:19 | other.elem |
@@ -11,7 +10,6 @@ edges
| A.java:28:5:28:5 | b [post update] [elem] | A.java:27:16:27:20 | b [Return] [elem] |
| A.java:28:14:28:25 | new Object(...) | A.java:28:5:28:5 | b [post update] [elem] |
#select
-| 0 | A.java:22:9:22:25 | SSA def(other) [elem] |
| 0 | A.java:22:17:22:25 | new Box(...) [elem] |
| 0 | A.java:23:13:23:17 | other [elem] |
| 0 | A.java:23:13:23:17 | other [post update] [elem] |
diff --git a/java/ql/test/library-tests/dataflow/switchexpr/switchexprflow.expected b/java/ql/test/library-tests/dataflow/switchexpr/switchexprflow.expected
index 551c836889d..d444bae3cc7 100644
--- a/java/ql/test/library-tests/dataflow/switchexpr/switchexprflow.expected
+++ b/java/ql/test/library-tests/dataflow/switchexpr/switchexprflow.expected
@@ -1,13 +1,9 @@
| TestSwitchExpr.java:4:15:4:22 | o |
-| TestSwitchExpr.java:7:16:7:28 | SSA def(x1) |
| TestSwitchExpr.java:7:21:7:28 | source(...) |
-| TestSwitchExpr.java:8:16:8:30 | SSA def(x2) |
| TestSwitchExpr.java:8:21:8:30 | switch (...) |
| TestSwitchExpr.java:10:24:10:25 | x1 |
-| TestSwitchExpr.java:12:16:12:30 | SSA def(x3) |
| TestSwitchExpr.java:12:21:12:30 | switch (...) |
| TestSwitchExpr.java:13:38:13:39 | x2 |
-| TestSwitchExpr.java:16:16:16:30 | SSA def(x4) |
| TestSwitchExpr.java:16:21:16:30 | switch (...) |
| TestSwitchExpr.java:19:23:19:24 | x3 |
| TestSwitchExpr.java:23:14:23:15 | x4 |
diff --git a/java/ql/test/library-tests/dataflow/taint-ioutils/dataFlow.expected b/java/ql/test/library-tests/dataflow/taint-ioutils/dataFlow.expected
index ffd641a45d7..1902605e618 100644
--- a/java/ql/test/library-tests/dataflow/taint-ioutils/dataFlow.expected
+++ b/java/ql/test/library-tests/dataflow/taint-ioutils/dataFlow.expected
@@ -1,24 +1,19 @@
-| Test.java:12:15:12:47 | SSA def(inp) |
| Test.java:12:21:12:47 | new FileInputStream(...) |
| Test.java:14:21:14:39 | buffer(...) |
| Test.java:14:36:14:38 | inp |
-| Test.java:15:16:15:54 | SSA def(lines) |
| Test.java:15:24:15:54 | readLines(...) |
| Test.java:15:42:15:44 | inp |
| Test.java:16:18:16:45 | readFully(...) |
| Test.java:16:36:16:38 | inp |
| Test.java:17:22:17:55 | toBufferedInputStream(...) |
| Test.java:17:52:17:54 | inp |
-| Test.java:18:10:18:71 | SSA def(bufread) |
| Test.java:18:20:18:71 | toBufferedReader(...) |
| Test.java:18:45:18:70 | new InputStreamReader(...) |
| Test.java:18:67:18:69 | inp |
| Test.java:19:19:19:48 | toByteArray(...) |
| Test.java:19:39:19:41 | inp |
-| Test.java:20:10:20:50 | SSA def(chars) |
| Test.java:20:18:20:50 | toCharArray(...) |
| Test.java:20:38:20:40 | inp |
-| Test.java:21:10:21:43 | SSA def(s) |
| Test.java:21:14:21:43 | toString(...) |
| Test.java:21:31:21:33 | inp |
| Test.java:22:20:22:52 | toInputStream(...) |
diff --git a/java/ql/test/library-tests/dataflow/this-flow/this-flow.expected b/java/ql/test/library-tests/dataflow/this-flow/this-flow.expected
index 5b59c216707..1f28514b664 100644
--- a/java/ql/test/library-tests/dataflow/this-flow/this-flow.expected
+++ b/java/ql/test/library-tests/dataflow/this-flow/this-flow.expected
@@ -10,13 +10,11 @@
| A.java:20:16:20:16 | this <.field> |
| A.java:21:12:21:20 | getThis(...) |
| A.java:21:12:21:20 | this <.method> |
-| A.java:25:7:25:17 | SSA def(a) |
| A.java:25:11:25:17 | new A(...) |
| A.java:25:11:25:17 | new A(...) [pre constructor] |
| A.java:26:12:26:12 | a |
| A.java:26:12:26:22 | getThis(...) |
| A.java:26:12:26:36 | getThisWrap(...) |
-| A.java:27:7:27:17 | SSA def(c) |
| A.java:27:11:27:17 | new C(...) |
| A.java:27:11:27:17 | new C(...) [pre constructor] |
| A.java:28:5:28:5 | c |
diff --git a/javascript/downgrades/ccefb5e2d49318eea4aeafd4c6ae2af9f94ac72a/jsdoc_type_exprs.ql b/javascript/downgrades/ccefb5e2d49318eea4aeafd4c6ae2af9f94ac72a/jsdoc_type_exprs.ql
new file mode 100644
index 00000000000..4f12eb443f9
--- /dev/null
+++ b/javascript/downgrades/ccefb5e2d49318eea4aeafd4c6ae2af9f94ac72a/jsdoc_type_exprs.ql
@@ -0,0 +1,37 @@
+// Removes all nodes nested inside a qualified type access,
+// and changes qualified type access nodes to "named type" nodes.
+//
+/*
+ * jsdoc_type_exprs (unique int id: @jsdoc_type_expr,
+ * int kind: int ref,
+ * int parent: @jsdoc_type_expr_parent ref,
+ * int idx: int ref,
+ * varchar(900) tostring: string ref);
+ */
+
+class JSDocTypeExprParent extends @jsdoc_type_expr_parent {
+ string toString() { none() }
+}
+
+class JSDocTypeExpr extends @jsdoc_type_expr {
+ string toString() { none() }
+
+ JSDocTypeExpr getChild(int n) { jsdoc_type_exprs(result, _, this, n, _) }
+
+ int getNewKind() { jsdoc_type_exprs(this, result, _, _, _) }
+
+ predicate shouldRemove() { this = any(JSDocQualifiedTypeAccess a).getChild(_) }
+}
+
+class JSDocQualifiedTypeAccess extends @jsdoc_qualified_type_expr, JSDocTypeExpr {
+ override int getNewKind() {
+ result = 5
+ /* 5 = @jsdoc_named_type_expr */
+ }
+}
+
+from JSDocTypeExpr node, JSDocTypeExprParent parent, int idx, string tostring
+where
+ jsdoc_type_exprs(node, _, parent, idx, tostring) and
+ not node.shouldRemove()
+select node, node.getNewKind(), parent, idx, tostring
diff --git a/javascript/downgrades/ccefb5e2d49318eea4aeafd4c6ae2af9f94ac72a/old.dbscheme b/javascript/downgrades/ccefb5e2d49318eea4aeafd4c6ae2af9f94ac72a/old.dbscheme
new file mode 100644
index 00000000000..ccefb5e2d49
--- /dev/null
+++ b/javascript/downgrades/ccefb5e2d49318eea4aeafd4c6ae2af9f94ac72a/old.dbscheme
@@ -0,0 +1,1194 @@
+/*** Standard fragments ***/
+
+/*- Files and folders -*/
+
+/**
+ * The location of an element.
+ * The location spans column `startcolumn` of line `startline` to
+ * column `endcolumn` of line `endline` in file `file`.
+ * For more information, see
+ * [Locations](https://codeql.github.com/docs/writing-codeql-queries/providing-locations-in-codeql-queries/).
+ */
+locations_default(
+ unique int id: @location_default,
+ int file: @file ref,
+ int beginLine: int ref,
+ int beginColumn: int ref,
+ int endLine: int ref,
+ int endColumn: int ref
+);
+
+files(
+ unique int id: @file,
+ string name: string ref
+);
+
+folders(
+ unique int id: @folder,
+ string name: string ref
+);
+
+@container = @file | @folder
+
+containerparent(
+ int parent: @container ref,
+ unique int child: @container ref
+);
+
+/*- Lines of code -*/
+
+numlines(
+ int element_id: @sourceline ref,
+ int num_lines: int ref,
+ int num_code: int ref,
+ int num_comment: int ref
+);
+
+/*- External data -*/
+
+/**
+ * External data, loaded from CSV files during snapshot creation. See
+ * [Tutorial: Incorporating external data](https://help.semmle.com/wiki/display/SD/Tutorial%3A+Incorporating+external+data)
+ * for more information.
+ */
+externalData(
+ int id : @externalDataElement,
+ string path : string ref,
+ int column: int ref,
+ string value : string ref
+);
+
+/*- Source location prefix -*/
+
+/**
+ * The source location of the snapshot.
+ */
+sourceLocationPrefix(string prefix : string ref);
+
+/*- JavaScript-specific part -*/
+
+@location = @location_default
+
+@sourceline = @locatable;
+
+filetype(
+ int file: @file ref,
+ string filetype: string ref
+)
+
+// top-level code fragments
+toplevels (unique int id: @toplevel,
+ int kind: int ref);
+
+is_externs (int toplevel: @toplevel ref);
+
+case @toplevel.kind of
+ 0 = @script
+| 1 = @inline_script
+| 2 = @event_handler
+| 3 = @javascript_url
+| 4 = @template_toplevel;
+
+is_module (int tl: @toplevel ref);
+is_nodejs (int tl: @toplevel ref);
+is_es2015_module (int tl: @toplevel ref);
+is_closure_module (int tl: @toplevel ref);
+
+@xml_node_with_code = @xmlelement | @xmlattribute | @template_placeholder_tag;
+toplevel_parent_xml_node(
+ unique int toplevel: @toplevel ref,
+ int xmlnode: @xml_node_with_code ref);
+
+xml_element_parent_expression(
+ unique int xmlnode: @xmlelement ref,
+ int expression: @expr ref,
+ int index: int ref);
+
+// statements
+#keyset[parent, idx]
+stmts (unique int id: @stmt,
+ int kind: int ref,
+ int parent: @stmt_parent ref,
+ int idx: int ref,
+ varchar(900) tostring: string ref);
+
+stmt_containers (unique int stmt: @stmt ref,
+ int container: @stmt_container ref);
+
+jump_targets (unique int jump: @stmt ref,
+ int target: @stmt ref);
+
+@stmt_parent = @stmt | @toplevel | @function_expr | @arrow_function_expr | @static_initializer;
+@stmt_container = @toplevel | @function | @namespace_declaration | @external_module_declaration | @global_augmentation_declaration;
+
+case @stmt.kind of
+ 0 = @empty_stmt
+| 1 = @block_stmt
+| 2 = @expr_stmt
+| 3 = @if_stmt
+| 4 = @labeled_stmt
+| 5 = @break_stmt
+| 6 = @continue_stmt
+| 7 = @with_stmt
+| 8 = @switch_stmt
+| 9 = @return_stmt
+| 10 = @throw_stmt
+| 11 = @try_stmt
+| 12 = @while_stmt
+| 13 = @do_while_stmt
+| 14 = @for_stmt
+| 15 = @for_in_stmt
+| 16 = @debugger_stmt
+| 17 = @function_decl_stmt
+| 18 = @var_decl_stmt
+| 19 = @case
+| 20 = @catch_clause
+| 21 = @for_of_stmt
+| 22 = @const_decl_stmt
+| 23 = @let_stmt
+| 24 = @legacy_let_stmt
+| 25 = @for_each_stmt
+| 26 = @class_decl_stmt
+| 27 = @import_declaration
+| 28 = @export_all_declaration
+| 29 = @export_default_declaration
+| 30 = @export_named_declaration
+| 31 = @namespace_declaration
+| 32 = @import_equals_declaration
+| 33 = @export_assign_declaration
+| 34 = @interface_declaration
+| 35 = @type_alias_declaration
+| 36 = @enum_declaration
+| 37 = @external_module_declaration
+| 38 = @export_as_namespace_declaration
+| 39 = @global_augmentation_declaration
+| 40 = @using_decl_stmt
+;
+
+@decl_stmt = @var_decl_stmt | @const_decl_stmt | @let_stmt | @legacy_let_stmt | @using_decl_stmt;
+
+@export_declaration = @export_all_declaration | @export_default_declaration | @export_named_declaration;
+
+@namespace_definition = @namespace_declaration | @enum_declaration;
+@type_definition = @class_definition | @interface_declaration | @enum_declaration | @type_alias_declaration | @enum_member;
+
+is_instantiated(unique int decl: @namespace_declaration ref);
+
+@declarable_node = @decl_stmt | @namespace_declaration | @class_decl_stmt | @function_decl_stmt | @enum_declaration | @external_module_declaration | @global_augmentation_declaration | @field;
+has_declare_keyword(unique int stmt: @declarable_node ref);
+
+is_for_await_of(unique int forof: @for_of_stmt ref);
+
+// expressions
+#keyset[parent, idx]
+exprs (unique int id: @expr,
+ int kind: int ref,
+ int parent: @expr_parent ref,
+ int idx: int ref,
+ varchar(900) tostring: string ref);
+
+literals (varchar(900) value: string ref,
+ varchar(900) raw: string ref,
+ unique int expr: @expr_or_type ref);
+
+enclosing_stmt (unique int expr: @expr_or_type ref,
+ int stmt: @stmt ref);
+
+expr_containers (unique int expr: @expr_or_type ref,
+ int container: @stmt_container ref);
+
+array_size (unique int ae: @arraylike ref,
+ int sz: int ref);
+
+is_delegating (int yield: @yield_expr ref);
+
+@expr_or_stmt = @expr | @stmt;
+@expr_or_type = @expr | @typeexpr;
+@expr_parent = @expr_or_stmt | @property | @function_typeexpr;
+@arraylike = @array_expr | @array_pattern;
+@type_annotation = @typeexpr | @jsdoc_type_expr;
+@node_in_stmt_container = @cfg_node | @type_annotation | @toplevel;
+
+case @expr.kind of
+ 0 = @label
+| 1 = @null_literal
+| 2 = @boolean_literal
+| 3 = @number_literal
+| 4 = @string_literal
+| 5 = @regexp_literal
+| 6 = @this_expr
+| 7 = @array_expr
+| 8 = @obj_expr
+| 9 = @function_expr
+| 10 = @seq_expr
+| 11 = @conditional_expr
+| 12 = @new_expr
+| 13 = @call_expr
+| 14 = @dot_expr
+| 15 = @index_expr
+| 16 = @neg_expr
+| 17 = @plus_expr
+| 18 = @log_not_expr
+| 19 = @bit_not_expr
+| 20 = @typeof_expr
+| 21 = @void_expr
+| 22 = @delete_expr
+| 23 = @eq_expr
+| 24 = @neq_expr
+| 25 = @eqq_expr
+| 26 = @neqq_expr
+| 27 = @lt_expr
+| 28 = @le_expr
+| 29 = @gt_expr
+| 30 = @ge_expr
+| 31 = @lshift_expr
+| 32 = @rshift_expr
+| 33 = @urshift_expr
+| 34 = @add_expr
+| 35 = @sub_expr
+| 36 = @mul_expr
+| 37 = @div_expr
+| 38 = @mod_expr
+| 39 = @bitor_expr
+| 40 = @xor_expr
+| 41 = @bitand_expr
+| 42 = @in_expr
+| 43 = @instanceof_expr
+| 44 = @logand_expr
+| 45 = @logor_expr
+| 47 = @assign_expr
+| 48 = @assign_add_expr
+| 49 = @assign_sub_expr
+| 50 = @assign_mul_expr
+| 51 = @assign_div_expr
+| 52 = @assign_mod_expr
+| 53 = @assign_lshift_expr
+| 54 = @assign_rshift_expr
+| 55 = @assign_urshift_expr
+| 56 = @assign_or_expr
+| 57 = @assign_xor_expr
+| 58 = @assign_and_expr
+| 59 = @preinc_expr
+| 60 = @postinc_expr
+| 61 = @predec_expr
+| 62 = @postdec_expr
+| 63 = @par_expr
+| 64 = @var_declarator
+| 65 = @arrow_function_expr
+| 66 = @spread_element
+| 67 = @array_pattern
+| 68 = @object_pattern
+| 69 = @yield_expr
+| 70 = @tagged_template_expr
+| 71 = @template_literal
+| 72 = @template_element
+| 73 = @array_comprehension_expr
+| 74 = @generator_expr
+| 75 = @for_in_comprehension_block
+| 76 = @for_of_comprehension_block
+| 77 = @legacy_letexpr
+| 78 = @var_decl
+| 79 = @proper_varaccess
+| 80 = @class_expr
+| 81 = @super_expr
+| 82 = @newtarget_expr
+| 83 = @named_import_specifier
+| 84 = @import_default_specifier
+| 85 = @import_namespace_specifier
+| 86 = @named_export_specifier
+| 87 = @exp_expr
+| 88 = @assign_exp_expr
+| 89 = @jsx_element
+| 90 = @jsx_qualified_name
+| 91 = @jsx_empty_expr
+| 92 = @await_expr
+| 93 = @function_sent_expr
+| 94 = @decorator
+| 95 = @export_default_specifier
+| 96 = @export_namespace_specifier
+| 97 = @bind_expr
+| 98 = @external_module_reference
+| 99 = @dynamic_import
+| 100 = @expression_with_type_arguments
+| 101 = @prefix_type_assertion
+| 102 = @as_type_assertion
+| 103 = @export_varaccess
+| 104 = @decorator_list
+| 105 = @non_null_assertion
+| 106 = @bigint_literal
+| 107 = @nullishcoalescing_expr
+| 108 = @e4x_xml_anyname
+| 109 = @e4x_xml_static_attribute_selector
+| 110 = @e4x_xml_dynamic_attribute_selector
+| 111 = @e4x_xml_filter_expression
+| 112 = @e4x_xml_static_qualident
+| 113 = @e4x_xml_dynamic_qualident
+| 114 = @e4x_xml_dotdotexpr
+| 115 = @import_meta_expr
+| 116 = @assignlogandexpr
+| 117 = @assignlogorexpr
+| 118 = @assignnullishcoalescingexpr
+| 119 = @template_pipe_ref
+| 120 = @generated_code_expr
+| 121 = @satisfies_expr
+;
+
+@varaccess = @proper_varaccess | @export_varaccess;
+@varref = @var_decl | @varaccess;
+
+@identifier = @label | @varref | @type_identifier;
+
+@literal = @null_literal | @boolean_literal | @number_literal | @string_literal | @regexp_literal | @bigint_literal;
+
+@propaccess = @dot_expr | @index_expr;
+
+@invokeexpr = @new_expr | @call_expr;
+
+@unaryexpr = @neg_expr | @plus_expr | @log_not_expr | @bit_not_expr | @typeof_expr | @void_expr | @delete_expr | @spread_element;
+
+@equality_test = @eq_expr | @neq_expr | @eqq_expr | @neqq_expr;
+
+@comparison = @equality_test | @lt_expr | @le_expr | @gt_expr | @ge_expr;
+
+@binaryexpr = @comparison | @lshift_expr | @rshift_expr | @urshift_expr | @add_expr | @sub_expr | @mul_expr | @div_expr | @mod_expr | @exp_expr | @bitor_expr | @xor_expr | @bitand_expr | @in_expr | @instanceof_expr | @logand_expr | @logor_expr | @nullishcoalescing_expr;
+
+@assignment = @assign_expr | @assign_add_expr | @assign_sub_expr | @assign_mul_expr | @assign_div_expr | @assign_mod_expr | @assign_exp_expr | @assign_lshift_expr | @assign_rshift_expr | @assign_urshift_expr | @assign_or_expr | @assign_xor_expr | @assign_and_expr | @assignlogandexpr | @assignlogorexpr | @assignnullishcoalescingexpr;
+
+@updateexpr = @preinc_expr | @postinc_expr | @predec_expr | @postdec_expr;
+
+@pattern = @varref | @array_pattern | @object_pattern;
+
+@comprehension_expr = @array_comprehension_expr | @generator_expr;
+
+@comprehension_block = @for_in_comprehension_block | @for_of_comprehension_block;
+
+@import_specifier = @named_import_specifier | @import_default_specifier | @import_namespace_specifier;
+
+@exportspecifier = @named_export_specifier | @export_default_specifier | @export_namespace_specifier;
+
+@type_keyword_operand = @import_declaration | @export_declaration | @import_specifier;
+
+@type_assertion = @as_type_assertion | @prefix_type_assertion;
+
+@class_definition = @class_decl_stmt | @class_expr;
+@interface_definition = @interface_declaration | @interface_typeexpr;
+@class_or_interface = @class_definition | @interface_definition;
+
+@lexical_decl = @var_decl | @type_decl;
+@lexical_access = @varaccess | @local_type_access | @local_var_type_access | @local_namespace_access;
+@lexical_ref = @lexical_decl | @lexical_access;
+
+@e4x_xml_attribute_selector = @e4x_xml_static_attribute_selector | @e4x_xml_dynamic_attribute_selector;
+@e4x_xml_qualident = @e4x_xml_static_qualident | @e4x_xml_dynamic_qualident;
+
+expr_contains_template_tag_location(
+ int expr: @expr ref,
+ int location: @location ref
+);
+
+@template_placeholder_tag_parent = @xmlelement | @xmlattribute | @file;
+
+template_placeholder_tag_info(
+ unique int node: @template_placeholder_tag,
+ int parentNode: @template_placeholder_tag_parent ref,
+ varchar(900) raw: string ref
+);
+
+// scopes
+scopes (unique int id: @scope,
+ int kind: int ref);
+
+case @scope.kind of
+ 0 = @global_scope
+| 1 = @function_scope
+| 2 = @catch_scope
+| 3 = @module_scope
+| 4 = @block_scope
+| 5 = @for_scope
+| 6 = @for_in_scope // for-of scopes work the same as for-in scopes
+| 7 = @comprehension_block_scope
+| 8 = @class_expr_scope
+| 9 = @namespace_scope
+| 10 = @class_decl_scope
+| 11 = @interface_scope
+| 12 = @type_alias_scope
+| 13 = @mapped_type_scope
+| 14 = @enum_scope
+| 15 = @external_module_scope
+| 16 = @conditional_type_scope;
+
+scopenodes (unique int node: @ast_node ref,
+ int scope: @scope ref);
+
+scopenesting (unique int inner: @scope ref,
+ int outer: @scope ref);
+
+// functions
+@function = @function_decl_stmt | @function_expr | @arrow_function_expr;
+
+@parameterized = @function | @catch_clause;
+@type_parameterized = @function | @class_or_interface | @type_alias_declaration | @mapped_typeexpr | @infer_typeexpr;
+
+is_generator (int fun: @function ref);
+has_rest_parameter (int fun: @function ref);
+is_async (int fun: @function ref);
+
+// variables and lexically scoped type names
+#keyset[scope, name]
+variables (unique int id: @variable,
+ varchar(900) name: string ref,
+ int scope: @scope ref);
+
+#keyset[scope, name]
+local_type_names (unique int id: @local_type_name,
+ varchar(900) name: string ref,
+ int scope: @scope ref);
+
+#keyset[scope, name]
+local_namespace_names (unique int id: @local_namespace_name,
+ varchar(900) name: string ref,
+ int scope: @scope ref);
+
+is_arguments_object (int id: @variable ref);
+
+@lexical_name = @variable | @local_type_name | @local_namespace_name;
+
+@bind_id = @varaccess | @local_var_type_access;
+bind (unique int id: @bind_id ref,
+ int decl: @variable ref);
+
+decl (unique int id: @var_decl ref,
+ int decl: @variable ref);
+
+@typebind_id = @local_type_access | @export_varaccess;
+typebind (unique int id: @typebind_id ref,
+ int decl: @local_type_name ref);
+
+@typedecl_id = @type_decl | @var_decl;
+typedecl (unique int id: @typedecl_id ref,
+ int decl: @local_type_name ref);
+
+namespacedecl (unique int id: @var_decl ref,
+ int decl: @local_namespace_name ref);
+
+@namespacebind_id = @local_namespace_access | @export_varaccess;
+namespacebind (unique int id: @namespacebind_id ref,
+ int decl: @local_namespace_name ref);
+
+
+// properties in object literals, property patterns in object patterns, and method declarations in classes
+#keyset[parent, index]
+properties (unique int id: @property,
+ int parent: @property_parent ref,
+ int index: int ref,
+ int kind: int ref,
+ varchar(900) tostring: string ref);
+
+case @property.kind of
+ 0 = @value_property
+| 1 = @property_getter
+| 2 = @property_setter
+| 3 = @jsx_attribute
+| 4 = @function_call_signature
+| 5 = @constructor_call_signature
+| 6 = @index_signature
+| 7 = @enum_member
+| 8 = @proper_field
+| 9 = @parameter_field
+| 10 = @static_initializer
+;
+
+@property_parent = @obj_expr | @object_pattern | @class_definition | @jsx_element | @interface_definition | @enum_declaration;
+@property_accessor = @property_getter | @property_setter;
+@call_signature = @function_call_signature | @constructor_call_signature;
+@field = @proper_field | @parameter_field;
+@field_or_vardeclarator = @field | @var_declarator;
+
+is_computed (int id: @property ref);
+is_method (int id: @property ref);
+is_static (int id: @property ref);
+is_abstract_member (int id: @property ref);
+is_const_enum (int id: @enum_declaration ref);
+is_abstract_class (int id: @class_decl_stmt ref);
+
+has_public_keyword (int id: @property ref);
+has_private_keyword (int id: @property ref);
+has_protected_keyword (int id: @property ref);
+has_readonly_keyword (int id: @property ref);
+has_type_keyword (int id: @type_keyword_operand ref);
+is_optional_member (int id: @property ref);
+has_definite_assignment_assertion (int id: @field_or_vardeclarator ref);
+is_optional_parameter_declaration (unique int parameter: @pattern ref);
+
+#keyset[constructor, param_index]
+parameter_fields(
+ unique int field: @parameter_field ref,
+ int constructor: @function_expr ref,
+ int param_index: int ref
+);
+
+// types
+#keyset[parent, idx]
+typeexprs (
+ unique int id: @typeexpr,
+ int kind: int ref,
+ int parent: @typeexpr_parent ref,
+ int idx: int ref,
+ varchar(900) tostring: string ref
+);
+
+case @typeexpr.kind of
+ 0 = @local_type_access
+| 1 = @type_decl
+| 2 = @keyword_typeexpr
+| 3 = @string_literal_typeexpr
+| 4 = @number_literal_typeexpr
+| 5 = @boolean_literal_typeexpr
+| 6 = @array_typeexpr
+| 7 = @union_typeexpr
+| 8 = @indexed_access_typeexpr
+| 9 = @intersection_typeexpr
+| 10 = @parenthesized_typeexpr
+| 11 = @tuple_typeexpr
+| 12 = @keyof_typeexpr
+| 13 = @qualified_type_access
+| 14 = @generic_typeexpr
+| 15 = @type_label
+| 16 = @typeof_typeexpr
+| 17 = @local_var_type_access
+| 18 = @qualified_var_type_access
+| 19 = @this_var_type_access
+| 20 = @predicate_typeexpr
+| 21 = @interface_typeexpr
+| 22 = @type_parameter
+| 23 = @plain_function_typeexpr
+| 24 = @constructor_typeexpr
+| 25 = @local_namespace_access
+| 26 = @qualified_namespace_access
+| 27 = @mapped_typeexpr
+| 28 = @conditional_typeexpr
+| 29 = @infer_typeexpr
+| 30 = @import_type_access
+| 31 = @import_namespace_access
+| 32 = @import_var_type_access
+| 33 = @optional_typeexpr
+| 34 = @rest_typeexpr
+| 35 = @bigint_literal_typeexpr
+| 36 = @readonly_typeexpr
+| 37 = @template_literal_typeexpr
+;
+
+@typeref = @typeaccess | @type_decl;
+@type_identifier = @type_decl | @local_type_access | @type_label | @local_var_type_access | @local_namespace_access;
+@typeexpr_parent = @expr | @stmt | @property | @typeexpr;
+@literal_typeexpr = @string_literal_typeexpr | @number_literal_typeexpr | @boolean_literal_typeexpr | @bigint_literal_typeexpr;
+@typeaccess = @local_type_access | @qualified_type_access | @import_type_access;
+@vartypeaccess = @local_var_type_access | @qualified_var_type_access | @this_var_type_access | @import_var_type_access;
+@namespace_access = @local_namespace_access | @qualified_namespace_access | @import_namespace_access;
+@import_typeexpr = @import_type_access | @import_namespace_access | @import_var_type_access;
+
+@function_typeexpr = @plain_function_typeexpr | @constructor_typeexpr;
+
+// types
+types (
+ unique int id: @type,
+ int kind: int ref,
+ varchar(900) tostring: string ref
+);
+
+#keyset[parent, idx]
+type_child (
+ int child: @type ref,
+ int parent: @type ref,
+ int idx: int ref
+);
+
+case @type.kind of
+ 0 = @any_type
+| 1 = @string_type
+| 2 = @number_type
+| 3 = @union_type
+| 4 = @true_type
+| 5 = @false_type
+| 6 = @type_reference
+| 7 = @object_type
+| 8 = @canonical_type_variable_type
+| 9 = @typeof_type
+| 10 = @void_type
+| 11 = @undefined_type
+| 12 = @null_type
+| 13 = @never_type
+| 14 = @plain_symbol_type
+| 15 = @unique_symbol_type
+| 16 = @objectkeyword_type
+| 17 = @intersection_type
+| 18 = @tuple_type
+| 19 = @lexical_type_variable_type
+| 20 = @this_type
+| 21 = @number_literal_type
+| 22 = @string_literal_type
+| 23 = @unknown_type
+| 24 = @bigint_type
+| 25 = @bigint_literal_type
+;
+
+@boolean_literal_type = @true_type | @false_type;
+@symbol_type = @plain_symbol_type | @unique_symbol_type;
+@union_or_intersection_type = @union_type | @intersection_type;
+@typevariable_type = @canonical_type_variable_type | @lexical_type_variable_type;
+
+has_asserts_keyword(int node: @predicate_typeexpr ref);
+
+@typed_ast_node = @expr | @typeexpr | @function;
+ast_node_type(
+ unique int node: @typed_ast_node ref,
+ int typ: @type ref);
+
+declared_function_signature(
+ unique int node: @function ref,
+ int sig: @signature_type ref
+);
+
+invoke_expr_signature(
+ unique int node: @invokeexpr ref,
+ int sig: @signature_type ref
+);
+
+invoke_expr_overload_index(
+ unique int node: @invokeexpr ref,
+ int index: int ref
+);
+
+symbols (
+ unique int id: @symbol,
+ int kind: int ref,
+ varchar(900) name: string ref
+);
+
+symbol_parent (
+ unique int symbol: @symbol ref,
+ int parent: @symbol ref
+);
+
+symbol_module (
+ int symbol: @symbol ref,
+ varchar(900) moduleName: string ref
+);
+
+symbol_global (
+ int symbol: @symbol ref,
+ varchar(900) globalName: string ref
+);
+
+case @symbol.kind of
+ 0 = @root_symbol
+| 1 = @member_symbol
+| 2 = @other_symbol
+;
+
+@type_with_symbol = @type_reference | @typevariable_type | @typeof_type | @unique_symbol_type;
+@ast_node_with_symbol = @type_definition | @namespace_definition | @toplevel | @typeaccess | @namespace_access | @var_decl | @function | @invokeexpr | @import_declaration | @external_module_reference | @external_module_declaration;
+
+ast_node_symbol(
+ unique int node: @ast_node_with_symbol ref,
+ int symbol: @symbol ref);
+
+type_symbol(
+ unique int typ: @type_with_symbol ref,
+ int symbol: @symbol ref);
+
+#keyset[typ, name]
+type_property(
+ int typ: @type ref,
+ varchar(900) name: string ref,
+ int propertyType: @type ref);
+
+type_alias(
+ unique int aliasType: @type ref,
+ int underlyingType: @type ref);
+
+@literal_type = @string_literal_type | @number_literal_type | @boolean_literal_type | @bigint_literal_type;
+@type_with_literal_value = @string_literal_type | @number_literal_type | @bigint_literal_type;
+type_literal_value(
+ unique int typ: @type_with_literal_value ref,
+ varchar(900) value: string ref);
+
+signature_types (
+ unique int id: @signature_type,
+ int kind: int ref,
+ varchar(900) tostring: string ref,
+ int type_parameters: int ref,
+ int required_params: int ref
+);
+
+is_abstract_signature(
+ unique int sig: @signature_type ref
+);
+
+signature_rest_parameter(
+ unique int sig: @signature_type ref,
+ int rest_param_arra_type: @type ref
+);
+
+case @signature_type.kind of
+ 0 = @function_signature_type
+| 1 = @constructor_signature_type
+;
+
+#keyset[typ, kind, index]
+type_contains_signature (
+ int typ: @type ref,
+ int kind: int ref, // constructor/call/index
+ int index: int ref, // ordering of overloaded signatures
+ int sig: @signature_type ref
+);
+
+#keyset[parent, index]
+signature_contains_type (
+ int child: @type ref,
+ int parent: @signature_type ref,
+ int index: int ref
+);
+
+#keyset[sig, index]
+signature_parameter_name (
+ int sig: @signature_type ref,
+ int index: int ref,
+ varchar(900) name: string ref
+);
+
+number_index_type (
+ unique int baseType: @type ref,
+ int propertyType: @type ref
+);
+
+string_index_type (
+ unique int baseType: @type ref,
+ int propertyType: @type ref
+);
+
+base_type_names(
+ int typeName: @symbol ref,
+ int baseTypeName: @symbol ref
+);
+
+self_types(
+ int typeName: @symbol ref,
+ int selfType: @type_reference ref
+);
+
+tuple_type_min_length(
+ unique int typ: @type ref,
+ int minLength: int ref
+);
+
+tuple_type_rest_index(
+ unique int typ: @type ref,
+ int index: int ref
+);
+
+// comments
+comments (unique int id: @comment,
+ int kind: int ref,
+ int toplevel: @toplevel ref,
+ varchar(900) text: string ref,
+ varchar(900) tostring: string ref);
+
+case @comment.kind of
+ 0 = @slashslash_comment
+| 1 = @slashstar_comment
+| 2 = @doc_comment
+| 3 = @html_comment_start
+| 4 = @htmlcommentend;
+
+@html_comment = @html_comment_start | @htmlcommentend;
+@line_comment = @slashslash_comment | @html_comment;
+@block_comment = @slashstar_comment | @doc_comment;
+
+// source lines
+lines (unique int id: @line,
+ int toplevel: @toplevel ref,
+ varchar(900) text: string ref,
+ varchar(2) terminator: string ref);
+indentation (int file: @file ref,
+ int lineno: int ref,
+ varchar(1) indentChar: string ref,
+ int indentDepth: int ref);
+
+// JavaScript parse errors
+js_parse_errors (unique int id: @js_parse_error,
+ int toplevel: @toplevel ref,
+ varchar(900) message: string ref,
+ varchar(900) line: string ref);
+
+// regular expressions
+#keyset[parent, idx]
+regexpterm (unique int id: @regexpterm,
+ int kind: int ref,
+ int parent: @regexpparent ref,
+ int idx: int ref,
+ varchar(900) tostring: string ref);
+
+@regexpparent = @regexpterm | @regexp_literal | @string_literal | @add_expr;
+
+case @regexpterm.kind of
+ 0 = @regexp_alt
+| 1 = @regexp_seq
+| 2 = @regexp_caret
+| 3 = @regexp_dollar
+| 4 = @regexp_wordboundary
+| 5 = @regexp_nonwordboundary
+| 6 = @regexp_positive_lookahead
+| 7 = @regexp_negative_lookahead
+| 8 = @regexp_star
+| 9 = @regexp_plus
+| 10 = @regexp_opt
+| 11 = @regexp_range
+| 12 = @regexp_dot
+| 13 = @regexp_group
+| 14 = @regexp_normal_constant
+| 15 = @regexp_hex_escape
+| 16 = @regexp_unicode_escape
+| 17 = @regexp_dec_escape
+| 18 = @regexp_oct_escape
+| 19 = @regexp_ctrl_escape
+| 20 = @regexp_char_class_escape
+| 21 = @regexp_id_escape
+| 22 = @regexp_backref
+| 23 = @regexp_char_class
+| 24 = @regexp_char_range
+| 25 = @regexp_positive_lookbehind
+| 26 = @regexp_negative_lookbehind
+| 27 = @regexp_unicode_property_escape
+| 28 = @regexp_quoted_string
+| 29 = @regexp_intersection
+| 30 = @regexp_subtraction;
+
+regexp_parse_errors (unique int id: @regexp_parse_error,
+ int regexp: @regexpterm ref,
+ varchar(900) message: string ref);
+
+@regexp_quantifier = @regexp_star | @regexp_plus | @regexp_opt | @regexp_range;
+@regexp_escape = @regexp_char_escape | @regexp_char_class_escape | @regexp_unicode_property_escape;
+@regexp_char_escape = @regexp_hex_escape | @regexp_unicode_escape | @regexp_dec_escape | @regexp_oct_escape | @regexp_ctrl_escape | @regexp_id_escape;
+@regexp_constant = @regexp_normal_constant | @regexp_char_escape;
+@regexp_lookahead = @regexp_positive_lookahead | @regexp_negative_lookahead;
+@regexp_lookbehind = @regexp_positive_lookbehind | @regexp_negative_lookbehind;
+@regexp_subpattern = @regexp_lookahead | @regexp_lookbehind;
+@regexp_anchor = @regexp_dollar | @regexp_caret;
+
+is_greedy (int id: @regexp_quantifier ref);
+range_quantifier_lower_bound (unique int id: @regexp_range ref, int lo: int ref);
+range_quantifier_upper_bound (unique int id: @regexp_range ref, int hi: int ref);
+is_capture (unique int id: @regexp_group ref, int number: int ref);
+is_named_capture (unique int id: @regexp_group ref, string name: string ref);
+is_inverted (int id: @regexp_char_class ref);
+regexp_const_value (unique int id: @regexp_constant ref, varchar(1) value: string ref);
+char_class_escape (unique int id: @regexp_char_class_escape ref, varchar(1) value: string ref);
+backref (unique int id: @regexp_backref ref, int value: int ref);
+named_backref (unique int id: @regexp_backref ref, string name: string ref);
+unicode_property_escapename (unique int id: @regexp_unicode_property_escape ref, string name: string ref);
+unicode_property_escapevalue (unique int id: @regexp_unicode_property_escape ref, string value: string ref);
+
+// tokens
+#keyset[toplevel, idx]
+tokeninfo (unique int id: @token,
+ int kind: int ref,
+ int toplevel: @toplevel ref,
+ int idx: int ref,
+ varchar(900) value: string ref);
+
+case @token.kind of
+ 0 = @token_eof
+| 1 = @token_null_literal
+| 2 = @token_boolean_literal
+| 3 = @token_numeric_literal
+| 4 = @token_string_literal
+| 5 = @token_regular_expression
+| 6 = @token_identifier
+| 7 = @token_keyword
+| 8 = @token_punctuator;
+
+// associate comments with the token immediately following them (which may be EOF)
+next_token (int comment: @comment ref, int token: @token ref);
+
+// JSON
+#keyset[parent, idx]
+json (unique int id: @json_value,
+ int kind: int ref,
+ int parent: @json_parent ref,
+ int idx: int ref,
+ varchar(900) tostring: string ref);
+
+json_literals (varchar(900) value: string ref,
+ varchar(900) raw: string ref,
+ unique int expr: @json_value ref);
+
+json_properties (int obj: @json_object ref,
+ varchar(900) property: string ref,
+ int value: @json_value ref);
+
+json_errors (unique int id: @json_parse_error,
+ varchar(900) message: string ref);
+
+json_locations(unique int locatable: @json_locatable ref,
+ int location: @location_default ref);
+
+case @json_value.kind of
+ 0 = @json_null
+| 1 = @json_boolean
+| 2 = @json_number
+| 3 = @json_string
+| 4 = @json_array
+| 5 = @json_object;
+
+@json_parent = @json_object | @json_array | @file;
+
+@json_locatable = @json_value | @json_parse_error;
+
+// locations
+@ast_node = @toplevel | @stmt | @expr | @property | @typeexpr;
+
+@locatable = @file
+ | @ast_node
+ | @comment
+ | @line
+ | @js_parse_error | @regexp_parse_error
+ | @regexpterm
+ | @json_locatable
+ | @token
+ | @cfg_node
+ | @jsdoc | @jsdoc_type_expr | @jsdoc_tag
+ | @yaml_locatable
+ | @xmllocatable
+ | @configLocatable
+ | @template_placeholder_tag;
+
+hasLocation (unique int locatable: @locatable ref,
+ int location: @location ref);
+
+// CFG
+entry_cfg_node (unique int id: @entry_node, int container: @stmt_container ref);
+exit_cfg_node (unique int id: @exit_node, int container: @stmt_container ref);
+guard_node (unique int id: @guard_node, int kind: int ref, int test: @expr ref);
+case @guard_node.kind of
+ 0 = @falsy_guard
+| 1 = @truthy_guard;
+@condition_guard = @falsy_guard | @truthy_guard;
+
+@synthetic_cfg_node = @entry_node | @exit_node | @guard_node;
+@cfg_node = @synthetic_cfg_node | @expr_parent;
+
+successor (int pred: @cfg_node ref, int succ: @cfg_node ref);
+
+// JSDoc comments
+jsdoc (unique int id: @jsdoc, varchar(900) description: string ref, int comment: @comment ref);
+#keyset[parent, idx]
+jsdoc_tags (unique int id: @jsdoc_tag, varchar(900) title: string ref,
+ int parent: @jsdoc ref, int idx: int ref, varchar(900) tostring: string ref);
+jsdoc_tag_descriptions (unique int tag: @jsdoc_tag ref, varchar(900) text: string ref);
+jsdoc_tag_names (unique int tag: @jsdoc_tag ref, varchar(900) text: string ref);
+
+#keyset[parent, idx]
+jsdoc_type_exprs (unique int id: @jsdoc_type_expr,
+ int kind: int ref,
+ int parent: @jsdoc_type_expr_parent ref,
+ int idx: int ref,
+ varchar(900) tostring: string ref);
+case @jsdoc_type_expr.kind of
+ 0 = @jsdoc_any_type_expr
+| 1 = @jsdoc_null_type_expr
+| 2 = @jsdoc_undefined_type_expr
+| 3 = @jsdoc_unknown_type_expr
+| 4 = @jsdoc_void_type_expr
+| 5 = @jsdoc_identifier_type_expr
+| 6 = @jsdoc_applied_type_expr
+| 7 = @jsdoc_nullable_type_expr
+| 8 = @jsdoc_non_nullable_type_expr
+| 9 = @jsdoc_record_type_expr
+| 10 = @jsdoc_array_type_expr
+| 11 = @jsdoc_union_type_expr
+| 12 = @jsdoc_function_type_expr
+| 13 = @jsdoc_optional_type_expr
+| 14 = @jsdoc_rest_type_expr
+| 15 = @jsdoc_qualified_type_expr
+;
+
+#keyset[id, idx]
+jsdoc_record_field_name (int id: @jsdoc_record_type_expr ref, int idx: int ref, varchar(900) name: string ref);
+jsdoc_prefix_qualifier (int id: @jsdoc_type_expr ref);
+jsdoc_has_new_parameter (int fn: @jsdoc_function_type_expr ref);
+
+@jsdoc_type_expr_parent = @jsdoc_type_expr | @jsdoc_tag;
+
+jsdoc_errors (unique int id: @jsdoc_error, int tag: @jsdoc_tag ref, varchar(900) message: string ref, varchar(900) tostring: string ref);
+
+@dataflownode = @expr | @function_decl_stmt | @class_decl_stmt | @namespace_declaration | @enum_declaration | @property;
+
+@optionalchainable = @call_expr | @propaccess;
+
+isOptionalChaining(int id: @optionalchainable ref);
+
+/**
+ * The time taken for the extraction of a file.
+ * This table contains non-deterministic content.
+ *
+ * The sum of the `time` column for each (`file`, `timerKind`) pair
+ * is the total time taken for extraction of `file`. The `extractionPhase`
+ * column provides a granular view of the extraction time of the file.
+ */
+extraction_time(
+ int file : @file ref,
+ // see `com.semmle.js.extractor.ExtractionMetrics.ExtractionPhase`.
+ int extractionPhase: int ref,
+ // 0 for the elapsed CPU time in nanoseconds, 1 for the elapsed wallclock time in nanoseconds
+ int timerKind: int ref,
+ float time: float ref
+)
+
+/**
+* Non-timing related data for the extraction of a single file.
+* This table contains non-deterministic content.
+*/
+extraction_data(
+ int file : @file ref,
+ // the absolute path to the cache file
+ varchar(900) cacheFile: string ref,
+ boolean fromCache: boolean ref,
+ int length: int ref
+)
+
+/*- YAML -*/
+
+#keyset[parent, idx]
+yaml (unique int id: @yaml_node,
+ int kind: int ref,
+ int parent: @yaml_node_parent ref,
+ int idx: int ref,
+ string tag: string ref,
+ string tostring: string ref);
+
+case @yaml_node.kind of
+ 0 = @yaml_scalar_node
+| 1 = @yaml_mapping_node
+| 2 = @yaml_sequence_node
+| 3 = @yaml_alias_node
+;
+
+@yaml_collection_node = @yaml_mapping_node | @yaml_sequence_node;
+
+@yaml_node_parent = @yaml_collection_node | @file;
+
+yaml_anchors (unique int node: @yaml_node ref,
+ string anchor: string ref);
+
+yaml_aliases (unique int alias: @yaml_alias_node ref,
+ string target: string ref);
+
+yaml_scalars (unique int scalar: @yaml_scalar_node ref,
+ int style: int ref,
+ string value: string ref);
+
+yaml_errors (unique int id: @yaml_error,
+ string message: string ref);
+
+yaml_locations(unique int locatable: @yaml_locatable ref,
+ int location: @location_default ref);
+
+@yaml_locatable = @yaml_node | @yaml_error;
+
+/*- XML Files -*/
+
+xmlEncoding(
+ unique int id: @file ref,
+ string encoding: string ref
+);
+
+xmlDTDs(
+ unique int id: @xmldtd,
+ string root: string ref,
+ string publicId: string ref,
+ string systemId: string ref,
+ int fileid: @file ref
+);
+
+xmlElements(
+ unique int id: @xmlelement,
+ string name: string ref,
+ int parentid: @xmlparent ref,
+ int idx: int ref,
+ int fileid: @file ref
+);
+
+xmlAttrs(
+ unique int id: @xmlattribute,
+ int elementid: @xmlelement ref,
+ string name: string ref,
+ string value: string ref,
+ int idx: int ref,
+ int fileid: @file ref
+);
+
+xmlNs(
+ int id: @xmlnamespace,
+ string prefixName: string ref,
+ string URI: string ref,
+ int fileid: @file ref
+);
+
+xmlHasNs(
+ int elementId: @xmlnamespaceable ref,
+ int nsId: @xmlnamespace ref,
+ int fileid: @file ref
+);
+
+xmlComments(
+ unique int id: @xmlcomment,
+ string text: string ref,
+ int parentid: @xmlparent ref,
+ int fileid: @file ref
+);
+
+xmlChars(
+ unique int id: @xmlcharacters,
+ string text: string ref,
+ int parentid: @xmlparent ref,
+ int idx: int ref,
+ int isCDATA: int ref,
+ int fileid: @file ref
+);
+
+@xmlparent = @file | @xmlelement;
+@xmlnamespaceable = @xmlelement | @xmlattribute;
+
+xmllocations(
+ int xmlElement: @xmllocatable ref,
+ int location: @location_default ref
+);
+
+@xmllocatable = @xmlcharacters | @xmlelement | @xmlcomment | @xmlattribute | @xmldtd | @file | @xmlnamespace;
+
+/*- Configuration files with key value pairs -*/
+
+configs(
+ unique int id: @config
+);
+
+configNames(
+ unique int id: @configName,
+ int config: @config ref,
+ string name: string ref
+);
+
+configValues(
+ unique int id: @configValue,
+ int config: @config ref,
+ string value: string ref
+);
+
+configLocations(
+ int locatable: @configLocatable ref,
+ int location: @location_default ref
+);
+
+@configLocatable = @config | @configName | @configValue;
diff --git a/javascript/downgrades/ccefb5e2d49318eea4aeafd4c6ae2af9f94ac72a/semmlecode.javascript.dbscheme b/javascript/downgrades/ccefb5e2d49318eea4aeafd4c6ae2af9f94ac72a/semmlecode.javascript.dbscheme
new file mode 100644
index 00000000000..5b5db607d20
--- /dev/null
+++ b/javascript/downgrades/ccefb5e2d49318eea4aeafd4c6ae2af9f94ac72a/semmlecode.javascript.dbscheme
@@ -0,0 +1,1193 @@
+/*** Standard fragments ***/
+
+/*- Files and folders -*/
+
+/**
+ * The location of an element.
+ * The location spans column `startcolumn` of line `startline` to
+ * column `endcolumn` of line `endline` in file `file`.
+ * For more information, see
+ * [Locations](https://codeql.github.com/docs/writing-codeql-queries/providing-locations-in-codeql-queries/).
+ */
+locations_default(
+ unique int id: @location_default,
+ int file: @file ref,
+ int beginLine: int ref,
+ int beginColumn: int ref,
+ int endLine: int ref,
+ int endColumn: int ref
+);
+
+files(
+ unique int id: @file,
+ string name: string ref
+);
+
+folders(
+ unique int id: @folder,
+ string name: string ref
+);
+
+@container = @file | @folder
+
+containerparent(
+ int parent: @container ref,
+ unique int child: @container ref
+);
+
+/*- Lines of code -*/
+
+numlines(
+ int element_id: @sourceline ref,
+ int num_lines: int ref,
+ int num_code: int ref,
+ int num_comment: int ref
+);
+
+/*- External data -*/
+
+/**
+ * External data, loaded from CSV files during snapshot creation. See
+ * [Tutorial: Incorporating external data](https://help.semmle.com/wiki/display/SD/Tutorial%3A+Incorporating+external+data)
+ * for more information.
+ */
+externalData(
+ int id : @externalDataElement,
+ string path : string ref,
+ int column: int ref,
+ string value : string ref
+);
+
+/*- Source location prefix -*/
+
+/**
+ * The source location of the snapshot.
+ */
+sourceLocationPrefix(string prefix : string ref);
+
+/*- JavaScript-specific part -*/
+
+@location = @location_default
+
+@sourceline = @locatable;
+
+filetype(
+ int file: @file ref,
+ string filetype: string ref
+)
+
+// top-level code fragments
+toplevels (unique int id: @toplevel,
+ int kind: int ref);
+
+is_externs (int toplevel: @toplevel ref);
+
+case @toplevel.kind of
+ 0 = @script
+| 1 = @inline_script
+| 2 = @event_handler
+| 3 = @javascript_url
+| 4 = @template_toplevel;
+
+is_module (int tl: @toplevel ref);
+is_nodejs (int tl: @toplevel ref);
+is_es2015_module (int tl: @toplevel ref);
+is_closure_module (int tl: @toplevel ref);
+
+@xml_node_with_code = @xmlelement | @xmlattribute | @template_placeholder_tag;
+toplevel_parent_xml_node(
+ unique int toplevel: @toplevel ref,
+ int xmlnode: @xml_node_with_code ref);
+
+xml_element_parent_expression(
+ unique int xmlnode: @xmlelement ref,
+ int expression: @expr ref,
+ int index: int ref);
+
+// statements
+#keyset[parent, idx]
+stmts (unique int id: @stmt,
+ int kind: int ref,
+ int parent: @stmt_parent ref,
+ int idx: int ref,
+ varchar(900) tostring: string ref);
+
+stmt_containers (unique int stmt: @stmt ref,
+ int container: @stmt_container ref);
+
+jump_targets (unique int jump: @stmt ref,
+ int target: @stmt ref);
+
+@stmt_parent = @stmt | @toplevel | @function_expr | @arrow_function_expr | @static_initializer;
+@stmt_container = @toplevel | @function | @namespace_declaration | @external_module_declaration | @global_augmentation_declaration;
+
+case @stmt.kind of
+ 0 = @empty_stmt
+| 1 = @block_stmt
+| 2 = @expr_stmt
+| 3 = @if_stmt
+| 4 = @labeled_stmt
+| 5 = @break_stmt
+| 6 = @continue_stmt
+| 7 = @with_stmt
+| 8 = @switch_stmt
+| 9 = @return_stmt
+| 10 = @throw_stmt
+| 11 = @try_stmt
+| 12 = @while_stmt
+| 13 = @do_while_stmt
+| 14 = @for_stmt
+| 15 = @for_in_stmt
+| 16 = @debugger_stmt
+| 17 = @function_decl_stmt
+| 18 = @var_decl_stmt
+| 19 = @case
+| 20 = @catch_clause
+| 21 = @for_of_stmt
+| 22 = @const_decl_stmt
+| 23 = @let_stmt
+| 24 = @legacy_let_stmt
+| 25 = @for_each_stmt
+| 26 = @class_decl_stmt
+| 27 = @import_declaration
+| 28 = @export_all_declaration
+| 29 = @export_default_declaration
+| 30 = @export_named_declaration
+| 31 = @namespace_declaration
+| 32 = @import_equals_declaration
+| 33 = @export_assign_declaration
+| 34 = @interface_declaration
+| 35 = @type_alias_declaration
+| 36 = @enum_declaration
+| 37 = @external_module_declaration
+| 38 = @export_as_namespace_declaration
+| 39 = @global_augmentation_declaration
+| 40 = @using_decl_stmt
+;
+
+@decl_stmt = @var_decl_stmt | @const_decl_stmt | @let_stmt | @legacy_let_stmt | @using_decl_stmt;
+
+@export_declaration = @export_all_declaration | @export_default_declaration | @export_named_declaration;
+
+@namespace_definition = @namespace_declaration | @enum_declaration;
+@type_definition = @class_definition | @interface_declaration | @enum_declaration | @type_alias_declaration | @enum_member;
+
+is_instantiated(unique int decl: @namespace_declaration ref);
+
+@declarable_node = @decl_stmt | @namespace_declaration | @class_decl_stmt | @function_decl_stmt | @enum_declaration | @external_module_declaration | @global_augmentation_declaration | @field;
+has_declare_keyword(unique int stmt: @declarable_node ref);
+
+is_for_await_of(unique int forof: @for_of_stmt ref);
+
+// expressions
+#keyset[parent, idx]
+exprs (unique int id: @expr,
+ int kind: int ref,
+ int parent: @expr_parent ref,
+ int idx: int ref,
+ varchar(900) tostring: string ref);
+
+literals (varchar(900) value: string ref,
+ varchar(900) raw: string ref,
+ unique int expr: @expr_or_type ref);
+
+enclosing_stmt (unique int expr: @expr_or_type ref,
+ int stmt: @stmt ref);
+
+expr_containers (unique int expr: @expr_or_type ref,
+ int container: @stmt_container ref);
+
+array_size (unique int ae: @arraylike ref,
+ int sz: int ref);
+
+is_delegating (int yield: @yield_expr ref);
+
+@expr_or_stmt = @expr | @stmt;
+@expr_or_type = @expr | @typeexpr;
+@expr_parent = @expr_or_stmt | @property | @function_typeexpr;
+@arraylike = @array_expr | @array_pattern;
+@type_annotation = @typeexpr | @jsdoc_type_expr;
+@node_in_stmt_container = @cfg_node | @type_annotation | @toplevel;
+
+case @expr.kind of
+ 0 = @label
+| 1 = @null_literal
+| 2 = @boolean_literal
+| 3 = @number_literal
+| 4 = @string_literal
+| 5 = @regexp_literal
+| 6 = @this_expr
+| 7 = @array_expr
+| 8 = @obj_expr
+| 9 = @function_expr
+| 10 = @seq_expr
+| 11 = @conditional_expr
+| 12 = @new_expr
+| 13 = @call_expr
+| 14 = @dot_expr
+| 15 = @index_expr
+| 16 = @neg_expr
+| 17 = @plus_expr
+| 18 = @log_not_expr
+| 19 = @bit_not_expr
+| 20 = @typeof_expr
+| 21 = @void_expr
+| 22 = @delete_expr
+| 23 = @eq_expr
+| 24 = @neq_expr
+| 25 = @eqq_expr
+| 26 = @neqq_expr
+| 27 = @lt_expr
+| 28 = @le_expr
+| 29 = @gt_expr
+| 30 = @ge_expr
+| 31 = @lshift_expr
+| 32 = @rshift_expr
+| 33 = @urshift_expr
+| 34 = @add_expr
+| 35 = @sub_expr
+| 36 = @mul_expr
+| 37 = @div_expr
+| 38 = @mod_expr
+| 39 = @bitor_expr
+| 40 = @xor_expr
+| 41 = @bitand_expr
+| 42 = @in_expr
+| 43 = @instanceof_expr
+| 44 = @logand_expr
+| 45 = @logor_expr
+| 47 = @assign_expr
+| 48 = @assign_add_expr
+| 49 = @assign_sub_expr
+| 50 = @assign_mul_expr
+| 51 = @assign_div_expr
+| 52 = @assign_mod_expr
+| 53 = @assign_lshift_expr
+| 54 = @assign_rshift_expr
+| 55 = @assign_urshift_expr
+| 56 = @assign_or_expr
+| 57 = @assign_xor_expr
+| 58 = @assign_and_expr
+| 59 = @preinc_expr
+| 60 = @postinc_expr
+| 61 = @predec_expr
+| 62 = @postdec_expr
+| 63 = @par_expr
+| 64 = @var_declarator
+| 65 = @arrow_function_expr
+| 66 = @spread_element
+| 67 = @array_pattern
+| 68 = @object_pattern
+| 69 = @yield_expr
+| 70 = @tagged_template_expr
+| 71 = @template_literal
+| 72 = @template_element
+| 73 = @array_comprehension_expr
+| 74 = @generator_expr
+| 75 = @for_in_comprehension_block
+| 76 = @for_of_comprehension_block
+| 77 = @legacy_letexpr
+| 78 = @var_decl
+| 79 = @proper_varaccess
+| 80 = @class_expr
+| 81 = @super_expr
+| 82 = @newtarget_expr
+| 83 = @named_import_specifier
+| 84 = @import_default_specifier
+| 85 = @import_namespace_specifier
+| 86 = @named_export_specifier
+| 87 = @exp_expr
+| 88 = @assign_exp_expr
+| 89 = @jsx_element
+| 90 = @jsx_qualified_name
+| 91 = @jsx_empty_expr
+| 92 = @await_expr
+| 93 = @function_sent_expr
+| 94 = @decorator
+| 95 = @export_default_specifier
+| 96 = @export_namespace_specifier
+| 97 = @bind_expr
+| 98 = @external_module_reference
+| 99 = @dynamic_import
+| 100 = @expression_with_type_arguments
+| 101 = @prefix_type_assertion
+| 102 = @as_type_assertion
+| 103 = @export_varaccess
+| 104 = @decorator_list
+| 105 = @non_null_assertion
+| 106 = @bigint_literal
+| 107 = @nullishcoalescing_expr
+| 108 = @e4x_xml_anyname
+| 109 = @e4x_xml_static_attribute_selector
+| 110 = @e4x_xml_dynamic_attribute_selector
+| 111 = @e4x_xml_filter_expression
+| 112 = @e4x_xml_static_qualident
+| 113 = @e4x_xml_dynamic_qualident
+| 114 = @e4x_xml_dotdotexpr
+| 115 = @import_meta_expr
+| 116 = @assignlogandexpr
+| 117 = @assignlogorexpr
+| 118 = @assignnullishcoalescingexpr
+| 119 = @template_pipe_ref
+| 120 = @generated_code_expr
+| 121 = @satisfies_expr
+;
+
+@varaccess = @proper_varaccess | @export_varaccess;
+@varref = @var_decl | @varaccess;
+
+@identifier = @label | @varref | @type_identifier;
+
+@literal = @null_literal | @boolean_literal | @number_literal | @string_literal | @regexp_literal | @bigint_literal;
+
+@propaccess = @dot_expr | @index_expr;
+
+@invokeexpr = @new_expr | @call_expr;
+
+@unaryexpr = @neg_expr | @plus_expr | @log_not_expr | @bit_not_expr | @typeof_expr | @void_expr | @delete_expr | @spread_element;
+
+@equality_test = @eq_expr | @neq_expr | @eqq_expr | @neqq_expr;
+
+@comparison = @equality_test | @lt_expr | @le_expr | @gt_expr | @ge_expr;
+
+@binaryexpr = @comparison | @lshift_expr | @rshift_expr | @urshift_expr | @add_expr | @sub_expr | @mul_expr | @div_expr | @mod_expr | @exp_expr | @bitor_expr | @xor_expr | @bitand_expr | @in_expr | @instanceof_expr | @logand_expr | @logor_expr | @nullishcoalescing_expr;
+
+@assignment = @assign_expr | @assign_add_expr | @assign_sub_expr | @assign_mul_expr | @assign_div_expr | @assign_mod_expr | @assign_exp_expr | @assign_lshift_expr | @assign_rshift_expr | @assign_urshift_expr | @assign_or_expr | @assign_xor_expr | @assign_and_expr | @assignlogandexpr | @assignlogorexpr | @assignnullishcoalescingexpr;
+
+@updateexpr = @preinc_expr | @postinc_expr | @predec_expr | @postdec_expr;
+
+@pattern = @varref | @array_pattern | @object_pattern;
+
+@comprehension_expr = @array_comprehension_expr | @generator_expr;
+
+@comprehension_block = @for_in_comprehension_block | @for_of_comprehension_block;
+
+@import_specifier = @named_import_specifier | @import_default_specifier | @import_namespace_specifier;
+
+@exportspecifier = @named_export_specifier | @export_default_specifier | @export_namespace_specifier;
+
+@type_keyword_operand = @import_declaration | @export_declaration | @import_specifier;
+
+@type_assertion = @as_type_assertion | @prefix_type_assertion;
+
+@class_definition = @class_decl_stmt | @class_expr;
+@interface_definition = @interface_declaration | @interface_typeexpr;
+@class_or_interface = @class_definition | @interface_definition;
+
+@lexical_decl = @var_decl | @type_decl;
+@lexical_access = @varaccess | @local_type_access | @local_var_type_access | @local_namespace_access;
+@lexical_ref = @lexical_decl | @lexical_access;
+
+@e4x_xml_attribute_selector = @e4x_xml_static_attribute_selector | @e4x_xml_dynamic_attribute_selector;
+@e4x_xml_qualident = @e4x_xml_static_qualident | @e4x_xml_dynamic_qualident;
+
+expr_contains_template_tag_location(
+ int expr: @expr ref,
+ int location: @location ref
+);
+
+@template_placeholder_tag_parent = @xmlelement | @xmlattribute | @file;
+
+template_placeholder_tag_info(
+ unique int node: @template_placeholder_tag,
+ int parentNode: @template_placeholder_tag_parent ref,
+ varchar(900) raw: string ref
+);
+
+// scopes
+scopes (unique int id: @scope,
+ int kind: int ref);
+
+case @scope.kind of
+ 0 = @global_scope
+| 1 = @function_scope
+| 2 = @catch_scope
+| 3 = @module_scope
+| 4 = @block_scope
+| 5 = @for_scope
+| 6 = @for_in_scope // for-of scopes work the same as for-in scopes
+| 7 = @comprehension_block_scope
+| 8 = @class_expr_scope
+| 9 = @namespace_scope
+| 10 = @class_decl_scope
+| 11 = @interface_scope
+| 12 = @type_alias_scope
+| 13 = @mapped_type_scope
+| 14 = @enum_scope
+| 15 = @external_module_scope
+| 16 = @conditional_type_scope;
+
+scopenodes (unique int node: @ast_node ref,
+ int scope: @scope ref);
+
+scopenesting (unique int inner: @scope ref,
+ int outer: @scope ref);
+
+// functions
+@function = @function_decl_stmt | @function_expr | @arrow_function_expr;
+
+@parameterized = @function | @catch_clause;
+@type_parameterized = @function | @class_or_interface | @type_alias_declaration | @mapped_typeexpr | @infer_typeexpr;
+
+is_generator (int fun: @function ref);
+has_rest_parameter (int fun: @function ref);
+is_async (int fun: @function ref);
+
+// variables and lexically scoped type names
+#keyset[scope, name]
+variables (unique int id: @variable,
+ varchar(900) name: string ref,
+ int scope: @scope ref);
+
+#keyset[scope, name]
+local_type_names (unique int id: @local_type_name,
+ varchar(900) name: string ref,
+ int scope: @scope ref);
+
+#keyset[scope, name]
+local_namespace_names (unique int id: @local_namespace_name,
+ varchar(900) name: string ref,
+ int scope: @scope ref);
+
+is_arguments_object (int id: @variable ref);
+
+@lexical_name = @variable | @local_type_name | @local_namespace_name;
+
+@bind_id = @varaccess | @local_var_type_access;
+bind (unique int id: @bind_id ref,
+ int decl: @variable ref);
+
+decl (unique int id: @var_decl ref,
+ int decl: @variable ref);
+
+@typebind_id = @local_type_access | @export_varaccess;
+typebind (unique int id: @typebind_id ref,
+ int decl: @local_type_name ref);
+
+@typedecl_id = @type_decl | @var_decl;
+typedecl (unique int id: @typedecl_id ref,
+ int decl: @local_type_name ref);
+
+namespacedecl (unique int id: @var_decl ref,
+ int decl: @local_namespace_name ref);
+
+@namespacebind_id = @local_namespace_access | @export_varaccess;
+namespacebind (unique int id: @namespacebind_id ref,
+ int decl: @local_namespace_name ref);
+
+
+// properties in object literals, property patterns in object patterns, and method declarations in classes
+#keyset[parent, index]
+properties (unique int id: @property,
+ int parent: @property_parent ref,
+ int index: int ref,
+ int kind: int ref,
+ varchar(900) tostring: string ref);
+
+case @property.kind of
+ 0 = @value_property
+| 1 = @property_getter
+| 2 = @property_setter
+| 3 = @jsx_attribute
+| 4 = @function_call_signature
+| 5 = @constructor_call_signature
+| 6 = @index_signature
+| 7 = @enum_member
+| 8 = @proper_field
+| 9 = @parameter_field
+| 10 = @static_initializer
+;
+
+@property_parent = @obj_expr | @object_pattern | @class_definition | @jsx_element | @interface_definition | @enum_declaration;
+@property_accessor = @property_getter | @property_setter;
+@call_signature = @function_call_signature | @constructor_call_signature;
+@field = @proper_field | @parameter_field;
+@field_or_vardeclarator = @field | @var_declarator;
+
+is_computed (int id: @property ref);
+is_method (int id: @property ref);
+is_static (int id: @property ref);
+is_abstract_member (int id: @property ref);
+is_const_enum (int id: @enum_declaration ref);
+is_abstract_class (int id: @class_decl_stmt ref);
+
+has_public_keyword (int id: @property ref);
+has_private_keyword (int id: @property ref);
+has_protected_keyword (int id: @property ref);
+has_readonly_keyword (int id: @property ref);
+has_type_keyword (int id: @type_keyword_operand ref);
+is_optional_member (int id: @property ref);
+has_definite_assignment_assertion (int id: @field_or_vardeclarator ref);
+is_optional_parameter_declaration (unique int parameter: @pattern ref);
+
+#keyset[constructor, param_index]
+parameter_fields(
+ unique int field: @parameter_field ref,
+ int constructor: @function_expr ref,
+ int param_index: int ref
+);
+
+// types
+#keyset[parent, idx]
+typeexprs (
+ unique int id: @typeexpr,
+ int kind: int ref,
+ int parent: @typeexpr_parent ref,
+ int idx: int ref,
+ varchar(900) tostring: string ref
+);
+
+case @typeexpr.kind of
+ 0 = @local_type_access
+| 1 = @type_decl
+| 2 = @keyword_typeexpr
+| 3 = @string_literal_typeexpr
+| 4 = @number_literal_typeexpr
+| 5 = @boolean_literal_typeexpr
+| 6 = @array_typeexpr
+| 7 = @union_typeexpr
+| 8 = @indexed_access_typeexpr
+| 9 = @intersection_typeexpr
+| 10 = @parenthesized_typeexpr
+| 11 = @tuple_typeexpr
+| 12 = @keyof_typeexpr
+| 13 = @qualified_type_access
+| 14 = @generic_typeexpr
+| 15 = @type_label
+| 16 = @typeof_typeexpr
+| 17 = @local_var_type_access
+| 18 = @qualified_var_type_access
+| 19 = @this_var_type_access
+| 20 = @predicate_typeexpr
+| 21 = @interface_typeexpr
+| 22 = @type_parameter
+| 23 = @plain_function_typeexpr
+| 24 = @constructor_typeexpr
+| 25 = @local_namespace_access
+| 26 = @qualified_namespace_access
+| 27 = @mapped_typeexpr
+| 28 = @conditional_typeexpr
+| 29 = @infer_typeexpr
+| 30 = @import_type_access
+| 31 = @import_namespace_access
+| 32 = @import_var_type_access
+| 33 = @optional_typeexpr
+| 34 = @rest_typeexpr
+| 35 = @bigint_literal_typeexpr
+| 36 = @readonly_typeexpr
+| 37 = @template_literal_typeexpr
+;
+
+@typeref = @typeaccess | @type_decl;
+@type_identifier = @type_decl | @local_type_access | @type_label | @local_var_type_access | @local_namespace_access;
+@typeexpr_parent = @expr | @stmt | @property | @typeexpr;
+@literal_typeexpr = @string_literal_typeexpr | @number_literal_typeexpr | @boolean_literal_typeexpr | @bigint_literal_typeexpr;
+@typeaccess = @local_type_access | @qualified_type_access | @import_type_access;
+@vartypeaccess = @local_var_type_access | @qualified_var_type_access | @this_var_type_access | @import_var_type_access;
+@namespace_access = @local_namespace_access | @qualified_namespace_access | @import_namespace_access;
+@import_typeexpr = @import_type_access | @import_namespace_access | @import_var_type_access;
+
+@function_typeexpr = @plain_function_typeexpr | @constructor_typeexpr;
+
+// types
+types (
+ unique int id: @type,
+ int kind: int ref,
+ varchar(900) tostring: string ref
+);
+
+#keyset[parent, idx]
+type_child (
+ int child: @type ref,
+ int parent: @type ref,
+ int idx: int ref
+);
+
+case @type.kind of
+ 0 = @any_type
+| 1 = @string_type
+| 2 = @number_type
+| 3 = @union_type
+| 4 = @true_type
+| 5 = @false_type
+| 6 = @type_reference
+| 7 = @object_type
+| 8 = @canonical_type_variable_type
+| 9 = @typeof_type
+| 10 = @void_type
+| 11 = @undefined_type
+| 12 = @null_type
+| 13 = @never_type
+| 14 = @plain_symbol_type
+| 15 = @unique_symbol_type
+| 16 = @objectkeyword_type
+| 17 = @intersection_type
+| 18 = @tuple_type
+| 19 = @lexical_type_variable_type
+| 20 = @this_type
+| 21 = @number_literal_type
+| 22 = @string_literal_type
+| 23 = @unknown_type
+| 24 = @bigint_type
+| 25 = @bigint_literal_type
+;
+
+@boolean_literal_type = @true_type | @false_type;
+@symbol_type = @plain_symbol_type | @unique_symbol_type;
+@union_or_intersection_type = @union_type | @intersection_type;
+@typevariable_type = @canonical_type_variable_type | @lexical_type_variable_type;
+
+has_asserts_keyword(int node: @predicate_typeexpr ref);
+
+@typed_ast_node = @expr | @typeexpr | @function;
+ast_node_type(
+ unique int node: @typed_ast_node ref,
+ int typ: @type ref);
+
+declared_function_signature(
+ unique int node: @function ref,
+ int sig: @signature_type ref
+);
+
+invoke_expr_signature(
+ unique int node: @invokeexpr ref,
+ int sig: @signature_type ref
+);
+
+invoke_expr_overload_index(
+ unique int node: @invokeexpr ref,
+ int index: int ref
+);
+
+symbols (
+ unique int id: @symbol,
+ int kind: int ref,
+ varchar(900) name: string ref
+);
+
+symbol_parent (
+ unique int symbol: @symbol ref,
+ int parent: @symbol ref
+);
+
+symbol_module (
+ int symbol: @symbol ref,
+ varchar(900) moduleName: string ref
+);
+
+symbol_global (
+ int symbol: @symbol ref,
+ varchar(900) globalName: string ref
+);
+
+case @symbol.kind of
+ 0 = @root_symbol
+| 1 = @member_symbol
+| 2 = @other_symbol
+;
+
+@type_with_symbol = @type_reference | @typevariable_type | @typeof_type | @unique_symbol_type;
+@ast_node_with_symbol = @type_definition | @namespace_definition | @toplevel | @typeaccess | @namespace_access | @var_decl | @function | @invokeexpr | @import_declaration | @external_module_reference | @external_module_declaration;
+
+ast_node_symbol(
+ unique int node: @ast_node_with_symbol ref,
+ int symbol: @symbol ref);
+
+type_symbol(
+ unique int typ: @type_with_symbol ref,
+ int symbol: @symbol ref);
+
+#keyset[typ, name]
+type_property(
+ int typ: @type ref,
+ varchar(900) name: string ref,
+ int propertyType: @type ref);
+
+type_alias(
+ unique int aliasType: @type ref,
+ int underlyingType: @type ref);
+
+@literal_type = @string_literal_type | @number_literal_type | @boolean_literal_type | @bigint_literal_type;
+@type_with_literal_value = @string_literal_type | @number_literal_type | @bigint_literal_type;
+type_literal_value(
+ unique int typ: @type_with_literal_value ref,
+ varchar(900) value: string ref);
+
+signature_types (
+ unique int id: @signature_type,
+ int kind: int ref,
+ varchar(900) tostring: string ref,
+ int type_parameters: int ref,
+ int required_params: int ref
+);
+
+is_abstract_signature(
+ unique int sig: @signature_type ref
+);
+
+signature_rest_parameter(
+ unique int sig: @signature_type ref,
+ int rest_param_arra_type: @type ref
+);
+
+case @signature_type.kind of
+ 0 = @function_signature_type
+| 1 = @constructor_signature_type
+;
+
+#keyset[typ, kind, index]
+type_contains_signature (
+ int typ: @type ref,
+ int kind: int ref, // constructor/call/index
+ int index: int ref, // ordering of overloaded signatures
+ int sig: @signature_type ref
+);
+
+#keyset[parent, index]
+signature_contains_type (
+ int child: @type ref,
+ int parent: @signature_type ref,
+ int index: int ref
+);
+
+#keyset[sig, index]
+signature_parameter_name (
+ int sig: @signature_type ref,
+ int index: int ref,
+ varchar(900) name: string ref
+);
+
+number_index_type (
+ unique int baseType: @type ref,
+ int propertyType: @type ref
+);
+
+string_index_type (
+ unique int baseType: @type ref,
+ int propertyType: @type ref
+);
+
+base_type_names(
+ int typeName: @symbol ref,
+ int baseTypeName: @symbol ref
+);
+
+self_types(
+ int typeName: @symbol ref,
+ int selfType: @type_reference ref
+);
+
+tuple_type_min_length(
+ unique int typ: @type ref,
+ int minLength: int ref
+);
+
+tuple_type_rest_index(
+ unique int typ: @type ref,
+ int index: int ref
+);
+
+// comments
+comments (unique int id: @comment,
+ int kind: int ref,
+ int toplevel: @toplevel ref,
+ varchar(900) text: string ref,
+ varchar(900) tostring: string ref);
+
+case @comment.kind of
+ 0 = @slashslash_comment
+| 1 = @slashstar_comment
+| 2 = @doc_comment
+| 3 = @html_comment_start
+| 4 = @htmlcommentend;
+
+@html_comment = @html_comment_start | @htmlcommentend;
+@line_comment = @slashslash_comment | @html_comment;
+@block_comment = @slashstar_comment | @doc_comment;
+
+// source lines
+lines (unique int id: @line,
+ int toplevel: @toplevel ref,
+ varchar(900) text: string ref,
+ varchar(2) terminator: string ref);
+indentation (int file: @file ref,
+ int lineno: int ref,
+ varchar(1) indentChar: string ref,
+ int indentDepth: int ref);
+
+// JavaScript parse errors
+js_parse_errors (unique int id: @js_parse_error,
+ int toplevel: @toplevel ref,
+ varchar(900) message: string ref,
+ varchar(900) line: string ref);
+
+// regular expressions
+#keyset[parent, idx]
+regexpterm (unique int id: @regexpterm,
+ int kind: int ref,
+ int parent: @regexpparent ref,
+ int idx: int ref,
+ varchar(900) tostring: string ref);
+
+@regexpparent = @regexpterm | @regexp_literal | @string_literal | @add_expr;
+
+case @regexpterm.kind of
+ 0 = @regexp_alt
+| 1 = @regexp_seq
+| 2 = @regexp_caret
+| 3 = @regexp_dollar
+| 4 = @regexp_wordboundary
+| 5 = @regexp_nonwordboundary
+| 6 = @regexp_positive_lookahead
+| 7 = @regexp_negative_lookahead
+| 8 = @regexp_star
+| 9 = @regexp_plus
+| 10 = @regexp_opt
+| 11 = @regexp_range
+| 12 = @regexp_dot
+| 13 = @regexp_group
+| 14 = @regexp_normal_constant
+| 15 = @regexp_hex_escape
+| 16 = @regexp_unicode_escape
+| 17 = @regexp_dec_escape
+| 18 = @regexp_oct_escape
+| 19 = @regexp_ctrl_escape
+| 20 = @regexp_char_class_escape
+| 21 = @regexp_id_escape
+| 22 = @regexp_backref
+| 23 = @regexp_char_class
+| 24 = @regexp_char_range
+| 25 = @regexp_positive_lookbehind
+| 26 = @regexp_negative_lookbehind
+| 27 = @regexp_unicode_property_escape
+| 28 = @regexp_quoted_string
+| 29 = @regexp_intersection
+| 30 = @regexp_subtraction;
+
+regexp_parse_errors (unique int id: @regexp_parse_error,
+ int regexp: @regexpterm ref,
+ varchar(900) message: string ref);
+
+@regexp_quantifier = @regexp_star | @regexp_plus | @regexp_opt | @regexp_range;
+@regexp_escape = @regexp_char_escape | @regexp_char_class_escape | @regexp_unicode_property_escape;
+@regexp_char_escape = @regexp_hex_escape | @regexp_unicode_escape | @regexp_dec_escape | @regexp_oct_escape | @regexp_ctrl_escape | @regexp_id_escape;
+@regexp_constant = @regexp_normal_constant | @regexp_char_escape;
+@regexp_lookahead = @regexp_positive_lookahead | @regexp_negative_lookahead;
+@regexp_lookbehind = @regexp_positive_lookbehind | @regexp_negative_lookbehind;
+@regexp_subpattern = @regexp_lookahead | @regexp_lookbehind;
+@regexp_anchor = @regexp_dollar | @regexp_caret;
+
+is_greedy (int id: @regexp_quantifier ref);
+range_quantifier_lower_bound (unique int id: @regexp_range ref, int lo: int ref);
+range_quantifier_upper_bound (unique int id: @regexp_range ref, int hi: int ref);
+is_capture (unique int id: @regexp_group ref, int number: int ref);
+is_named_capture (unique int id: @regexp_group ref, string name: string ref);
+is_inverted (int id: @regexp_char_class ref);
+regexp_const_value (unique int id: @regexp_constant ref, varchar(1) value: string ref);
+char_class_escape (unique int id: @regexp_char_class_escape ref, varchar(1) value: string ref);
+backref (unique int id: @regexp_backref ref, int value: int ref);
+named_backref (unique int id: @regexp_backref ref, string name: string ref);
+unicode_property_escapename (unique int id: @regexp_unicode_property_escape ref, string name: string ref);
+unicode_property_escapevalue (unique int id: @regexp_unicode_property_escape ref, string value: string ref);
+
+// tokens
+#keyset[toplevel, idx]
+tokeninfo (unique int id: @token,
+ int kind: int ref,
+ int toplevel: @toplevel ref,
+ int idx: int ref,
+ varchar(900) value: string ref);
+
+case @token.kind of
+ 0 = @token_eof
+| 1 = @token_null_literal
+| 2 = @token_boolean_literal
+| 3 = @token_numeric_literal
+| 4 = @token_string_literal
+| 5 = @token_regular_expression
+| 6 = @token_identifier
+| 7 = @token_keyword
+| 8 = @token_punctuator;
+
+// associate comments with the token immediately following them (which may be EOF)
+next_token (int comment: @comment ref, int token: @token ref);
+
+// JSON
+#keyset[parent, idx]
+json (unique int id: @json_value,
+ int kind: int ref,
+ int parent: @json_parent ref,
+ int idx: int ref,
+ varchar(900) tostring: string ref);
+
+json_literals (varchar(900) value: string ref,
+ varchar(900) raw: string ref,
+ unique int expr: @json_value ref);
+
+json_properties (int obj: @json_object ref,
+ varchar(900) property: string ref,
+ int value: @json_value ref);
+
+json_errors (unique int id: @json_parse_error,
+ varchar(900) message: string ref);
+
+json_locations(unique int locatable: @json_locatable ref,
+ int location: @location_default ref);
+
+case @json_value.kind of
+ 0 = @json_null
+| 1 = @json_boolean
+| 2 = @json_number
+| 3 = @json_string
+| 4 = @json_array
+| 5 = @json_object;
+
+@json_parent = @json_object | @json_array | @file;
+
+@json_locatable = @json_value | @json_parse_error;
+
+// locations
+@ast_node = @toplevel | @stmt | @expr | @property | @typeexpr;
+
+@locatable = @file
+ | @ast_node
+ | @comment
+ | @line
+ | @js_parse_error | @regexp_parse_error
+ | @regexpterm
+ | @json_locatable
+ | @token
+ | @cfg_node
+ | @jsdoc | @jsdoc_type_expr | @jsdoc_tag
+ | @yaml_locatable
+ | @xmllocatable
+ | @configLocatable
+ | @template_placeholder_tag;
+
+hasLocation (unique int locatable: @locatable ref,
+ int location: @location ref);
+
+// CFG
+entry_cfg_node (unique int id: @entry_node, int container: @stmt_container ref);
+exit_cfg_node (unique int id: @exit_node, int container: @stmt_container ref);
+guard_node (unique int id: @guard_node, int kind: int ref, int test: @expr ref);
+case @guard_node.kind of
+ 0 = @falsy_guard
+| 1 = @truthy_guard;
+@condition_guard = @falsy_guard | @truthy_guard;
+
+@synthetic_cfg_node = @entry_node | @exit_node | @guard_node;
+@cfg_node = @synthetic_cfg_node | @expr_parent;
+
+successor (int pred: @cfg_node ref, int succ: @cfg_node ref);
+
+// JSDoc comments
+jsdoc (unique int id: @jsdoc, varchar(900) description: string ref, int comment: @comment ref);
+#keyset[parent, idx]
+jsdoc_tags (unique int id: @jsdoc_tag, varchar(900) title: string ref,
+ int parent: @jsdoc ref, int idx: int ref, varchar(900) tostring: string ref);
+jsdoc_tag_descriptions (unique int tag: @jsdoc_tag ref, varchar(900) text: string ref);
+jsdoc_tag_names (unique int tag: @jsdoc_tag ref, varchar(900) text: string ref);
+
+#keyset[parent, idx]
+jsdoc_type_exprs (unique int id: @jsdoc_type_expr,
+ int kind: int ref,
+ int parent: @jsdoc_type_expr_parent ref,
+ int idx: int ref,
+ varchar(900) tostring: string ref);
+case @jsdoc_type_expr.kind of
+ 0 = @jsdoc_any_type_expr
+| 1 = @jsdoc_null_type_expr
+| 2 = @jsdoc_undefined_type_expr
+| 3 = @jsdoc_unknown_type_expr
+| 4 = @jsdoc_void_type_expr
+| 5 = @jsdoc_named_type_expr
+| 6 = @jsdoc_applied_type_expr
+| 7 = @jsdoc_nullable_type_expr
+| 8 = @jsdoc_non_nullable_type_expr
+| 9 = @jsdoc_record_type_expr
+| 10 = @jsdoc_array_type_expr
+| 11 = @jsdoc_union_type_expr
+| 12 = @jsdoc_function_type_expr
+| 13 = @jsdoc_optional_type_expr
+| 14 = @jsdoc_rest_type_expr
+;
+
+#keyset[id, idx]
+jsdoc_record_field_name (int id: @jsdoc_record_type_expr ref, int idx: int ref, varchar(900) name: string ref);
+jsdoc_prefix_qualifier (int id: @jsdoc_type_expr ref);
+jsdoc_has_new_parameter (int fn: @jsdoc_function_type_expr ref);
+
+@jsdoc_type_expr_parent = @jsdoc_type_expr | @jsdoc_tag;
+
+jsdoc_errors (unique int id: @jsdoc_error, int tag: @jsdoc_tag ref, varchar(900) message: string ref, varchar(900) tostring: string ref);
+
+@dataflownode = @expr | @function_decl_stmt | @class_decl_stmt | @namespace_declaration | @enum_declaration | @property;
+
+@optionalchainable = @call_expr | @propaccess;
+
+isOptionalChaining(int id: @optionalchainable ref);
+
+/**
+ * The time taken for the extraction of a file.
+ * This table contains non-deterministic content.
+ *
+ * The sum of the `time` column for each (`file`, `timerKind`) pair
+ * is the total time taken for extraction of `file`. The `extractionPhase`
+ * column provides a granular view of the extraction time of the file.
+ */
+extraction_time(
+ int file : @file ref,
+ // see `com.semmle.js.extractor.ExtractionMetrics.ExtractionPhase`.
+ int extractionPhase: int ref,
+ // 0 for the elapsed CPU time in nanoseconds, 1 for the elapsed wallclock time in nanoseconds
+ int timerKind: int ref,
+ float time: float ref
+)
+
+/**
+* Non-timing related data for the extraction of a single file.
+* This table contains non-deterministic content.
+*/
+extraction_data(
+ int file : @file ref,
+ // the absolute path to the cache file
+ varchar(900) cacheFile: string ref,
+ boolean fromCache: boolean ref,
+ int length: int ref
+)
+
+/*- YAML -*/
+
+#keyset[parent, idx]
+yaml (unique int id: @yaml_node,
+ int kind: int ref,
+ int parent: @yaml_node_parent ref,
+ int idx: int ref,
+ string tag: string ref,
+ string tostring: string ref);
+
+case @yaml_node.kind of
+ 0 = @yaml_scalar_node
+| 1 = @yaml_mapping_node
+| 2 = @yaml_sequence_node
+| 3 = @yaml_alias_node
+;
+
+@yaml_collection_node = @yaml_mapping_node | @yaml_sequence_node;
+
+@yaml_node_parent = @yaml_collection_node | @file;
+
+yaml_anchors (unique int node: @yaml_node ref,
+ string anchor: string ref);
+
+yaml_aliases (unique int alias: @yaml_alias_node ref,
+ string target: string ref);
+
+yaml_scalars (unique int scalar: @yaml_scalar_node ref,
+ int style: int ref,
+ string value: string ref);
+
+yaml_errors (unique int id: @yaml_error,
+ string message: string ref);
+
+yaml_locations(unique int locatable: @yaml_locatable ref,
+ int location: @location_default ref);
+
+@yaml_locatable = @yaml_node | @yaml_error;
+
+/*- XML Files -*/
+
+xmlEncoding(
+ unique int id: @file ref,
+ string encoding: string ref
+);
+
+xmlDTDs(
+ unique int id: @xmldtd,
+ string root: string ref,
+ string publicId: string ref,
+ string systemId: string ref,
+ int fileid: @file ref
+);
+
+xmlElements(
+ unique int id: @xmlelement,
+ string name: string ref,
+ int parentid: @xmlparent ref,
+ int idx: int ref,
+ int fileid: @file ref
+);
+
+xmlAttrs(
+ unique int id: @xmlattribute,
+ int elementid: @xmlelement ref,
+ string name: string ref,
+ string value: string ref,
+ int idx: int ref,
+ int fileid: @file ref
+);
+
+xmlNs(
+ int id: @xmlnamespace,
+ string prefixName: string ref,
+ string URI: string ref,
+ int fileid: @file ref
+);
+
+xmlHasNs(
+ int elementId: @xmlnamespaceable ref,
+ int nsId: @xmlnamespace ref,
+ int fileid: @file ref
+);
+
+xmlComments(
+ unique int id: @xmlcomment,
+ string text: string ref,
+ int parentid: @xmlparent ref,
+ int fileid: @file ref
+);
+
+xmlChars(
+ unique int id: @xmlcharacters,
+ string text: string ref,
+ int parentid: @xmlparent ref,
+ int idx: int ref,
+ int isCDATA: int ref,
+ int fileid: @file ref
+);
+
+@xmlparent = @file | @xmlelement;
+@xmlnamespaceable = @xmlelement | @xmlattribute;
+
+xmllocations(
+ int xmlElement: @xmllocatable ref,
+ int location: @location_default ref
+);
+
+@xmllocatable = @xmlcharacters | @xmlelement | @xmlcomment | @xmlattribute | @xmldtd | @file | @xmlnamespace;
+
+/*- Configuration files with key value pairs -*/
+
+configs(
+ unique int id: @config
+);
+
+configNames(
+ unique int id: @configName,
+ int config: @config ref,
+ string name: string ref
+);
+
+configValues(
+ unique int id: @configValue,
+ int config: @config ref,
+ string value: string ref
+);
+
+configLocations(
+ int locatable: @configLocatable ref,
+ int location: @location_default ref
+);
+
+@configLocatable = @config | @configName | @configValue;
diff --git a/javascript/downgrades/ccefb5e2d49318eea4aeafd4c6ae2af9f94ac72a/upgrade.properties b/javascript/downgrades/ccefb5e2d49318eea4aeafd4c6ae2af9f94ac72a/upgrade.properties
new file mode 100644
index 00000000000..d67984c6ef9
--- /dev/null
+++ b/javascript/downgrades/ccefb5e2d49318eea4aeafd4c6ae2af9f94ac72a/upgrade.properties
@@ -0,0 +1,4 @@
+description: split up qualified names in jsdoc type exprs
+compatibility: backwards
+
+jsdoc_type_exprs.rel: run jsdoc_type_exprs.ql
diff --git a/javascript/extractor/src/com/semmle/js/ast/jsdoc/NameExpression.java b/javascript/extractor/src/com/semmle/js/ast/jsdoc/Identifier.java
similarity index 65%
rename from javascript/extractor/src/com/semmle/js/ast/jsdoc/NameExpression.java
rename to javascript/extractor/src/com/semmle/js/ast/jsdoc/Identifier.java
index 94db5d32445..09b393e2d4c 100644
--- a/javascript/extractor/src/com/semmle/js/ast/jsdoc/NameExpression.java
+++ b/javascript/extractor/src/com/semmle/js/ast/jsdoc/Identifier.java
@@ -2,12 +2,12 @@ package com.semmle.js.ast.jsdoc;
import com.semmle.js.ast.SourceLocation;
-/** A named JSDoc type. */
-public class NameExpression extends JSDocTypeExpression {
+/** An identifier in a JSDoc type. */
+public class Identifier extends JSDocTypeExpression {
private final String name;
- public NameExpression(SourceLocation loc, String name) {
- super(loc, "NameExpression");
+ public Identifier(SourceLocation loc, String name) {
+ super(loc, "Identifier");
this.name = name;
}
diff --git a/javascript/extractor/src/com/semmle/js/ast/jsdoc/QualifiedNameExpression.java b/javascript/extractor/src/com/semmle/js/ast/jsdoc/QualifiedNameExpression.java
new file mode 100644
index 00000000000..93bebc6a358
--- /dev/null
+++ b/javascript/extractor/src/com/semmle/js/ast/jsdoc/QualifiedNameExpression.java
@@ -0,0 +1,35 @@
+package com.semmle.js.ast.jsdoc;
+
+import com.semmle.js.ast.SourceLocation;
+
+/** A qualified name in a JSDoc type. */
+public class QualifiedNameExpression extends JSDocTypeExpression {
+ private final JSDocTypeExpression base;
+ private final Identifier name;
+
+ public QualifiedNameExpression(SourceLocation loc, JSDocTypeExpression base, Identifier name) {
+ super(loc, "QualifiedNameExpression");
+ this.base = base;
+ this.name = name;
+ }
+
+ @Override
+ public void accept(Visitor v) {
+ v.visit(this);
+ }
+
+ /** Returns the expression on the left side of the dot character. */
+ public JSDocTypeExpression getBase() {
+ return base;
+ }
+
+ /** Returns the identifier on the right-hand side of the dot character. */
+ public Identifier getNameNode() {
+ return name;
+ }
+
+ @Override
+ public String pp() {
+ return base.pp() + "." + name.pp();
+ }
+}
diff --git a/javascript/extractor/src/com/semmle/js/ast/jsdoc/Visitor.java b/javascript/extractor/src/com/semmle/js/ast/jsdoc/Visitor.java
index 48a2edda1e7..571a3ed9a62 100644
--- a/javascript/extractor/src/com/semmle/js/ast/jsdoc/Visitor.java
+++ b/javascript/extractor/src/com/semmle/js/ast/jsdoc/Visitor.java
@@ -10,7 +10,9 @@ public interface Visitor {
public void visit(JSDocTag nd);
- public void visit(NameExpression nd);
+ public void visit(Identifier nd);
+
+ public void visit(QualifiedNameExpression nd);
public void visit(NullableLiteral nd);
diff --git a/javascript/extractor/src/com/semmle/js/extractor/JSDocExtractor.java b/javascript/extractor/src/com/semmle/js/extractor/JSDocExtractor.java
index 86d1e1f6f79..2e951414733 100644
--- a/javascript/extractor/src/com/semmle/js/extractor/JSDocExtractor.java
+++ b/javascript/extractor/src/com/semmle/js/extractor/JSDocExtractor.java
@@ -9,13 +9,14 @@ import com.semmle.js.ast.jsdoc.JSDocComment;
import com.semmle.js.ast.jsdoc.JSDocElement;
import com.semmle.js.ast.jsdoc.JSDocTag;
import com.semmle.js.ast.jsdoc.JSDocTypeExpression;
-import com.semmle.js.ast.jsdoc.NameExpression;
+import com.semmle.js.ast.jsdoc.Identifier;
import com.semmle.js.ast.jsdoc.NonNullableType;
import com.semmle.js.ast.jsdoc.NullLiteral;
import com.semmle.js.ast.jsdoc.NullableLiteral;
import com.semmle.js.ast.jsdoc.NullableType;
import com.semmle.js.ast.jsdoc.OptionalType;
import com.semmle.js.ast.jsdoc.ParameterType;
+import com.semmle.js.ast.jsdoc.QualifiedNameExpression;
import com.semmle.js.ast.jsdoc.RecordType;
import com.semmle.js.ast.jsdoc.RestType;
import com.semmle.js.ast.jsdoc.TypeApplication;
@@ -42,7 +43,7 @@ public class JSDocExtractor {
jsdocTypeExprKinds.put("UndefinedLiteral", 2);
jsdocTypeExprKinds.put("NullableLiteral", 3);
jsdocTypeExprKinds.put("VoidLiteral", 4);
- jsdocTypeExprKinds.put("NameExpression", 5);
+ jsdocTypeExprKinds.put("Identifier", 5);
jsdocTypeExprKinds.put("TypeApplication", 6);
jsdocTypeExprKinds.put("NullableType", 7);
jsdocTypeExprKinds.put("NonNullableType", 8);
@@ -52,6 +53,7 @@ public class JSDocExtractor {
jsdocTypeExprKinds.put("FunctionType", 12);
jsdocTypeExprKinds.put("OptionalType", 13);
jsdocTypeExprKinds.put("RestType", 14);
+ jsdocTypeExprKinds.put("QualifiedNameExpression", 15);
}
private final TrapWriter trapwriter;
@@ -122,10 +124,17 @@ public class JSDocExtractor {
}
@Override
- public void visit(NameExpression nd) {
+ public void visit(Identifier nd) {
visit((JSDocTypeExpression) nd);
}
+ @Override
+ public void visit(QualifiedNameExpression nd) {
+ Label label = visit((JSDocTypeExpression) nd);
+ visit(nd.getBase(), label, 0);
+ visit(nd.getNameNode(), label, 1);
+ }
+
@Override
public void visit(NullableLiteral nd) {
visit((JSDocTypeExpression) nd);
diff --git a/javascript/extractor/src/com/semmle/js/extractor/Main.java b/javascript/extractor/src/com/semmle/js/extractor/Main.java
index 56e4e42dc54..0b92711b01d 100644
--- a/javascript/extractor/src/com/semmle/js/extractor/Main.java
+++ b/javascript/extractor/src/com/semmle/js/extractor/Main.java
@@ -42,7 +42,7 @@ public class Main {
* A version identifier that should be updated every time the extractor changes in such a way that
* it may produce different tuples for the same file under the same {@link ExtractorConfig}.
*/
- public static final String EXTRACTOR_VERSION = "2025-02-03";
+ public static final String EXTRACTOR_VERSION = "2025-03-20";
public static final Pattern NEWLINE = Pattern.compile("\n");
diff --git a/javascript/extractor/src/com/semmle/js/parser/JSDocParser.java b/javascript/extractor/src/com/semmle/js/parser/JSDocParser.java
index 84027ced06c..f1b13565191 100644
--- a/javascript/extractor/src/com/semmle/js/parser/JSDocParser.java
+++ b/javascript/extractor/src/com/semmle/js/parser/JSDocParser.java
@@ -10,13 +10,14 @@ import com.semmle.js.ast.jsdoc.FunctionType;
import com.semmle.js.ast.jsdoc.JSDocComment;
import com.semmle.js.ast.jsdoc.JSDocTag;
import com.semmle.js.ast.jsdoc.JSDocTypeExpression;
-import com.semmle.js.ast.jsdoc.NameExpression;
+import com.semmle.js.ast.jsdoc.Identifier;
import com.semmle.js.ast.jsdoc.NonNullableType;
import com.semmle.js.ast.jsdoc.NullLiteral;
import com.semmle.js.ast.jsdoc.NullableLiteral;
import com.semmle.js.ast.jsdoc.NullableType;
import com.semmle.js.ast.jsdoc.OptionalType;
import com.semmle.js.ast.jsdoc.ParameterType;
+import com.semmle.js.ast.jsdoc.QualifiedNameExpression;
import com.semmle.js.ast.jsdoc.RecordType;
import com.semmle.js.ast.jsdoc.RestType;
import com.semmle.js.ast.jsdoc.TypeApplication;
@@ -70,30 +71,6 @@ public class JSDocParser {
return new JSDocComment(comment, r.fst(), tags);
}
- /** Specification of Doctrine AST types for JSDoc type expressions. */
- private static final Map, List> spec =
- new LinkedHashMap, List>();
-
- static {
- spec.put(AllLiteral.class, Arrays.asList());
- spec.put(ArrayType.class, Arrays.asList("elements"));
- spec.put(FieldType.class, Arrays.asList("key", "value"));
- spec.put(FunctionType.class, Arrays.asList("this", "new", "params", "result"));
- spec.put(NameExpression.class, Arrays.asList("name"));
- spec.put(NonNullableType.class, Arrays.asList("expression", "prefix"));
- spec.put(NullableLiteral.class, Arrays.asList());
- spec.put(NullLiteral.class, Arrays.asList());
- spec.put(NullableType.class, Arrays.asList("expression", "prefix"));
- spec.put(OptionalType.class, Arrays.asList("expression"));
- spec.put(ParameterType.class, Arrays.asList("name", "expression"));
- spec.put(RecordType.class, Arrays.asList("fields"));
- spec.put(RestType.class, Arrays.asList("expression"));
- spec.put(TypeApplication.class, Arrays.asList("expression", "applications"));
- spec.put(UndefinedLiteral.class, Arrays.asList());
- spec.put(UnionType.class, Arrays.asList("elements"));
- spec.put(VoidLiteral.class, Arrays.asList());
- }
-
private static String sliceSource(String source, int index, int last) {
if (index >= source.length()) return "";
if (last > source.length()) last = source.length();
@@ -137,7 +114,7 @@ public class JSDocParser {
}
private static boolean isTypeName(char ch) {
- return "><(){}[],:*|?!=".indexOf(ch) == -1 && !isWhiteSpace(ch) && !isLineTerminator(ch);
+ return "><(){}[],:*|?!=.".indexOf(ch) == -1 && !isWhiteSpace(ch) && !isLineTerminator(ch);
}
private static boolean isParamTitle(String title) {
@@ -559,20 +536,9 @@ public class JSDocParser {
}
private Token scanTypeName() {
- char ch, ch2;
-
StringBuilder sb = new StringBuilder();
sb.append((char)advance());
while (index < endIndex && isTypeName(source.charAt(index))) {
- ch = source.charAt(index);
- if (ch == '.') {
- if ((index + 1) < endIndex) {
- ch2 = source.charAt(index + 1);
- if (ch2 == '<') {
- break;
- }
- }
- }
sb.append((char)advance());
}
value = sb.toString();
@@ -850,11 +816,24 @@ public class JSDocParser {
return finishNode(new RecordType(loc, fields));
}
- private JSDocTypeExpression parseNameExpression() throws ParseError {
- Object name = value;
+ private Identifier parseIdentifier() throws ParseError {
SourceLocation loc = loc();
+ Object value = this.value; // save the value of the current token
expect(Token.NAME);
- return finishNode(new NameExpression(loc, name.toString()));
+ return finishNode(new Identifier(loc, value.toString()));
+ }
+
+ private JSDocTypeExpression parseNameExpression() throws ParseError {
+ JSDocTypeExpression node = parseIdentifier();
+ while (token == Token.DOT) {
+ consume(Token.DOT);
+ Identifier memberName = parseIdentifier();
+ // Create a SourceLocation object with the correct start location.
+ // The call to finishNode() will set the end location.
+ SourceLocation loc = new SourceLocation(node.getLoc());
+ node = finishNode(new QualifiedNameExpression(loc, node, memberName));
+ }
+ return node;
}
// TypeExpressionList :=
@@ -947,14 +926,14 @@ public class JSDocParser {
SourceLocation loc = loc();
expr = parseTypeExpression();
- if (expr instanceof NameExpression && token == Token.COLON) {
+ if (expr instanceof Identifier && token == Token.COLON) {
// Identifier ':' TypeExpression
consume(Token.COLON);
expr =
finishNode(
new ParameterType(
new SourceLocation(loc),
- ((NameExpression) expr).getName(),
+ ((Identifier) expr).getName(),
parseTypeExpression()));
}
if (token == Token.EQUAL) {
@@ -1130,7 +1109,7 @@ public class JSDocParser {
consume(Token.RBRACK, "expected an array-style type declaration (' + value + '[])");
List expressions = new ArrayList<>();
expressions.add(expr);
- NameExpression nameExpr = finishNode(new NameExpression(new SourceLocation(loc), "Array"));
+ Identifier nameExpr = finishNode(new Identifier(new SourceLocation(loc), "Array"));
return finishNode(new TypeApplication(loc, nameExpr, expressions));
}
@@ -1551,9 +1530,9 @@ public class JSDocParser {
// fixed at the end
if (isParamTitle(this._title)
&& this._tag.type != null
- && this._tag.type instanceof NameExpression) {
- this._extra_name = ((NameExpression) this._tag.type).getName();
- this._tag.name = ((NameExpression) this._tag.type).getName();
+ && this._tag.type instanceof Identifier) {
+ this._extra_name = ((Identifier) this._tag.type).getName();
+ this._tag.name = ((Identifier) this._tag.type).getName();
this._tag.type = null;
} else {
if (!this.addError("Missing or invalid tag name")) {
@@ -1669,7 +1648,7 @@ public class JSDocParser {
Position start = new Position(_tag.startLine, _tag.startColumn, _tag.startColumn);
Position end = new Position(_tag.startLine, _tag.startColumn, _tag.startColumn);
SourceLocation loc = new SourceLocation(_extra_name, start, end);
- this._tag.type = new NameExpression(loc, _extra_name);
+ this._tag.type = new Identifier(loc, _extra_name);
}
this._tag.name = null;
diff --git a/javascript/extractor/tests/comments/output/trap/jsdoc.js.trap b/javascript/extractor/tests/comments/output/trap/jsdoc.js.trap
index 736a6b2d19f..910c567993f 100644
--- a/javascript/extractor/tests/comments/output/trap/jsdoc.js.trap
+++ b/javascript/extractor/tests/comments/output/trap/jsdoc.js.trap
@@ -517,150 +517,170 @@ jsdoc_type_exprs(#20157,4,#20145,-1,"void")
locations_default(#20158,#10000,11,60,11,63)
hasLocation(#20157,#20158)
#20159=*
-jsdoc_type_exprs(#20159,5,#20145,-2,"goog.ui.Menu")
+jsdoc_type_exprs(#20159,15,#20145,-2,"goog.ui.Menu")
#20160=@"loc,{#10000},11,26,11,37"
locations_default(#20160,#10000,11,26,11,37)
hasLocation(#20159,#20160)
-jsdoc_has_new_parameter(#20145)
#20161=*
-jsdoc_tags(#20161,"param",#20117,4,"@param")
-#20162=@"loc,{#10000},12,5,12,10"
-locations_default(#20162,#10000,12,5,12,10)
+jsdoc_type_exprs(#20161,15,#20159,0,"goog.ui")
+#20162=@"loc,{#10000},11,26,11,32"
+locations_default(#20162,#10000,11,26,11,32)
hasLocation(#20161,#20162)
-jsdoc_tag_names(#20161,"var_args")
#20163=*
-jsdoc_type_exprs(#20163,14,#20161,0,"...number")
-#20164=@"loc,{#10000},12,13,12,21"
-locations_default(#20164,#10000,12,13,12,21)
+jsdoc_type_exprs(#20163,5,#20161,0,"goog")
+#20164=@"loc,{#10000},11,26,11,29"
+locations_default(#20164,#10000,11,26,11,29)
hasLocation(#20163,#20164)
#20165=*
-jsdoc_type_exprs(#20165,5,#20163,0,"number")
-#20166=@"loc,{#10000},12,16,12,21"
-locations_default(#20166,#10000,12,16,12,21)
+jsdoc_type_exprs(#20165,5,#20161,1,"ui")
+#20166=@"loc,{#10000},11,31,11,32"
+locations_default(#20166,#10000,11,31,11,32)
hasLocation(#20165,#20166)
#20167=*
-jsdoc(#20167,"",#20010)
-hasLocation(#20167,#20011)
-#20168=*
-jsdoc_tags(#20168,"param",#20167,0,"@param")
-#20169=@"loc,{#10000},15,4,15,9"
-locations_default(#20169,#10000,15,4,15,9)
-hasLocation(#20168,#20169)
-#20170=*
-jsdoc_errors(#20170,#20168,"Missing or invalid tag name","Missing ... ag name")
+jsdoc_type_exprs(#20167,5,#20159,1,"Menu")
+#20168=@"loc,{#10000},11,34,11,37"
+locations_default(#20168,#10000,11,34,11,37)
+hasLocation(#20167,#20168)
+jsdoc_has_new_parameter(#20145)
+#20169=*
+jsdoc_tags(#20169,"param",#20117,4,"@param")
+#20170=@"loc,{#10000},12,5,12,10"
+locations_default(#20170,#10000,12,5,12,10)
+hasLocation(#20169,#20170)
+jsdoc_tag_names(#20169,"var_args")
#20171=*
-jsdoc_tags(#20171,"param",#20167,1,"@param")
-#20172=@"loc,{#10000},16,4,16,9"
-locations_default(#20172,#10000,16,4,16,9)
+jsdoc_type_exprs(#20171,14,#20169,0,"...number")
+#20172=@"loc,{#10000},12,13,12,21"
+locations_default(#20172,#10000,12,13,12,21)
hasLocation(#20171,#20172)
-jsdoc_tag_names(#20171,"x")
#20173=*
-jsdoc(#20173,"",#20012)
-hasLocation(#20173,#20013)
-#20174=*
-jsdoc_tags(#20174,"",#20173,0,"@")
-#20175=@"loc,{#10000},20,4,20,4"
-locations_default(#20175,#10000,20,4,20,4)
-hasLocation(#20174,#20175)
-jsdoc_tag_descriptions(#20174,"{link a}")
+jsdoc_type_exprs(#20173,5,#20171,0,"number")
+#20174=@"loc,{#10000},12,16,12,21"
+locations_default(#20174,#10000,12,16,12,21)
+hasLocation(#20173,#20174)
+#20175=*
+jsdoc(#20175,"",#20010)
+hasLocation(#20175,#20011)
#20176=*
-jsdoc_errors(#20176,#20174,"Missing or invalid title","Missing ... d title")
-#20177=*
-jsdoc(#20177,"",#20014)
-hasLocation(#20177,#20015)
+jsdoc_tags(#20176,"param",#20175,0,"@param")
+#20177=@"loc,{#10000},15,4,15,9"
+locations_default(#20177,#10000,15,4,15,9)
+hasLocation(#20176,#20177)
#20178=*
-jsdoc_tags(#20178,"typedef",#20177,0,"@typedef")
-#20179=@"loc,{#10000},24,4,24,11"
-locations_default(#20179,#10000,24,4,24,11)
-hasLocation(#20178,#20179)
-jsdoc_tag_descriptions(#20178,"{a}")
-#20180=*
-jsdoc_errors(#20180,#20178,"Missing or invalid tag type","Missing ... ag type")
+jsdoc_errors(#20178,#20176,"Missing or invalid tag name","Missing ... ag name")
+#20179=*
+jsdoc_tags(#20179,"param",#20175,1,"@param")
+#20180=@"loc,{#10000},16,4,16,9"
+locations_default(#20180,#10000,16,4,16,9)
+hasLocation(#20179,#20180)
+jsdoc_tag_names(#20179,"x")
#20181=*
-jsdoc(#20181,"[resize description]",#20016)
-hasLocation(#20181,#20017)
+jsdoc(#20181,"",#20012)
+hasLocation(#20181,#20013)
#20182=*
-jsdoc_tags(#20182,"param",#20181,0,"@param")
-#20183=@"loc,{#10000},30,4,30,9"
-locations_default(#20183,#10000,30,4,30,9)
+jsdoc_tags(#20182,"",#20181,0,"@")
+#20183=@"loc,{#10000},20,4,20,4"
+locations_default(#20183,#10000,20,4,20,4)
hasLocation(#20182,#20183)
-jsdoc_tag_descriptions(#20182,"[description]
-")
-jsdoc_tag_names(#20182,"w")
+jsdoc_tag_descriptions(#20182,"{link a}")
#20184=*
-jsdoc_type_exprs(#20184,10,#20182,0,"[type]")
-#20185=@"loc,{#10000},30,13,30,18"
-locations_default(#20185,#10000,30,13,30,18)
-hasLocation(#20184,#20185)
+jsdoc_errors(#20184,#20182,"Missing or invalid title","Missing ... d title")
+#20185=*
+jsdoc(#20185,"",#20014)
+hasLocation(#20185,#20015)
#20186=*
-jsdoc_type_exprs(#20186,5,#20184,0,"type")
-#20187=@"loc,{#10000},30,14,30,17"
-locations_default(#20187,#10000,30,14,30,17)
+jsdoc_tags(#20186,"typedef",#20185,0,"@typedef")
+#20187=@"loc,{#10000},24,4,24,11"
+locations_default(#20187,#10000,24,4,24,11)
hasLocation(#20186,#20187)
+jsdoc_tag_descriptions(#20186,"{a}")
#20188=*
-jsdoc_tags(#20188,"param",#20181,1,"@param")
-#20189=@"loc,{#10000},31,4,31,9"
-locations_default(#20189,#10000,31,4,31,9)
-hasLocation(#20188,#20189)
-jsdoc_tag_descriptions(#20188,"[description]
-")
+jsdoc_errors(#20188,#20186,"Missing or invalid tag type","Missing ... ag type")
+#20189=*
+jsdoc(#20189,"[resize description]",#20016)
+hasLocation(#20189,#20017)
#20190=*
-jsdoc_tags(#20190,"return",#20181,2,"@return")
-#20191=@"loc,{#10000},32,4,32,10"
-locations_default(#20191,#10000,32,4,32,10)
+jsdoc_tags(#20190,"param",#20189,0,"@param")
+#20191=@"loc,{#10000},30,4,30,9"
+locations_default(#20191,#10000,30,4,30,9)
hasLocation(#20190,#20191)
-jsdoc_tag_descriptions(#20190,"[description]")
+jsdoc_tag_descriptions(#20190,"[description]
+")
+jsdoc_tag_names(#20190,"w")
#20192=*
jsdoc_type_exprs(#20192,10,#20190,0,"[type]")
-#20193=@"loc,{#10000},32,13,32,18"
-locations_default(#20193,#10000,32,13,32,18)
+#20193=@"loc,{#10000},30,13,30,18"
+locations_default(#20193,#10000,30,13,30,18)
hasLocation(#20192,#20193)
#20194=*
jsdoc_type_exprs(#20194,5,#20192,0,"type")
-#20195=@"loc,{#10000},32,14,32,17"
-locations_default(#20195,#10000,32,14,32,17)
+#20195=@"loc,{#10000},30,14,30,17"
+locations_default(#20195,#10000,30,14,30,17)
hasLocation(#20194,#20195)
#20196=*
-jsdoc(#20196,"",#20018)
-hasLocation(#20196,#20019)
-#20197=*
-jsdoc_tags(#20197,"exports",#20196,0,"@exports")
-#20198=@"loc,{#10000},36,3,36,10"
-locations_default(#20198,#10000,36,3,36,10)
-hasLocation(#20197,#20198)
-jsdoc_tag_descriptions(#20197,"R
+jsdoc_tags(#20196,"param",#20189,1,"@param")
+#20197=@"loc,{#10000},31,4,31,9"
+locations_default(#20197,#10000,31,4,31,9)
+hasLocation(#20196,#20197)
+jsdoc_tag_descriptions(#20196,"[description]
")
-#20199=*
-jsdoc(#20199,"",#20020)
-hasLocation(#20199,#20021)
+#20198=*
+jsdoc_tags(#20198,"return",#20189,2,"@return")
+#20199=@"loc,{#10000},32,4,32,10"
+locations_default(#20199,#10000,32,4,32,10)
+hasLocation(#20198,#20199)
+jsdoc_tag_descriptions(#20198,"[description]")
#20200=*
-jsdoc_tags(#20200,"typedef",#20199,0,"@typedef")
-#20201=@"loc,{#10000},41,4,41,11"
-locations_default(#20201,#10000,41,4,41,11)
+jsdoc_type_exprs(#20200,10,#20198,0,"[type]")
+#20201=@"loc,{#10000},32,13,32,18"
+locations_default(#20201,#10000,32,13,32,18)
hasLocation(#20200,#20201)
#20202=*
-jsdoc_type_exprs(#20202,9,#20200,0,"{0: number}")
-#20203=@"loc,{#10000},41,14,41,24"
-locations_default(#20203,#10000,41,14,41,24)
+jsdoc_type_exprs(#20202,5,#20200,0,"type")
+#20203=@"loc,{#10000},32,14,32,17"
+locations_default(#20203,#10000,32,14,32,17)
hasLocation(#20202,#20203)
-jsdoc_record_field_name(#20202,0,"0")
#20204=*
-jsdoc_type_exprs(#20204,5,#20202,0,"number")
-#20205=@"loc,{#10000},41,18,41,23"
-locations_default(#20205,#10000,41,18,41,23)
-hasLocation(#20204,#20205)
-toplevels(#20001,0)
-#20206=@"loc,{#10000},1,1,43,0"
-locations_default(#20206,#10000,1,1,43,0)
-hasLocation(#20001,#20206)
+jsdoc(#20204,"",#20018)
+hasLocation(#20204,#20019)
+#20205=*
+jsdoc_tags(#20205,"exports",#20204,0,"@exports")
+#20206=@"loc,{#10000},36,3,36,10"
+locations_default(#20206,#10000,36,3,36,10)
+hasLocation(#20205,#20206)
+jsdoc_tag_descriptions(#20205,"R
+")
#20207=*
-entry_cfg_node(#20207,#20001)
-#20208=@"loc,{#10000},1,1,1,0"
-locations_default(#20208,#10000,1,1,1,0)
-hasLocation(#20207,#20208)
-#20209=*
-exit_cfg_node(#20209,#20001)
-hasLocation(#20209,#20105)
-successor(#20207,#20209)
+jsdoc(#20207,"",#20020)
+hasLocation(#20207,#20021)
+#20208=*
+jsdoc_tags(#20208,"typedef",#20207,0,"@typedef")
+#20209=@"loc,{#10000},41,4,41,11"
+locations_default(#20209,#10000,41,4,41,11)
+hasLocation(#20208,#20209)
+#20210=*
+jsdoc_type_exprs(#20210,9,#20208,0,"{0: number}")
+#20211=@"loc,{#10000},41,14,41,24"
+locations_default(#20211,#10000,41,14,41,24)
+hasLocation(#20210,#20211)
+jsdoc_record_field_name(#20210,0,"0")
+#20212=*
+jsdoc_type_exprs(#20212,5,#20210,0,"number")
+#20213=@"loc,{#10000},41,18,41,23"
+locations_default(#20213,#10000,41,18,41,23)
+hasLocation(#20212,#20213)
+toplevels(#20001,0)
+#20214=@"loc,{#10000},1,1,43,0"
+locations_default(#20214,#10000,1,1,43,0)
+hasLocation(#20001,#20214)
+#20215=*
+entry_cfg_node(#20215,#20001)
+#20216=@"loc,{#10000},1,1,1,0"
+locations_default(#20216,#10000,1,1,1,0)
+hasLocation(#20215,#20216)
+#20217=*
+exit_cfg_node(#20217,#20001)
+hasLocation(#20217,#20105)
+successor(#20215,#20217)
numlines(#10000,42,0,37)
filetype(#10000,"javascript")
diff --git a/javascript/ql/lib/change-notes/2025-03-24-axios-additional-methods.md b/javascript/ql/lib/change-notes/2025-03-24-axios-additional-methods.md
new file mode 100644
index 00000000000..9f31730bc14
--- /dev/null
+++ b/javascript/ql/lib/change-notes/2025-03-24-axios-additional-methods.md
@@ -0,0 +1,4 @@
+---
+category: minorAnalysis
+---
+Enhanced `axios` support with new methods (`postForm`, `putForm`, `patchForm`, `getUri`, `create`) and added support for `interceptors.request` and `interceptors.response`.
diff --git a/javascript/ql/lib/change-notes/2025-03-26-Hapi.md b/javascript/ql/lib/change-notes/2025-03-26-Hapi.md
new file mode 100644
index 00000000000..d6d5795570f
--- /dev/null
+++ b/javascript/ql/lib/change-notes/2025-03-26-Hapi.md
@@ -0,0 +1,4 @@
+---
+category: minorAnalysis
+---
+* Added support for the newer version of `Hapi` with the `@hapi/hapi` import and `server` function.
diff --git a/javascript/ql/lib/change-notes/2025-03-26-async-fileRead.md b/javascript/ql/lib/change-notes/2025-03-26-async-fileRead.md
new file mode 100644
index 00000000000..f15d525530a
--- /dev/null
+++ b/javascript/ql/lib/change-notes/2025-03-26-async-fileRead.md
@@ -0,0 +1,4 @@
+---
+category: minorAnalysis
+---
+* Improved modeling of the `node:fs` module: `await`-ed calls to `read` and `readFile` are now supported.
diff --git a/javascript/ql/lib/ext/axios.model.yml b/javascript/ql/lib/ext/axios.model.yml
new file mode 100644
index 00000000000..69740c31e29
--- /dev/null
+++ b/javascript/ql/lib/ext/axios.model.yml
@@ -0,0 +1,12 @@
+extensions:
+ - addsTo:
+ pack: codeql/javascript-all
+ extensible: sinkModel
+ data:
+ - ["axios", "Member[interceptors].Member[request].Member[use].Argument[0].Parameter[0].Member[url]", "request-forgery"]
+
+ - addsTo:
+ pack: codeql/javascript-all
+ extensible: sourceModel
+ data:
+ - ["axios", "Member[interceptors].Member[response].Member[use].Argument[0].Parameter[0]", "response"]
diff --git a/javascript/ql/lib/semmle/javascript/DOM.qll b/javascript/ql/lib/semmle/javascript/DOM.qll
index 6c6d70fede8..50a529b4a53 100644
--- a/javascript/ql/lib/semmle/javascript/DOM.qll
+++ b/javascript/ql/lib/semmle/javascript/DOM.qll
@@ -296,7 +296,7 @@ module DOM {
.getType()
.getAnUnderlyingType()
.(JSDocNamedTypeExpr)
- .getName())
+ .getRawName())
)
}
diff --git a/javascript/ql/lib/semmle/javascript/Externs.qll b/javascript/ql/lib/semmle/javascript/Externs.qll
index 9787de6f464..a2a2533d849 100644
--- a/javascript/ql/lib/semmle/javascript/Externs.qll
+++ b/javascript/ql/lib/semmle/javascript/Externs.qll
@@ -400,8 +400,8 @@ class ConstructorTag extends JSDocTag {
abstract private class NamedTypeReferent extends JSDocTag {
/** Gets the name of the type to which this tag refers. */
string getTarget() {
- result = this.getType().(JSDocNamedTypeExpr).getName() or
- result = this.getType().(JSDocAppliedTypeExpr).getHead().(JSDocNamedTypeExpr).getName()
+ result = this.getType().(JSDocNamedTypeExpr).getRawName() or
+ result = this.getType().(JSDocAppliedTypeExpr).getHead().(JSDocNamedTypeExpr).getRawName()
}
/**
@@ -423,7 +423,7 @@ abstract private class NamedTypeReferent extends JSDocTag {
* Gets the source declaration of the type to which `tp` refers, if any.
*/
private ExternalType sourceDecl(JSDocTypeExpr tp) {
- result.getQualifiedName() = tp.(JSDocNamedTypeExpr).getName() or
+ result.getQualifiedName() = tp.(JSDocNamedTypeExpr).getRawName() or
result = sourceDecl(tp.(JSDocAppliedTypeExpr).getHead()) or
result = sourceDecl(tp.(JSDocNullableTypeExpr).getTypeExpr()) or
result = sourceDecl(tp.(JSDocNonNullableTypeExpr).getTypeExpr()) or
diff --git a/javascript/ql/lib/semmle/javascript/JSDoc.qll b/javascript/ql/lib/semmle/javascript/JSDoc.qll
index 6e1ea5caecb..10970a2e8b0 100644
--- a/javascript/ql/lib/semmle/javascript/JSDoc.qll
+++ b/javascript/ql/lib/semmle/javascript/JSDoc.qll
@@ -261,17 +261,14 @@ class JSDocVoidTypeExpr extends @jsdoc_void_type_expr, JSDocTypeExpr {
}
/**
- * A type expression referring to a named type.
+ * An identifier in a JSDoc type expression, such as `Object` or `string`.
*
- * Example:
- *
- * ```
- * string
- * Object
- * ```
+ * Note that qualified names consist of multiple identifier nodes.
*/
-class JSDocNamedTypeExpr extends @jsdoc_named_type_expr, JSDocTypeExpr {
- /** Gets the name of the type the expression refers to. */
+class JSDocIdentifierTypeExpr extends @jsdoc_identifier_type_expr, JSDocTypeExpr {
+ /**
+ * Gets the name of the identifier.
+ */
string getName() { result = this.toString() }
override predicate isString() { this.getName() = "string" }
@@ -300,6 +297,71 @@ class JSDocNamedTypeExpr extends @jsdoc_named_type_expr, JSDocTypeExpr {
}
override predicate isRawFunction() { this.getName() = "Function" }
+}
+
+/**
+ * An unqualified identifier in a JSDoc type expression.
+ *
+ * Example:
+ *
+ * ```
+ * string
+ * Object
+ * ```
+ */
+class JSDocLocalTypeAccess extends JSDocIdentifierTypeExpr {
+ JSDocLocalTypeAccess() { not this = any(JSDocQualifiedTypeAccess a).getNameNode() }
+}
+
+/**
+ * A qualified type name in a JSDoc type expression, such as `X.Y`.
+ */
+class JSDocQualifiedTypeAccess extends @jsdoc_qualified_type_expr, JSDocTypeExpr {
+ /**
+ * Gets the base of this access, such as the `X` in `X.Y`.
+ */
+ JSDocTypeExpr getBase() { result = this.getChild(0) }
+
+ /**
+ * Gets the node naming the member being accessed, such as the `Y` node in `X.Y`.
+ */
+ JSDocIdentifierTypeExpr getNameNode() { result = this.getChild(1) }
+
+ /**
+ * Gets the name being accessed, such as `Y` in `X.Y`.
+ */
+ string getName() { result = this.getNameNode().getName() }
+}
+
+/**
+ * A type expression referring to a named type.
+ *
+ * Example:
+ *
+ * ```
+ * string
+ * Object
+ * Namespace.Type
+ * ```
+ */
+class JSDocNamedTypeExpr extends JSDocTypeExpr {
+ JSDocNamedTypeExpr() {
+ this instanceof JSDocLocalTypeAccess
+ or
+ this instanceof JSDocQualifiedTypeAccess
+ }
+
+ /**
+ * Gets the name directly as it appears in this type, including any qualifiers.
+ *
+ * For example, for `X.Y` this gets the string `"X.Y"`.
+ */
+ string getRawName() { result = this.toString() }
+
+ /**
+ * DEPRECATED. Use `getRawName()` instead.
+ */
+ deprecated string getName() { result = this.toString() }
/**
* Holds if this name consists of the unqualified name `prefix`
@@ -310,8 +372,9 @@ class JSDocNamedTypeExpr extends @jsdoc_named_type_expr, JSDocTypeExpr {
* - `Baz` has prefix `Baz` and an empty suffix.
*/
predicate hasNameParts(string prefix, string suffix) {
+ not this = any(JSDocQualifiedTypeAccess a).getBase() and // restrict size of predicate
exists(string regex, string name | regex = "([^.]+)(.*)" |
- name = this.getName() and
+ name = this.getRawName() and
prefix = name.regexpCapture(regex, 1) and
suffix = name.regexpCapture(regex, 2)
)
@@ -340,7 +403,7 @@ class JSDocNamedTypeExpr extends @jsdoc_named_type_expr, JSDocTypeExpr {
globalName = this.resolvedName()
or
not exists(this.resolvedName()) and
- globalName = this.getName()
+ globalName = this.getRawName()
}
override DataFlow::ClassNode getClass() {
diff --git a/javascript/ql/lib/semmle/javascript/dataflow/internal/sharedlib/Ssa.qll b/javascript/ql/lib/semmle/javascript/dataflow/internal/sharedlib/Ssa.qll
index c23032b3483..cb5757ab30d 100644
--- a/javascript/ql/lib/semmle/javascript/dataflow/internal/sharedlib/Ssa.qll
+++ b/javascript/ql/lib/semmle/javascript/dataflow/internal/sharedlib/Ssa.qll
@@ -97,7 +97,7 @@ module SsaDataflowInput implements DataFlowIntegrationInputSig {
}
pragma[inline]
- predicate guardControlsBlock(Guard guard, js::BasicBlock bb, boolean branch) {
+ predicate guardDirectlyControlsBlock(Guard guard, js::BasicBlock bb, boolean branch) {
exists(js::ConditionGuardNode g |
g.getTest() = guard and
g.dominates(bb) and
diff --git a/javascript/ql/lib/semmle/javascript/frameworks/ClientRequests.qll b/javascript/ql/lib/semmle/javascript/frameworks/ClientRequests.qll
index c2b01cf7317..673bdf2de33 100644
--- a/javascript/ql/lib/semmle/javascript/frameworks/ClientRequests.qll
+++ b/javascript/ql/lib/semmle/javascript/frameworks/ClientRequests.qll
@@ -222,7 +222,10 @@ module ClientRequest {
method = "request"
or
this = axios().getMember(method).getACall() and
- method = [httpMethodName(), "request"]
+ method = [httpMethodName(), "request", "postForm", "putForm", "patchForm", "getUri"]
+ or
+ this = axios().getMember("create").getReturn().getACall() and
+ method = "request"
}
private int getOptionsArgIndex() {
@@ -254,6 +257,8 @@ module ClientRequest {
method = ["post", "put"] and
result = [this.getArgument(1), this.getOptionArgument(2, "data")]
or
+ method = ["postForm", "putForm", "patchForm"] and result = this.getArgument(1)
+ or
result = this.getOptionArgument([0 .. 2], ["headers", "params"])
}
diff --git a/javascript/ql/lib/semmle/javascript/frameworks/Hapi.qll b/javascript/ql/lib/semmle/javascript/frameworks/Hapi.qll
index f1936da3a67..a6dbf40d1e0 100644
--- a/javascript/ql/lib/semmle/javascript/frameworks/Hapi.qll
+++ b/javascript/ql/lib/semmle/javascript/frameworks/Hapi.qll
@@ -11,8 +11,8 @@ module Hapi {
*/
class ServerDefinition extends Http::Servers::StandardServerDefinition, DataFlow::Node {
ServerDefinition() {
- // `server = new Hapi.Server()`
- this = DataFlow::moduleMember("hapi", "Server").getAnInstantiation()
+ // `server = new Hapi.Server()`, `server = Hapi.server()`
+ this = DataFlow::moduleMember(["hapi", "@hapi/hapi"], ["Server", "server"]).getAnInvocation()
or
// `server = Glue.compose(manifest, composeOptions)`
this = DataFlow::moduleMember("@hapi/glue", "compose").getAnInvocation()
diff --git a/javascript/ql/lib/semmle/javascript/frameworks/NodeJSLib.qll b/javascript/ql/lib/semmle/javascript/frameworks/NodeJSLib.qll
index 3427591bc1b..bf5c2cafa5f 100644
--- a/javascript/ql/lib/semmle/javascript/frameworks/NodeJSLib.qll
+++ b/javascript/ql/lib/semmle/javascript/frameworks/NodeJSLib.qll
@@ -599,7 +599,7 @@ module NodeJSLib {
override DataFlow::Node getADataNode() {
if methodName.matches("%Sync")
then result = this
- else
+ else (
exists(int i, string paramName | fsDataParam(methodName, i, paramName) |
if paramName = "callback"
then
@@ -610,6 +610,12 @@ module NodeJSLib {
)
else result = this.getArgument(i)
)
+ or
+ exists(AwaitExpr await |
+ this.getEnclosingExpr() = await.getOperand() and
+ result = DataFlow::valueNode(await)
+ )
+ )
}
}
diff --git a/javascript/ql/lib/semmle/javascript/frameworks/data/internal/ApiGraphModelsSpecific.qll b/javascript/ql/lib/semmle/javascript/frameworks/data/internal/ApiGraphModelsSpecific.qll
index 29cd5da8da1..1f51af3efda 100644
--- a/javascript/ql/lib/semmle/javascript/frameworks/data/internal/ApiGraphModelsSpecific.qll
+++ b/javascript/ql/lib/semmle/javascript/frameworks/data/internal/ApiGraphModelsSpecific.qll
@@ -184,6 +184,20 @@ API::Node getExtraSuccessorFromNode(API::Node node, AccessPathTokenBase token) {
or
token.getName() = "DecoratedParameter" and
result = node.getADecoratedParameter()
+ or
+ token.getName() = "GuardedRouteHandler" and
+ result = getAGuardedRouteHandlerApprox(node)
+}
+
+bindingset[node]
+pragma[inline_late]
+private API::Node getAGuardedRouteHandlerApprox(API::Node node) {
+ // For now just get any routing node with the same root (i.e. the same web app), as
+ // there are some known performance issues when checking if it is actually guarded by the given node.
+ exists(JS::Routing::Node root |
+ root = JS::Routing::getNode(node.getAValueReachableFromSource()).getRootNode() and
+ root = JS::Routing::getNode(result.asSink()).getRootNode()
+ )
}
/**
@@ -317,7 +331,7 @@ predicate isExtraValidTokenNameInIdentifyingAccessPath(string name) {
[
"Member", "AnyMember", "Instance", "Awaited", "ArrayElement", "Element", "MapValue",
"NewCall", "Call", "DecoratedClass", "DecoratedMember", "DecoratedParameter",
- "WithStringArgument"
+ "WithStringArgument", "GuardedRouteHandler"
]
}
@@ -329,7 +343,7 @@ predicate isExtraValidNoArgumentTokenInIdentifyingAccessPath(string name) {
name =
[
"AnyMember", "Instance", "Awaited", "ArrayElement", "Element", "MapValue", "NewCall", "Call",
- "DecoratedClass", "DecoratedMember", "DecoratedParameter"
+ "DecoratedClass", "DecoratedMember", "DecoratedParameter", "GuardedRouteHandler"
]
}
diff --git a/javascript/ql/lib/semmlecode.javascript.dbscheme b/javascript/ql/lib/semmlecode.javascript.dbscheme
index 5b5db607d20..ccefb5e2d49 100644
--- a/javascript/ql/lib/semmlecode.javascript.dbscheme
+++ b/javascript/ql/lib/semmlecode.javascript.dbscheme
@@ -1001,7 +1001,7 @@ case @jsdoc_type_expr.kind of
| 2 = @jsdoc_undefined_type_expr
| 3 = @jsdoc_unknown_type_expr
| 4 = @jsdoc_void_type_expr
-| 5 = @jsdoc_named_type_expr
+| 5 = @jsdoc_identifier_type_expr
| 6 = @jsdoc_applied_type_expr
| 7 = @jsdoc_nullable_type_expr
| 8 = @jsdoc_non_nullable_type_expr
@@ -1011,6 +1011,7 @@ case @jsdoc_type_expr.kind of
| 12 = @jsdoc_function_type_expr
| 13 = @jsdoc_optional_type_expr
| 14 = @jsdoc_rest_type_expr
+| 15 = @jsdoc_qualified_type_expr
;
#keyset[id, idx]
diff --git a/javascript/ql/lib/semmlecode.javascript.dbscheme.stats b/javascript/ql/lib/semmlecode.javascript.dbscheme.stats
index 0b8848ff1d6..51889bd9286 100644
--- a/javascript/ql/lib/semmlecode.javascript.dbscheme.stats
+++ b/javascript/ql/lib/semmlecode.javascript.dbscheme.stats
@@ -1334,10 +1334,14 @@
8
-@jsdoc_named_type_expr
+@jsdoc_identifier_type_expr
18639
+@jsdoc_qualified_type_expr
+1000
+
+
@jsdoc_applied_type_expr
303
diff --git a/javascript/ql/lib/upgrades/5b5db607d20c7b449cef2d1c926b24d77c69bebb/old.dbscheme b/javascript/ql/lib/upgrades/5b5db607d20c7b449cef2d1c926b24d77c69bebb/old.dbscheme
new file mode 100644
index 00000000000..5b5db607d20
--- /dev/null
+++ b/javascript/ql/lib/upgrades/5b5db607d20c7b449cef2d1c926b24d77c69bebb/old.dbscheme
@@ -0,0 +1,1193 @@
+/*** Standard fragments ***/
+
+/*- Files and folders -*/
+
+/**
+ * The location of an element.
+ * The location spans column `startcolumn` of line `startline` to
+ * column `endcolumn` of line `endline` in file `file`.
+ * For more information, see
+ * [Locations](https://codeql.github.com/docs/writing-codeql-queries/providing-locations-in-codeql-queries/).
+ */
+locations_default(
+ unique int id: @location_default,
+ int file: @file ref,
+ int beginLine: int ref,
+ int beginColumn: int ref,
+ int endLine: int ref,
+ int endColumn: int ref
+);
+
+files(
+ unique int id: @file,
+ string name: string ref
+);
+
+folders(
+ unique int id: @folder,
+ string name: string ref
+);
+
+@container = @file | @folder
+
+containerparent(
+ int parent: @container ref,
+ unique int child: @container ref
+);
+
+/*- Lines of code -*/
+
+numlines(
+ int element_id: @sourceline ref,
+ int num_lines: int ref,
+ int num_code: int ref,
+ int num_comment: int ref
+);
+
+/*- External data -*/
+
+/**
+ * External data, loaded from CSV files during snapshot creation. See
+ * [Tutorial: Incorporating external data](https://help.semmle.com/wiki/display/SD/Tutorial%3A+Incorporating+external+data)
+ * for more information.
+ */
+externalData(
+ int id : @externalDataElement,
+ string path : string ref,
+ int column: int ref,
+ string value : string ref
+);
+
+/*- Source location prefix -*/
+
+/**
+ * The source location of the snapshot.
+ */
+sourceLocationPrefix(string prefix : string ref);
+
+/*- JavaScript-specific part -*/
+
+@location = @location_default
+
+@sourceline = @locatable;
+
+filetype(
+ int file: @file ref,
+ string filetype: string ref
+)
+
+// top-level code fragments
+toplevels (unique int id: @toplevel,
+ int kind: int ref);
+
+is_externs (int toplevel: @toplevel ref);
+
+case @toplevel.kind of
+ 0 = @script
+| 1 = @inline_script
+| 2 = @event_handler
+| 3 = @javascript_url
+| 4 = @template_toplevel;
+
+is_module (int tl: @toplevel ref);
+is_nodejs (int tl: @toplevel ref);
+is_es2015_module (int tl: @toplevel ref);
+is_closure_module (int tl: @toplevel ref);
+
+@xml_node_with_code = @xmlelement | @xmlattribute | @template_placeholder_tag;
+toplevel_parent_xml_node(
+ unique int toplevel: @toplevel ref,
+ int xmlnode: @xml_node_with_code ref);
+
+xml_element_parent_expression(
+ unique int xmlnode: @xmlelement ref,
+ int expression: @expr ref,
+ int index: int ref);
+
+// statements
+#keyset[parent, idx]
+stmts (unique int id: @stmt,
+ int kind: int ref,
+ int parent: @stmt_parent ref,
+ int idx: int ref,
+ varchar(900) tostring: string ref);
+
+stmt_containers (unique int stmt: @stmt ref,
+ int container: @stmt_container ref);
+
+jump_targets (unique int jump: @stmt ref,
+ int target: @stmt ref);
+
+@stmt_parent = @stmt | @toplevel | @function_expr | @arrow_function_expr | @static_initializer;
+@stmt_container = @toplevel | @function | @namespace_declaration | @external_module_declaration | @global_augmentation_declaration;
+
+case @stmt.kind of
+ 0 = @empty_stmt
+| 1 = @block_stmt
+| 2 = @expr_stmt
+| 3 = @if_stmt
+| 4 = @labeled_stmt
+| 5 = @break_stmt
+| 6 = @continue_stmt
+| 7 = @with_stmt
+| 8 = @switch_stmt
+| 9 = @return_stmt
+| 10 = @throw_stmt
+| 11 = @try_stmt
+| 12 = @while_stmt
+| 13 = @do_while_stmt
+| 14 = @for_stmt
+| 15 = @for_in_stmt
+| 16 = @debugger_stmt
+| 17 = @function_decl_stmt
+| 18 = @var_decl_stmt
+| 19 = @case
+| 20 = @catch_clause
+| 21 = @for_of_stmt
+| 22 = @const_decl_stmt
+| 23 = @let_stmt
+| 24 = @legacy_let_stmt
+| 25 = @for_each_stmt
+| 26 = @class_decl_stmt
+| 27 = @import_declaration
+| 28 = @export_all_declaration
+| 29 = @export_default_declaration
+| 30 = @export_named_declaration
+| 31 = @namespace_declaration
+| 32 = @import_equals_declaration
+| 33 = @export_assign_declaration
+| 34 = @interface_declaration
+| 35 = @type_alias_declaration
+| 36 = @enum_declaration
+| 37 = @external_module_declaration
+| 38 = @export_as_namespace_declaration
+| 39 = @global_augmentation_declaration
+| 40 = @using_decl_stmt
+;
+
+@decl_stmt = @var_decl_stmt | @const_decl_stmt | @let_stmt | @legacy_let_stmt | @using_decl_stmt;
+
+@export_declaration = @export_all_declaration | @export_default_declaration | @export_named_declaration;
+
+@namespace_definition = @namespace_declaration | @enum_declaration;
+@type_definition = @class_definition | @interface_declaration | @enum_declaration | @type_alias_declaration | @enum_member;
+
+is_instantiated(unique int decl: @namespace_declaration ref);
+
+@declarable_node = @decl_stmt | @namespace_declaration | @class_decl_stmt | @function_decl_stmt | @enum_declaration | @external_module_declaration | @global_augmentation_declaration | @field;
+has_declare_keyword(unique int stmt: @declarable_node ref);
+
+is_for_await_of(unique int forof: @for_of_stmt ref);
+
+// expressions
+#keyset[parent, idx]
+exprs (unique int id: @expr,
+ int kind: int ref,
+ int parent: @expr_parent ref,
+ int idx: int ref,
+ varchar(900) tostring: string ref);
+
+literals (varchar(900) value: string ref,
+ varchar(900) raw: string ref,
+ unique int expr: @expr_or_type ref);
+
+enclosing_stmt (unique int expr: @expr_or_type ref,
+ int stmt: @stmt ref);
+
+expr_containers (unique int expr: @expr_or_type ref,
+ int container: @stmt_container ref);
+
+array_size (unique int ae: @arraylike ref,
+ int sz: int ref);
+
+is_delegating (int yield: @yield_expr ref);
+
+@expr_or_stmt = @expr | @stmt;
+@expr_or_type = @expr | @typeexpr;
+@expr_parent = @expr_or_stmt | @property | @function_typeexpr;
+@arraylike = @array_expr | @array_pattern;
+@type_annotation = @typeexpr | @jsdoc_type_expr;
+@node_in_stmt_container = @cfg_node | @type_annotation | @toplevel;
+
+case @expr.kind of
+ 0 = @label
+| 1 = @null_literal
+| 2 = @boolean_literal
+| 3 = @number_literal
+| 4 = @string_literal
+| 5 = @regexp_literal
+| 6 = @this_expr
+| 7 = @array_expr
+| 8 = @obj_expr
+| 9 = @function_expr
+| 10 = @seq_expr
+| 11 = @conditional_expr
+| 12 = @new_expr
+| 13 = @call_expr
+| 14 = @dot_expr
+| 15 = @index_expr
+| 16 = @neg_expr
+| 17 = @plus_expr
+| 18 = @log_not_expr
+| 19 = @bit_not_expr
+| 20 = @typeof_expr
+| 21 = @void_expr
+| 22 = @delete_expr
+| 23 = @eq_expr
+| 24 = @neq_expr
+| 25 = @eqq_expr
+| 26 = @neqq_expr
+| 27 = @lt_expr
+| 28 = @le_expr
+| 29 = @gt_expr
+| 30 = @ge_expr
+| 31 = @lshift_expr
+| 32 = @rshift_expr
+| 33 = @urshift_expr
+| 34 = @add_expr
+| 35 = @sub_expr
+| 36 = @mul_expr
+| 37 = @div_expr
+| 38 = @mod_expr
+| 39 = @bitor_expr
+| 40 = @xor_expr
+| 41 = @bitand_expr
+| 42 = @in_expr
+| 43 = @instanceof_expr
+| 44 = @logand_expr
+| 45 = @logor_expr
+| 47 = @assign_expr
+| 48 = @assign_add_expr
+| 49 = @assign_sub_expr
+| 50 = @assign_mul_expr
+| 51 = @assign_div_expr
+| 52 = @assign_mod_expr
+| 53 = @assign_lshift_expr
+| 54 = @assign_rshift_expr
+| 55 = @assign_urshift_expr
+| 56 = @assign_or_expr
+| 57 = @assign_xor_expr
+| 58 = @assign_and_expr
+| 59 = @preinc_expr
+| 60 = @postinc_expr
+| 61 = @predec_expr
+| 62 = @postdec_expr
+| 63 = @par_expr
+| 64 = @var_declarator
+| 65 = @arrow_function_expr
+| 66 = @spread_element
+| 67 = @array_pattern
+| 68 = @object_pattern
+| 69 = @yield_expr
+| 70 = @tagged_template_expr
+| 71 = @template_literal
+| 72 = @template_element
+| 73 = @array_comprehension_expr
+| 74 = @generator_expr
+| 75 = @for_in_comprehension_block
+| 76 = @for_of_comprehension_block
+| 77 = @legacy_letexpr
+| 78 = @var_decl
+| 79 = @proper_varaccess
+| 80 = @class_expr
+| 81 = @super_expr
+| 82 = @newtarget_expr
+| 83 = @named_import_specifier
+| 84 = @import_default_specifier
+| 85 = @import_namespace_specifier
+| 86 = @named_export_specifier
+| 87 = @exp_expr
+| 88 = @assign_exp_expr
+| 89 = @jsx_element
+| 90 = @jsx_qualified_name
+| 91 = @jsx_empty_expr
+| 92 = @await_expr
+| 93 = @function_sent_expr
+| 94 = @decorator
+| 95 = @export_default_specifier
+| 96 = @export_namespace_specifier
+| 97 = @bind_expr
+| 98 = @external_module_reference
+| 99 = @dynamic_import
+| 100 = @expression_with_type_arguments
+| 101 = @prefix_type_assertion
+| 102 = @as_type_assertion
+| 103 = @export_varaccess
+| 104 = @decorator_list
+| 105 = @non_null_assertion
+| 106 = @bigint_literal
+| 107 = @nullishcoalescing_expr
+| 108 = @e4x_xml_anyname
+| 109 = @e4x_xml_static_attribute_selector
+| 110 = @e4x_xml_dynamic_attribute_selector
+| 111 = @e4x_xml_filter_expression
+| 112 = @e4x_xml_static_qualident
+| 113 = @e4x_xml_dynamic_qualident
+| 114 = @e4x_xml_dotdotexpr
+| 115 = @import_meta_expr
+| 116 = @assignlogandexpr
+| 117 = @assignlogorexpr
+| 118 = @assignnullishcoalescingexpr
+| 119 = @template_pipe_ref
+| 120 = @generated_code_expr
+| 121 = @satisfies_expr
+;
+
+@varaccess = @proper_varaccess | @export_varaccess;
+@varref = @var_decl | @varaccess;
+
+@identifier = @label | @varref | @type_identifier;
+
+@literal = @null_literal | @boolean_literal | @number_literal | @string_literal | @regexp_literal | @bigint_literal;
+
+@propaccess = @dot_expr | @index_expr;
+
+@invokeexpr = @new_expr | @call_expr;
+
+@unaryexpr = @neg_expr | @plus_expr | @log_not_expr | @bit_not_expr | @typeof_expr | @void_expr | @delete_expr | @spread_element;
+
+@equality_test = @eq_expr | @neq_expr | @eqq_expr | @neqq_expr;
+
+@comparison = @equality_test | @lt_expr | @le_expr | @gt_expr | @ge_expr;
+
+@binaryexpr = @comparison | @lshift_expr | @rshift_expr | @urshift_expr | @add_expr | @sub_expr | @mul_expr | @div_expr | @mod_expr | @exp_expr | @bitor_expr | @xor_expr | @bitand_expr | @in_expr | @instanceof_expr | @logand_expr | @logor_expr | @nullishcoalescing_expr;
+
+@assignment = @assign_expr | @assign_add_expr | @assign_sub_expr | @assign_mul_expr | @assign_div_expr | @assign_mod_expr | @assign_exp_expr | @assign_lshift_expr | @assign_rshift_expr | @assign_urshift_expr | @assign_or_expr | @assign_xor_expr | @assign_and_expr | @assignlogandexpr | @assignlogorexpr | @assignnullishcoalescingexpr;
+
+@updateexpr = @preinc_expr | @postinc_expr | @predec_expr | @postdec_expr;
+
+@pattern = @varref | @array_pattern | @object_pattern;
+
+@comprehension_expr = @array_comprehension_expr | @generator_expr;
+
+@comprehension_block = @for_in_comprehension_block | @for_of_comprehension_block;
+
+@import_specifier = @named_import_specifier | @import_default_specifier | @import_namespace_specifier;
+
+@exportspecifier = @named_export_specifier | @export_default_specifier | @export_namespace_specifier;
+
+@type_keyword_operand = @import_declaration | @export_declaration | @import_specifier;
+
+@type_assertion = @as_type_assertion | @prefix_type_assertion;
+
+@class_definition = @class_decl_stmt | @class_expr;
+@interface_definition = @interface_declaration | @interface_typeexpr;
+@class_or_interface = @class_definition | @interface_definition;
+
+@lexical_decl = @var_decl | @type_decl;
+@lexical_access = @varaccess | @local_type_access | @local_var_type_access | @local_namespace_access;
+@lexical_ref = @lexical_decl | @lexical_access;
+
+@e4x_xml_attribute_selector = @e4x_xml_static_attribute_selector | @e4x_xml_dynamic_attribute_selector;
+@e4x_xml_qualident = @e4x_xml_static_qualident | @e4x_xml_dynamic_qualident;
+
+expr_contains_template_tag_location(
+ int expr: @expr ref,
+ int location: @location ref
+);
+
+@template_placeholder_tag_parent = @xmlelement | @xmlattribute | @file;
+
+template_placeholder_tag_info(
+ unique int node: @template_placeholder_tag,
+ int parentNode: @template_placeholder_tag_parent ref,
+ varchar(900) raw: string ref
+);
+
+// scopes
+scopes (unique int id: @scope,
+ int kind: int ref);
+
+case @scope.kind of
+ 0 = @global_scope
+| 1 = @function_scope
+| 2 = @catch_scope
+| 3 = @module_scope
+| 4 = @block_scope
+| 5 = @for_scope
+| 6 = @for_in_scope // for-of scopes work the same as for-in scopes
+| 7 = @comprehension_block_scope
+| 8 = @class_expr_scope
+| 9 = @namespace_scope
+| 10 = @class_decl_scope
+| 11 = @interface_scope
+| 12 = @type_alias_scope
+| 13 = @mapped_type_scope
+| 14 = @enum_scope
+| 15 = @external_module_scope
+| 16 = @conditional_type_scope;
+
+scopenodes (unique int node: @ast_node ref,
+ int scope: @scope ref);
+
+scopenesting (unique int inner: @scope ref,
+ int outer: @scope ref);
+
+// functions
+@function = @function_decl_stmt | @function_expr | @arrow_function_expr;
+
+@parameterized = @function | @catch_clause;
+@type_parameterized = @function | @class_or_interface | @type_alias_declaration | @mapped_typeexpr | @infer_typeexpr;
+
+is_generator (int fun: @function ref);
+has_rest_parameter (int fun: @function ref);
+is_async (int fun: @function ref);
+
+// variables and lexically scoped type names
+#keyset[scope, name]
+variables (unique int id: @variable,
+ varchar(900) name: string ref,
+ int scope: @scope ref);
+
+#keyset[scope, name]
+local_type_names (unique int id: @local_type_name,
+ varchar(900) name: string ref,
+ int scope: @scope ref);
+
+#keyset[scope, name]
+local_namespace_names (unique int id: @local_namespace_name,
+ varchar(900) name: string ref,
+ int scope: @scope ref);
+
+is_arguments_object (int id: @variable ref);
+
+@lexical_name = @variable | @local_type_name | @local_namespace_name;
+
+@bind_id = @varaccess | @local_var_type_access;
+bind (unique int id: @bind_id ref,
+ int decl: @variable ref);
+
+decl (unique int id: @var_decl ref,
+ int decl: @variable ref);
+
+@typebind_id = @local_type_access | @export_varaccess;
+typebind (unique int id: @typebind_id ref,
+ int decl: @local_type_name ref);
+
+@typedecl_id = @type_decl | @var_decl;
+typedecl (unique int id: @typedecl_id ref,
+ int decl: @local_type_name ref);
+
+namespacedecl (unique int id: @var_decl ref,
+ int decl: @local_namespace_name ref);
+
+@namespacebind_id = @local_namespace_access | @export_varaccess;
+namespacebind (unique int id: @namespacebind_id ref,
+ int decl: @local_namespace_name ref);
+
+
+// properties in object literals, property patterns in object patterns, and method declarations in classes
+#keyset[parent, index]
+properties (unique int id: @property,
+ int parent: @property_parent ref,
+ int index: int ref,
+ int kind: int ref,
+ varchar(900) tostring: string ref);
+
+case @property.kind of
+ 0 = @value_property
+| 1 = @property_getter
+| 2 = @property_setter
+| 3 = @jsx_attribute
+| 4 = @function_call_signature
+| 5 = @constructor_call_signature
+| 6 = @index_signature
+| 7 = @enum_member
+| 8 = @proper_field
+| 9 = @parameter_field
+| 10 = @static_initializer
+;
+
+@property_parent = @obj_expr | @object_pattern | @class_definition | @jsx_element | @interface_definition | @enum_declaration;
+@property_accessor = @property_getter | @property_setter;
+@call_signature = @function_call_signature | @constructor_call_signature;
+@field = @proper_field | @parameter_field;
+@field_or_vardeclarator = @field | @var_declarator;
+
+is_computed (int id: @property ref);
+is_method (int id: @property ref);
+is_static (int id: @property ref);
+is_abstract_member (int id: @property ref);
+is_const_enum (int id: @enum_declaration ref);
+is_abstract_class (int id: @class_decl_stmt ref);
+
+has_public_keyword (int id: @property ref);
+has_private_keyword (int id: @property ref);
+has_protected_keyword (int id: @property ref);
+has_readonly_keyword (int id: @property ref);
+has_type_keyword (int id: @type_keyword_operand ref);
+is_optional_member (int id: @property ref);
+has_definite_assignment_assertion (int id: @field_or_vardeclarator ref);
+is_optional_parameter_declaration (unique int parameter: @pattern ref);
+
+#keyset[constructor, param_index]
+parameter_fields(
+ unique int field: @parameter_field ref,
+ int constructor: @function_expr ref,
+ int param_index: int ref
+);
+
+// types
+#keyset[parent, idx]
+typeexprs (
+ unique int id: @typeexpr,
+ int kind: int ref,
+ int parent: @typeexpr_parent ref,
+ int idx: int ref,
+ varchar(900) tostring: string ref
+);
+
+case @typeexpr.kind of
+ 0 = @local_type_access
+| 1 = @type_decl
+| 2 = @keyword_typeexpr
+| 3 = @string_literal_typeexpr
+| 4 = @number_literal_typeexpr
+| 5 = @boolean_literal_typeexpr
+| 6 = @array_typeexpr
+| 7 = @union_typeexpr
+| 8 = @indexed_access_typeexpr
+| 9 = @intersection_typeexpr
+| 10 = @parenthesized_typeexpr
+| 11 = @tuple_typeexpr
+| 12 = @keyof_typeexpr
+| 13 = @qualified_type_access
+| 14 = @generic_typeexpr
+| 15 = @type_label
+| 16 = @typeof_typeexpr
+| 17 = @local_var_type_access
+| 18 = @qualified_var_type_access
+| 19 = @this_var_type_access
+| 20 = @predicate_typeexpr
+| 21 = @interface_typeexpr
+| 22 = @type_parameter
+| 23 = @plain_function_typeexpr
+| 24 = @constructor_typeexpr
+| 25 = @local_namespace_access
+| 26 = @qualified_namespace_access
+| 27 = @mapped_typeexpr
+| 28 = @conditional_typeexpr
+| 29 = @infer_typeexpr
+| 30 = @import_type_access
+| 31 = @import_namespace_access
+| 32 = @import_var_type_access
+| 33 = @optional_typeexpr
+| 34 = @rest_typeexpr
+| 35 = @bigint_literal_typeexpr
+| 36 = @readonly_typeexpr
+| 37 = @template_literal_typeexpr
+;
+
+@typeref = @typeaccess | @type_decl;
+@type_identifier = @type_decl | @local_type_access | @type_label | @local_var_type_access | @local_namespace_access;
+@typeexpr_parent = @expr | @stmt | @property | @typeexpr;
+@literal_typeexpr = @string_literal_typeexpr | @number_literal_typeexpr | @boolean_literal_typeexpr | @bigint_literal_typeexpr;
+@typeaccess = @local_type_access | @qualified_type_access | @import_type_access;
+@vartypeaccess = @local_var_type_access | @qualified_var_type_access | @this_var_type_access | @import_var_type_access;
+@namespace_access = @local_namespace_access | @qualified_namespace_access | @import_namespace_access;
+@import_typeexpr = @import_type_access | @import_namespace_access | @import_var_type_access;
+
+@function_typeexpr = @plain_function_typeexpr | @constructor_typeexpr;
+
+// types
+types (
+ unique int id: @type,
+ int kind: int ref,
+ varchar(900) tostring: string ref
+);
+
+#keyset[parent, idx]
+type_child (
+ int child: @type ref,
+ int parent: @type ref,
+ int idx: int ref
+);
+
+case @type.kind of
+ 0 = @any_type
+| 1 = @string_type
+| 2 = @number_type
+| 3 = @union_type
+| 4 = @true_type
+| 5 = @false_type
+| 6 = @type_reference
+| 7 = @object_type
+| 8 = @canonical_type_variable_type
+| 9 = @typeof_type
+| 10 = @void_type
+| 11 = @undefined_type
+| 12 = @null_type
+| 13 = @never_type
+| 14 = @plain_symbol_type
+| 15 = @unique_symbol_type
+| 16 = @objectkeyword_type
+| 17 = @intersection_type
+| 18 = @tuple_type
+| 19 = @lexical_type_variable_type
+| 20 = @this_type
+| 21 = @number_literal_type
+| 22 = @string_literal_type
+| 23 = @unknown_type
+| 24 = @bigint_type
+| 25 = @bigint_literal_type
+;
+
+@boolean_literal_type = @true_type | @false_type;
+@symbol_type = @plain_symbol_type | @unique_symbol_type;
+@union_or_intersection_type = @union_type | @intersection_type;
+@typevariable_type = @canonical_type_variable_type | @lexical_type_variable_type;
+
+has_asserts_keyword(int node: @predicate_typeexpr ref);
+
+@typed_ast_node = @expr | @typeexpr | @function;
+ast_node_type(
+ unique int node: @typed_ast_node ref,
+ int typ: @type ref);
+
+declared_function_signature(
+ unique int node: @function ref,
+ int sig: @signature_type ref
+);
+
+invoke_expr_signature(
+ unique int node: @invokeexpr ref,
+ int sig: @signature_type ref
+);
+
+invoke_expr_overload_index(
+ unique int node: @invokeexpr ref,
+ int index: int ref
+);
+
+symbols (
+ unique int id: @symbol,
+ int kind: int ref,
+ varchar(900) name: string ref
+);
+
+symbol_parent (
+ unique int symbol: @symbol ref,
+ int parent: @symbol ref
+);
+
+symbol_module (
+ int symbol: @symbol ref,
+ varchar(900) moduleName: string ref
+);
+
+symbol_global (
+ int symbol: @symbol ref,
+ varchar(900) globalName: string ref
+);
+
+case @symbol.kind of
+ 0 = @root_symbol
+| 1 = @member_symbol
+| 2 = @other_symbol
+;
+
+@type_with_symbol = @type_reference | @typevariable_type | @typeof_type | @unique_symbol_type;
+@ast_node_with_symbol = @type_definition | @namespace_definition | @toplevel | @typeaccess | @namespace_access | @var_decl | @function | @invokeexpr | @import_declaration | @external_module_reference | @external_module_declaration;
+
+ast_node_symbol(
+ unique int node: @ast_node_with_symbol ref,
+ int symbol: @symbol ref);
+
+type_symbol(
+ unique int typ: @type_with_symbol ref,
+ int symbol: @symbol ref);
+
+#keyset[typ, name]
+type_property(
+ int typ: @type ref,
+ varchar(900) name: string ref,
+ int propertyType: @type ref);
+
+type_alias(
+ unique int aliasType: @type ref,
+ int underlyingType: @type ref);
+
+@literal_type = @string_literal_type | @number_literal_type | @boolean_literal_type | @bigint_literal_type;
+@type_with_literal_value = @string_literal_type | @number_literal_type | @bigint_literal_type;
+type_literal_value(
+ unique int typ: @type_with_literal_value ref,
+ varchar(900) value: string ref);
+
+signature_types (
+ unique int id: @signature_type,
+ int kind: int ref,
+ varchar(900) tostring: string ref,
+ int type_parameters: int ref,
+ int required_params: int ref
+);
+
+is_abstract_signature(
+ unique int sig: @signature_type ref
+);
+
+signature_rest_parameter(
+ unique int sig: @signature_type ref,
+ int rest_param_arra_type: @type ref
+);
+
+case @signature_type.kind of
+ 0 = @function_signature_type
+| 1 = @constructor_signature_type
+;
+
+#keyset[typ, kind, index]
+type_contains_signature (
+ int typ: @type ref,
+ int kind: int ref, // constructor/call/index
+ int index: int ref, // ordering of overloaded signatures
+ int sig: @signature_type ref
+);
+
+#keyset[parent, index]
+signature_contains_type (
+ int child: @type ref,
+ int parent: @signature_type ref,
+ int index: int ref
+);
+
+#keyset[sig, index]
+signature_parameter_name (
+ int sig: @signature_type ref,
+ int index: int ref,
+ varchar(900) name: string ref
+);
+
+number_index_type (
+ unique int baseType: @type ref,
+ int propertyType: @type ref
+);
+
+string_index_type (
+ unique int baseType: @type ref,
+ int propertyType: @type ref
+);
+
+base_type_names(
+ int typeName: @symbol ref,
+ int baseTypeName: @symbol ref
+);
+
+self_types(
+ int typeName: @symbol ref,
+ int selfType: @type_reference ref
+);
+
+tuple_type_min_length(
+ unique int typ: @type ref,
+ int minLength: int ref
+);
+
+tuple_type_rest_index(
+ unique int typ: @type ref,
+ int index: int ref
+);
+
+// comments
+comments (unique int id: @comment,
+ int kind: int ref,
+ int toplevel: @toplevel ref,
+ varchar(900) text: string ref,
+ varchar(900) tostring: string ref);
+
+case @comment.kind of
+ 0 = @slashslash_comment
+| 1 = @slashstar_comment
+| 2 = @doc_comment
+| 3 = @html_comment_start
+| 4 = @htmlcommentend;
+
+@html_comment = @html_comment_start | @htmlcommentend;
+@line_comment = @slashslash_comment | @html_comment;
+@block_comment = @slashstar_comment | @doc_comment;
+
+// source lines
+lines (unique int id: @line,
+ int toplevel: @toplevel ref,
+ varchar(900) text: string ref,
+ varchar(2) terminator: string ref);
+indentation (int file: @file ref,
+ int lineno: int ref,
+ varchar(1) indentChar: string ref,
+ int indentDepth: int ref);
+
+// JavaScript parse errors
+js_parse_errors (unique int id: @js_parse_error,
+ int toplevel: @toplevel ref,
+ varchar(900) message: string ref,
+ varchar(900) line: string ref);
+
+// regular expressions
+#keyset[parent, idx]
+regexpterm (unique int id: @regexpterm,
+ int kind: int ref,
+ int parent: @regexpparent ref,
+ int idx: int ref,
+ varchar(900) tostring: string ref);
+
+@regexpparent = @regexpterm | @regexp_literal | @string_literal | @add_expr;
+
+case @regexpterm.kind of
+ 0 = @regexp_alt
+| 1 = @regexp_seq
+| 2 = @regexp_caret
+| 3 = @regexp_dollar
+| 4 = @regexp_wordboundary
+| 5 = @regexp_nonwordboundary
+| 6 = @regexp_positive_lookahead
+| 7 = @regexp_negative_lookahead
+| 8 = @regexp_star
+| 9 = @regexp_plus
+| 10 = @regexp_opt
+| 11 = @regexp_range
+| 12 = @regexp_dot
+| 13 = @regexp_group
+| 14 = @regexp_normal_constant
+| 15 = @regexp_hex_escape
+| 16 = @regexp_unicode_escape
+| 17 = @regexp_dec_escape
+| 18 = @regexp_oct_escape
+| 19 = @regexp_ctrl_escape
+| 20 = @regexp_char_class_escape
+| 21 = @regexp_id_escape
+| 22 = @regexp_backref
+| 23 = @regexp_char_class
+| 24 = @regexp_char_range
+| 25 = @regexp_positive_lookbehind
+| 26 = @regexp_negative_lookbehind
+| 27 = @regexp_unicode_property_escape
+| 28 = @regexp_quoted_string
+| 29 = @regexp_intersection
+| 30 = @regexp_subtraction;
+
+regexp_parse_errors (unique int id: @regexp_parse_error,
+ int regexp: @regexpterm ref,
+ varchar(900) message: string ref);
+
+@regexp_quantifier = @regexp_star | @regexp_plus | @regexp_opt | @regexp_range;
+@regexp_escape = @regexp_char_escape | @regexp_char_class_escape | @regexp_unicode_property_escape;
+@regexp_char_escape = @regexp_hex_escape | @regexp_unicode_escape | @regexp_dec_escape | @regexp_oct_escape | @regexp_ctrl_escape | @regexp_id_escape;
+@regexp_constant = @regexp_normal_constant | @regexp_char_escape;
+@regexp_lookahead = @regexp_positive_lookahead | @regexp_negative_lookahead;
+@regexp_lookbehind = @regexp_positive_lookbehind | @regexp_negative_lookbehind;
+@regexp_subpattern = @regexp_lookahead | @regexp_lookbehind;
+@regexp_anchor = @regexp_dollar | @regexp_caret;
+
+is_greedy (int id: @regexp_quantifier ref);
+range_quantifier_lower_bound (unique int id: @regexp_range ref, int lo: int ref);
+range_quantifier_upper_bound (unique int id: @regexp_range ref, int hi: int ref);
+is_capture (unique int id: @regexp_group ref, int number: int ref);
+is_named_capture (unique int id: @regexp_group ref, string name: string ref);
+is_inverted (int id: @regexp_char_class ref);
+regexp_const_value (unique int id: @regexp_constant ref, varchar(1) value: string ref);
+char_class_escape (unique int id: @regexp_char_class_escape ref, varchar(1) value: string ref);
+backref (unique int id: @regexp_backref ref, int value: int ref);
+named_backref (unique int id: @regexp_backref ref, string name: string ref);
+unicode_property_escapename (unique int id: @regexp_unicode_property_escape ref, string name: string ref);
+unicode_property_escapevalue (unique int id: @regexp_unicode_property_escape ref, string value: string ref);
+
+// tokens
+#keyset[toplevel, idx]
+tokeninfo (unique int id: @token,
+ int kind: int ref,
+ int toplevel: @toplevel ref,
+ int idx: int ref,
+ varchar(900) value: string ref);
+
+case @token.kind of
+ 0 = @token_eof
+| 1 = @token_null_literal
+| 2 = @token_boolean_literal
+| 3 = @token_numeric_literal
+| 4 = @token_string_literal
+| 5 = @token_regular_expression
+| 6 = @token_identifier
+| 7 = @token_keyword
+| 8 = @token_punctuator;
+
+// associate comments with the token immediately following them (which may be EOF)
+next_token (int comment: @comment ref, int token: @token ref);
+
+// JSON
+#keyset[parent, idx]
+json (unique int id: @json_value,
+ int kind: int ref,
+ int parent: @json_parent ref,
+ int idx: int ref,
+ varchar(900) tostring: string ref);
+
+json_literals (varchar(900) value: string ref,
+ varchar(900) raw: string ref,
+ unique int expr: @json_value ref);
+
+json_properties (int obj: @json_object ref,
+ varchar(900) property: string ref,
+ int value: @json_value ref);
+
+json_errors (unique int id: @json_parse_error,
+ varchar(900) message: string ref);
+
+json_locations(unique int locatable: @json_locatable ref,
+ int location: @location_default ref);
+
+case @json_value.kind of
+ 0 = @json_null
+| 1 = @json_boolean
+| 2 = @json_number
+| 3 = @json_string
+| 4 = @json_array
+| 5 = @json_object;
+
+@json_parent = @json_object | @json_array | @file;
+
+@json_locatable = @json_value | @json_parse_error;
+
+// locations
+@ast_node = @toplevel | @stmt | @expr | @property | @typeexpr;
+
+@locatable = @file
+ | @ast_node
+ | @comment
+ | @line
+ | @js_parse_error | @regexp_parse_error
+ | @regexpterm
+ | @json_locatable
+ | @token
+ | @cfg_node
+ | @jsdoc | @jsdoc_type_expr | @jsdoc_tag
+ | @yaml_locatable
+ | @xmllocatable
+ | @configLocatable
+ | @template_placeholder_tag;
+
+hasLocation (unique int locatable: @locatable ref,
+ int location: @location ref);
+
+// CFG
+entry_cfg_node (unique int id: @entry_node, int container: @stmt_container ref);
+exit_cfg_node (unique int id: @exit_node, int container: @stmt_container ref);
+guard_node (unique int id: @guard_node, int kind: int ref, int test: @expr ref);
+case @guard_node.kind of
+ 0 = @falsy_guard
+| 1 = @truthy_guard;
+@condition_guard = @falsy_guard | @truthy_guard;
+
+@synthetic_cfg_node = @entry_node | @exit_node | @guard_node;
+@cfg_node = @synthetic_cfg_node | @expr_parent;
+
+successor (int pred: @cfg_node ref, int succ: @cfg_node ref);
+
+// JSDoc comments
+jsdoc (unique int id: @jsdoc, varchar(900) description: string ref, int comment: @comment ref);
+#keyset[parent, idx]
+jsdoc_tags (unique int id: @jsdoc_tag, varchar(900) title: string ref,
+ int parent: @jsdoc ref, int idx: int ref, varchar(900) tostring: string ref);
+jsdoc_tag_descriptions (unique int tag: @jsdoc_tag ref, varchar(900) text: string ref);
+jsdoc_tag_names (unique int tag: @jsdoc_tag ref, varchar(900) text: string ref);
+
+#keyset[parent, idx]
+jsdoc_type_exprs (unique int id: @jsdoc_type_expr,
+ int kind: int ref,
+ int parent: @jsdoc_type_expr_parent ref,
+ int idx: int ref,
+ varchar(900) tostring: string ref);
+case @jsdoc_type_expr.kind of
+ 0 = @jsdoc_any_type_expr
+| 1 = @jsdoc_null_type_expr
+| 2 = @jsdoc_undefined_type_expr
+| 3 = @jsdoc_unknown_type_expr
+| 4 = @jsdoc_void_type_expr
+| 5 = @jsdoc_named_type_expr
+| 6 = @jsdoc_applied_type_expr
+| 7 = @jsdoc_nullable_type_expr
+| 8 = @jsdoc_non_nullable_type_expr
+| 9 = @jsdoc_record_type_expr
+| 10 = @jsdoc_array_type_expr
+| 11 = @jsdoc_union_type_expr
+| 12 = @jsdoc_function_type_expr
+| 13 = @jsdoc_optional_type_expr
+| 14 = @jsdoc_rest_type_expr
+;
+
+#keyset[id, idx]
+jsdoc_record_field_name (int id: @jsdoc_record_type_expr ref, int idx: int ref, varchar(900) name: string ref);
+jsdoc_prefix_qualifier (int id: @jsdoc_type_expr ref);
+jsdoc_has_new_parameter (int fn: @jsdoc_function_type_expr ref);
+
+@jsdoc_type_expr_parent = @jsdoc_type_expr | @jsdoc_tag;
+
+jsdoc_errors (unique int id: @jsdoc_error, int tag: @jsdoc_tag ref, varchar(900) message: string ref, varchar(900) tostring: string ref);
+
+@dataflownode = @expr | @function_decl_stmt | @class_decl_stmt | @namespace_declaration | @enum_declaration | @property;
+
+@optionalchainable = @call_expr | @propaccess;
+
+isOptionalChaining(int id: @optionalchainable ref);
+
+/**
+ * The time taken for the extraction of a file.
+ * This table contains non-deterministic content.
+ *
+ * The sum of the `time` column for each (`file`, `timerKind`) pair
+ * is the total time taken for extraction of `file`. The `extractionPhase`
+ * column provides a granular view of the extraction time of the file.
+ */
+extraction_time(
+ int file : @file ref,
+ // see `com.semmle.js.extractor.ExtractionMetrics.ExtractionPhase`.
+ int extractionPhase: int ref,
+ // 0 for the elapsed CPU time in nanoseconds, 1 for the elapsed wallclock time in nanoseconds
+ int timerKind: int ref,
+ float time: float ref
+)
+
+/**
+* Non-timing related data for the extraction of a single file.
+* This table contains non-deterministic content.
+*/
+extraction_data(
+ int file : @file ref,
+ // the absolute path to the cache file
+ varchar(900) cacheFile: string ref,
+ boolean fromCache: boolean ref,
+ int length: int ref
+)
+
+/*- YAML -*/
+
+#keyset[parent, idx]
+yaml (unique int id: @yaml_node,
+ int kind: int ref,
+ int parent: @yaml_node_parent ref,
+ int idx: int ref,
+ string tag: string ref,
+ string tostring: string ref);
+
+case @yaml_node.kind of
+ 0 = @yaml_scalar_node
+| 1 = @yaml_mapping_node
+| 2 = @yaml_sequence_node
+| 3 = @yaml_alias_node
+;
+
+@yaml_collection_node = @yaml_mapping_node | @yaml_sequence_node;
+
+@yaml_node_parent = @yaml_collection_node | @file;
+
+yaml_anchors (unique int node: @yaml_node ref,
+ string anchor: string ref);
+
+yaml_aliases (unique int alias: @yaml_alias_node ref,
+ string target: string ref);
+
+yaml_scalars (unique int scalar: @yaml_scalar_node ref,
+ int style: int ref,
+ string value: string ref);
+
+yaml_errors (unique int id: @yaml_error,
+ string message: string ref);
+
+yaml_locations(unique int locatable: @yaml_locatable ref,
+ int location: @location_default ref);
+
+@yaml_locatable = @yaml_node | @yaml_error;
+
+/*- XML Files -*/
+
+xmlEncoding(
+ unique int id: @file ref,
+ string encoding: string ref
+);
+
+xmlDTDs(
+ unique int id: @xmldtd,
+ string root: string ref,
+ string publicId: string ref,
+ string systemId: string ref,
+ int fileid: @file ref
+);
+
+xmlElements(
+ unique int id: @xmlelement,
+ string name: string ref,
+ int parentid: @xmlparent ref,
+ int idx: int ref,
+ int fileid: @file ref
+);
+
+xmlAttrs(
+ unique int id: @xmlattribute,
+ int elementid: @xmlelement ref,
+ string name: string ref,
+ string value: string ref,
+ int idx: int ref,
+ int fileid: @file ref
+);
+
+xmlNs(
+ int id: @xmlnamespace,
+ string prefixName: string ref,
+ string URI: string ref,
+ int fileid: @file ref
+);
+
+xmlHasNs(
+ int elementId: @xmlnamespaceable ref,
+ int nsId: @xmlnamespace ref,
+ int fileid: @file ref
+);
+
+xmlComments(
+ unique int id: @xmlcomment,
+ string text: string ref,
+ int parentid: @xmlparent ref,
+ int fileid: @file ref
+);
+
+xmlChars(
+ unique int id: @xmlcharacters,
+ string text: string ref,
+ int parentid: @xmlparent ref,
+ int idx: int ref,
+ int isCDATA: int ref,
+ int fileid: @file ref
+);
+
+@xmlparent = @file | @xmlelement;
+@xmlnamespaceable = @xmlelement | @xmlattribute;
+
+xmllocations(
+ int xmlElement: @xmllocatable ref,
+ int location: @location_default ref
+);
+
+@xmllocatable = @xmlcharacters | @xmlelement | @xmlcomment | @xmlattribute | @xmldtd | @file | @xmlnamespace;
+
+/*- Configuration files with key value pairs -*/
+
+configs(
+ unique int id: @config
+);
+
+configNames(
+ unique int id: @configName,
+ int config: @config ref,
+ string name: string ref
+);
+
+configValues(
+ unique int id: @configValue,
+ int config: @config ref,
+ string value: string ref
+);
+
+configLocations(
+ int locatable: @configLocatable ref,
+ int location: @location_default ref
+);
+
+@configLocatable = @config | @configName | @configValue;
diff --git a/javascript/ql/lib/upgrades/5b5db607d20c7b449cef2d1c926b24d77c69bebb/semmlecode.javascript.dbscheme b/javascript/ql/lib/upgrades/5b5db607d20c7b449cef2d1c926b24d77c69bebb/semmlecode.javascript.dbscheme
new file mode 100644
index 00000000000..ccefb5e2d49
--- /dev/null
+++ b/javascript/ql/lib/upgrades/5b5db607d20c7b449cef2d1c926b24d77c69bebb/semmlecode.javascript.dbscheme
@@ -0,0 +1,1194 @@
+/*** Standard fragments ***/
+
+/*- Files and folders -*/
+
+/**
+ * The location of an element.
+ * The location spans column `startcolumn` of line `startline` to
+ * column `endcolumn` of line `endline` in file `file`.
+ * For more information, see
+ * [Locations](https://codeql.github.com/docs/writing-codeql-queries/providing-locations-in-codeql-queries/).
+ */
+locations_default(
+ unique int id: @location_default,
+ int file: @file ref,
+ int beginLine: int ref,
+ int beginColumn: int ref,
+ int endLine: int ref,
+ int endColumn: int ref
+);
+
+files(
+ unique int id: @file,
+ string name: string ref
+);
+
+folders(
+ unique int id: @folder,
+ string name: string ref
+);
+
+@container = @file | @folder
+
+containerparent(
+ int parent: @container ref,
+ unique int child: @container ref
+);
+
+/*- Lines of code -*/
+
+numlines(
+ int element_id: @sourceline ref,
+ int num_lines: int ref,
+ int num_code: int ref,
+ int num_comment: int ref
+);
+
+/*- External data -*/
+
+/**
+ * External data, loaded from CSV files during snapshot creation. See
+ * [Tutorial: Incorporating external data](https://help.semmle.com/wiki/display/SD/Tutorial%3A+Incorporating+external+data)
+ * for more information.
+ */
+externalData(
+ int id : @externalDataElement,
+ string path : string ref,
+ int column: int ref,
+ string value : string ref
+);
+
+/*- Source location prefix -*/
+
+/**
+ * The source location of the snapshot.
+ */
+sourceLocationPrefix(string prefix : string ref);
+
+/*- JavaScript-specific part -*/
+
+@location = @location_default
+
+@sourceline = @locatable;
+
+filetype(
+ int file: @file ref,
+ string filetype: string ref
+)
+
+// top-level code fragments
+toplevels (unique int id: @toplevel,
+ int kind: int ref);
+
+is_externs (int toplevel: @toplevel ref);
+
+case @toplevel.kind of
+ 0 = @script
+| 1 = @inline_script
+| 2 = @event_handler
+| 3 = @javascript_url
+| 4 = @template_toplevel;
+
+is_module (int tl: @toplevel ref);
+is_nodejs (int tl: @toplevel ref);
+is_es2015_module (int tl: @toplevel ref);
+is_closure_module (int tl: @toplevel ref);
+
+@xml_node_with_code = @xmlelement | @xmlattribute | @template_placeholder_tag;
+toplevel_parent_xml_node(
+ unique int toplevel: @toplevel ref,
+ int xmlnode: @xml_node_with_code ref);
+
+xml_element_parent_expression(
+ unique int xmlnode: @xmlelement ref,
+ int expression: @expr ref,
+ int index: int ref);
+
+// statements
+#keyset[parent, idx]
+stmts (unique int id: @stmt,
+ int kind: int ref,
+ int parent: @stmt_parent ref,
+ int idx: int ref,
+ varchar(900) tostring: string ref);
+
+stmt_containers (unique int stmt: @stmt ref,
+ int container: @stmt_container ref);
+
+jump_targets (unique int jump: @stmt ref,
+ int target: @stmt ref);
+
+@stmt_parent = @stmt | @toplevel | @function_expr | @arrow_function_expr | @static_initializer;
+@stmt_container = @toplevel | @function | @namespace_declaration | @external_module_declaration | @global_augmentation_declaration;
+
+case @stmt.kind of
+ 0 = @empty_stmt
+| 1 = @block_stmt
+| 2 = @expr_stmt
+| 3 = @if_stmt
+| 4 = @labeled_stmt
+| 5 = @break_stmt
+| 6 = @continue_stmt
+| 7 = @with_stmt
+| 8 = @switch_stmt
+| 9 = @return_stmt
+| 10 = @throw_stmt
+| 11 = @try_stmt
+| 12 = @while_stmt
+| 13 = @do_while_stmt
+| 14 = @for_stmt
+| 15 = @for_in_stmt
+| 16 = @debugger_stmt
+| 17 = @function_decl_stmt
+| 18 = @var_decl_stmt
+| 19 = @case
+| 20 = @catch_clause
+| 21 = @for_of_stmt
+| 22 = @const_decl_stmt
+| 23 = @let_stmt
+| 24 = @legacy_let_stmt
+| 25 = @for_each_stmt
+| 26 = @class_decl_stmt
+| 27 = @import_declaration
+| 28 = @export_all_declaration
+| 29 = @export_default_declaration
+| 30 = @export_named_declaration
+| 31 = @namespace_declaration
+| 32 = @import_equals_declaration
+| 33 = @export_assign_declaration
+| 34 = @interface_declaration
+| 35 = @type_alias_declaration
+| 36 = @enum_declaration
+| 37 = @external_module_declaration
+| 38 = @export_as_namespace_declaration
+| 39 = @global_augmentation_declaration
+| 40 = @using_decl_stmt
+;
+
+@decl_stmt = @var_decl_stmt | @const_decl_stmt | @let_stmt | @legacy_let_stmt | @using_decl_stmt;
+
+@export_declaration = @export_all_declaration | @export_default_declaration | @export_named_declaration;
+
+@namespace_definition = @namespace_declaration | @enum_declaration;
+@type_definition = @class_definition | @interface_declaration | @enum_declaration | @type_alias_declaration | @enum_member;
+
+is_instantiated(unique int decl: @namespace_declaration ref);
+
+@declarable_node = @decl_stmt | @namespace_declaration | @class_decl_stmt | @function_decl_stmt | @enum_declaration | @external_module_declaration | @global_augmentation_declaration | @field;
+has_declare_keyword(unique int stmt: @declarable_node ref);
+
+is_for_await_of(unique int forof: @for_of_stmt ref);
+
+// expressions
+#keyset[parent, idx]
+exprs (unique int id: @expr,
+ int kind: int ref,
+ int parent: @expr_parent ref,
+ int idx: int ref,
+ varchar(900) tostring: string ref);
+
+literals (varchar(900) value: string ref,
+ varchar(900) raw: string ref,
+ unique int expr: @expr_or_type ref);
+
+enclosing_stmt (unique int expr: @expr_or_type ref,
+ int stmt: @stmt ref);
+
+expr_containers (unique int expr: @expr_or_type ref,
+ int container: @stmt_container ref);
+
+array_size (unique int ae: @arraylike ref,
+ int sz: int ref);
+
+is_delegating (int yield: @yield_expr ref);
+
+@expr_or_stmt = @expr | @stmt;
+@expr_or_type = @expr | @typeexpr;
+@expr_parent = @expr_or_stmt | @property | @function_typeexpr;
+@arraylike = @array_expr | @array_pattern;
+@type_annotation = @typeexpr | @jsdoc_type_expr;
+@node_in_stmt_container = @cfg_node | @type_annotation | @toplevel;
+
+case @expr.kind of
+ 0 = @label
+| 1 = @null_literal
+| 2 = @boolean_literal
+| 3 = @number_literal
+| 4 = @string_literal
+| 5 = @regexp_literal
+| 6 = @this_expr
+| 7 = @array_expr
+| 8 = @obj_expr
+| 9 = @function_expr
+| 10 = @seq_expr
+| 11 = @conditional_expr
+| 12 = @new_expr
+| 13 = @call_expr
+| 14 = @dot_expr
+| 15 = @index_expr
+| 16 = @neg_expr
+| 17 = @plus_expr
+| 18 = @log_not_expr
+| 19 = @bit_not_expr
+| 20 = @typeof_expr
+| 21 = @void_expr
+| 22 = @delete_expr
+| 23 = @eq_expr
+| 24 = @neq_expr
+| 25 = @eqq_expr
+| 26 = @neqq_expr
+| 27 = @lt_expr
+| 28 = @le_expr
+| 29 = @gt_expr
+| 30 = @ge_expr
+| 31 = @lshift_expr
+| 32 = @rshift_expr
+| 33 = @urshift_expr
+| 34 = @add_expr
+| 35 = @sub_expr
+| 36 = @mul_expr
+| 37 = @div_expr
+| 38 = @mod_expr
+| 39 = @bitor_expr
+| 40 = @xor_expr
+| 41 = @bitand_expr
+| 42 = @in_expr
+| 43 = @instanceof_expr
+| 44 = @logand_expr
+| 45 = @logor_expr
+| 47 = @assign_expr
+| 48 = @assign_add_expr
+| 49 = @assign_sub_expr
+| 50 = @assign_mul_expr
+| 51 = @assign_div_expr
+| 52 = @assign_mod_expr
+| 53 = @assign_lshift_expr
+| 54 = @assign_rshift_expr
+| 55 = @assign_urshift_expr
+| 56 = @assign_or_expr
+| 57 = @assign_xor_expr
+| 58 = @assign_and_expr
+| 59 = @preinc_expr
+| 60 = @postinc_expr
+| 61 = @predec_expr
+| 62 = @postdec_expr
+| 63 = @par_expr
+| 64 = @var_declarator
+| 65 = @arrow_function_expr
+| 66 = @spread_element
+| 67 = @array_pattern
+| 68 = @object_pattern
+| 69 = @yield_expr
+| 70 = @tagged_template_expr
+| 71 = @template_literal
+| 72 = @template_element
+| 73 = @array_comprehension_expr
+| 74 = @generator_expr
+| 75 = @for_in_comprehension_block
+| 76 = @for_of_comprehension_block
+| 77 = @legacy_letexpr
+| 78 = @var_decl
+| 79 = @proper_varaccess
+| 80 = @class_expr
+| 81 = @super_expr
+| 82 = @newtarget_expr
+| 83 = @named_import_specifier
+| 84 = @import_default_specifier
+| 85 = @import_namespace_specifier
+| 86 = @named_export_specifier
+| 87 = @exp_expr
+| 88 = @assign_exp_expr
+| 89 = @jsx_element
+| 90 = @jsx_qualified_name
+| 91 = @jsx_empty_expr
+| 92 = @await_expr
+| 93 = @function_sent_expr
+| 94 = @decorator
+| 95 = @export_default_specifier
+| 96 = @export_namespace_specifier
+| 97 = @bind_expr
+| 98 = @external_module_reference
+| 99 = @dynamic_import
+| 100 = @expression_with_type_arguments
+| 101 = @prefix_type_assertion
+| 102 = @as_type_assertion
+| 103 = @export_varaccess
+| 104 = @decorator_list
+| 105 = @non_null_assertion
+| 106 = @bigint_literal
+| 107 = @nullishcoalescing_expr
+| 108 = @e4x_xml_anyname
+| 109 = @e4x_xml_static_attribute_selector
+| 110 = @e4x_xml_dynamic_attribute_selector
+| 111 = @e4x_xml_filter_expression
+| 112 = @e4x_xml_static_qualident
+| 113 = @e4x_xml_dynamic_qualident
+| 114 = @e4x_xml_dotdotexpr
+| 115 = @import_meta_expr
+| 116 = @assignlogandexpr
+| 117 = @assignlogorexpr
+| 118 = @assignnullishcoalescingexpr
+| 119 = @template_pipe_ref
+| 120 = @generated_code_expr
+| 121 = @satisfies_expr
+;
+
+@varaccess = @proper_varaccess | @export_varaccess;
+@varref = @var_decl | @varaccess;
+
+@identifier = @label | @varref | @type_identifier;
+
+@literal = @null_literal | @boolean_literal | @number_literal | @string_literal | @regexp_literal | @bigint_literal;
+
+@propaccess = @dot_expr | @index_expr;
+
+@invokeexpr = @new_expr | @call_expr;
+
+@unaryexpr = @neg_expr | @plus_expr | @log_not_expr | @bit_not_expr | @typeof_expr | @void_expr | @delete_expr | @spread_element;
+
+@equality_test = @eq_expr | @neq_expr | @eqq_expr | @neqq_expr;
+
+@comparison = @equality_test | @lt_expr | @le_expr | @gt_expr | @ge_expr;
+
+@binaryexpr = @comparison | @lshift_expr | @rshift_expr | @urshift_expr | @add_expr | @sub_expr | @mul_expr | @div_expr | @mod_expr | @exp_expr | @bitor_expr | @xor_expr | @bitand_expr | @in_expr | @instanceof_expr | @logand_expr | @logor_expr | @nullishcoalescing_expr;
+
+@assignment = @assign_expr | @assign_add_expr | @assign_sub_expr | @assign_mul_expr | @assign_div_expr | @assign_mod_expr | @assign_exp_expr | @assign_lshift_expr | @assign_rshift_expr | @assign_urshift_expr | @assign_or_expr | @assign_xor_expr | @assign_and_expr | @assignlogandexpr | @assignlogorexpr | @assignnullishcoalescingexpr;
+
+@updateexpr = @preinc_expr | @postinc_expr | @predec_expr | @postdec_expr;
+
+@pattern = @varref | @array_pattern | @object_pattern;
+
+@comprehension_expr = @array_comprehension_expr | @generator_expr;
+
+@comprehension_block = @for_in_comprehension_block | @for_of_comprehension_block;
+
+@import_specifier = @named_import_specifier | @import_default_specifier | @import_namespace_specifier;
+
+@exportspecifier = @named_export_specifier | @export_default_specifier | @export_namespace_specifier;
+
+@type_keyword_operand = @import_declaration | @export_declaration | @import_specifier;
+
+@type_assertion = @as_type_assertion | @prefix_type_assertion;
+
+@class_definition = @class_decl_stmt | @class_expr;
+@interface_definition = @interface_declaration | @interface_typeexpr;
+@class_or_interface = @class_definition | @interface_definition;
+
+@lexical_decl = @var_decl | @type_decl;
+@lexical_access = @varaccess | @local_type_access | @local_var_type_access | @local_namespace_access;
+@lexical_ref = @lexical_decl | @lexical_access;
+
+@e4x_xml_attribute_selector = @e4x_xml_static_attribute_selector | @e4x_xml_dynamic_attribute_selector;
+@e4x_xml_qualident = @e4x_xml_static_qualident | @e4x_xml_dynamic_qualident;
+
+expr_contains_template_tag_location(
+ int expr: @expr ref,
+ int location: @location ref
+);
+
+@template_placeholder_tag_parent = @xmlelement | @xmlattribute | @file;
+
+template_placeholder_tag_info(
+ unique int node: @template_placeholder_tag,
+ int parentNode: @template_placeholder_tag_parent ref,
+ varchar(900) raw: string ref
+);
+
+// scopes
+scopes (unique int id: @scope,
+ int kind: int ref);
+
+case @scope.kind of
+ 0 = @global_scope
+| 1 = @function_scope
+| 2 = @catch_scope
+| 3 = @module_scope
+| 4 = @block_scope
+| 5 = @for_scope
+| 6 = @for_in_scope // for-of scopes work the same as for-in scopes
+| 7 = @comprehension_block_scope
+| 8 = @class_expr_scope
+| 9 = @namespace_scope
+| 10 = @class_decl_scope
+| 11 = @interface_scope
+| 12 = @type_alias_scope
+| 13 = @mapped_type_scope
+| 14 = @enum_scope
+| 15 = @external_module_scope
+| 16 = @conditional_type_scope;
+
+scopenodes (unique int node: @ast_node ref,
+ int scope: @scope ref);
+
+scopenesting (unique int inner: @scope ref,
+ int outer: @scope ref);
+
+// functions
+@function = @function_decl_stmt | @function_expr | @arrow_function_expr;
+
+@parameterized = @function | @catch_clause;
+@type_parameterized = @function | @class_or_interface | @type_alias_declaration | @mapped_typeexpr | @infer_typeexpr;
+
+is_generator (int fun: @function ref);
+has_rest_parameter (int fun: @function ref);
+is_async (int fun: @function ref);
+
+// variables and lexically scoped type names
+#keyset[scope, name]
+variables (unique int id: @variable,
+ varchar(900) name: string ref,
+ int scope: @scope ref);
+
+#keyset[scope, name]
+local_type_names (unique int id: @local_type_name,
+ varchar(900) name: string ref,
+ int scope: @scope ref);
+
+#keyset[scope, name]
+local_namespace_names (unique int id: @local_namespace_name,
+ varchar(900) name: string ref,
+ int scope: @scope ref);
+
+is_arguments_object (int id: @variable ref);
+
+@lexical_name = @variable | @local_type_name | @local_namespace_name;
+
+@bind_id = @varaccess | @local_var_type_access;
+bind (unique int id: @bind_id ref,
+ int decl: @variable ref);
+
+decl (unique int id: @var_decl ref,
+ int decl: @variable ref);
+
+@typebind_id = @local_type_access | @export_varaccess;
+typebind (unique int id: @typebind_id ref,
+ int decl: @local_type_name ref);
+
+@typedecl_id = @type_decl | @var_decl;
+typedecl (unique int id: @typedecl_id ref,
+ int decl: @local_type_name ref);
+
+namespacedecl (unique int id: @var_decl ref,
+ int decl: @local_namespace_name ref);
+
+@namespacebind_id = @local_namespace_access | @export_varaccess;
+namespacebind (unique int id: @namespacebind_id ref,
+ int decl: @local_namespace_name ref);
+
+
+// properties in object literals, property patterns in object patterns, and method declarations in classes
+#keyset[parent, index]
+properties (unique int id: @property,
+ int parent: @property_parent ref,
+ int index: int ref,
+ int kind: int ref,
+ varchar(900) tostring: string ref);
+
+case @property.kind of
+ 0 = @value_property
+| 1 = @property_getter
+| 2 = @property_setter
+| 3 = @jsx_attribute
+| 4 = @function_call_signature
+| 5 = @constructor_call_signature
+| 6 = @index_signature
+| 7 = @enum_member
+| 8 = @proper_field
+| 9 = @parameter_field
+| 10 = @static_initializer
+;
+
+@property_parent = @obj_expr | @object_pattern | @class_definition | @jsx_element | @interface_definition | @enum_declaration;
+@property_accessor = @property_getter | @property_setter;
+@call_signature = @function_call_signature | @constructor_call_signature;
+@field = @proper_field | @parameter_field;
+@field_or_vardeclarator = @field | @var_declarator;
+
+is_computed (int id: @property ref);
+is_method (int id: @property ref);
+is_static (int id: @property ref);
+is_abstract_member (int id: @property ref);
+is_const_enum (int id: @enum_declaration ref);
+is_abstract_class (int id: @class_decl_stmt ref);
+
+has_public_keyword (int id: @property ref);
+has_private_keyword (int id: @property ref);
+has_protected_keyword (int id: @property ref);
+has_readonly_keyword (int id: @property ref);
+has_type_keyword (int id: @type_keyword_operand ref);
+is_optional_member (int id: @property ref);
+has_definite_assignment_assertion (int id: @field_or_vardeclarator ref);
+is_optional_parameter_declaration (unique int parameter: @pattern ref);
+
+#keyset[constructor, param_index]
+parameter_fields(
+ unique int field: @parameter_field ref,
+ int constructor: @function_expr ref,
+ int param_index: int ref
+);
+
+// types
+#keyset[parent, idx]
+typeexprs (
+ unique int id: @typeexpr,
+ int kind: int ref,
+ int parent: @typeexpr_parent ref,
+ int idx: int ref,
+ varchar(900) tostring: string ref
+);
+
+case @typeexpr.kind of
+ 0 = @local_type_access
+| 1 = @type_decl
+| 2 = @keyword_typeexpr
+| 3 = @string_literal_typeexpr
+| 4 = @number_literal_typeexpr
+| 5 = @boolean_literal_typeexpr
+| 6 = @array_typeexpr
+| 7 = @union_typeexpr
+| 8 = @indexed_access_typeexpr
+| 9 = @intersection_typeexpr
+| 10 = @parenthesized_typeexpr
+| 11 = @tuple_typeexpr
+| 12 = @keyof_typeexpr
+| 13 = @qualified_type_access
+| 14 = @generic_typeexpr
+| 15 = @type_label
+| 16 = @typeof_typeexpr
+| 17 = @local_var_type_access
+| 18 = @qualified_var_type_access
+| 19 = @this_var_type_access
+| 20 = @predicate_typeexpr
+| 21 = @interface_typeexpr
+| 22 = @type_parameter
+| 23 = @plain_function_typeexpr
+| 24 = @constructor_typeexpr
+| 25 = @local_namespace_access
+| 26 = @qualified_namespace_access
+| 27 = @mapped_typeexpr
+| 28 = @conditional_typeexpr
+| 29 = @infer_typeexpr
+| 30 = @import_type_access
+| 31 = @import_namespace_access
+| 32 = @import_var_type_access
+| 33 = @optional_typeexpr
+| 34 = @rest_typeexpr
+| 35 = @bigint_literal_typeexpr
+| 36 = @readonly_typeexpr
+| 37 = @template_literal_typeexpr
+;
+
+@typeref = @typeaccess | @type_decl;
+@type_identifier = @type_decl | @local_type_access | @type_label | @local_var_type_access | @local_namespace_access;
+@typeexpr_parent = @expr | @stmt | @property | @typeexpr;
+@literal_typeexpr = @string_literal_typeexpr | @number_literal_typeexpr | @boolean_literal_typeexpr | @bigint_literal_typeexpr;
+@typeaccess = @local_type_access | @qualified_type_access | @import_type_access;
+@vartypeaccess = @local_var_type_access | @qualified_var_type_access | @this_var_type_access | @import_var_type_access;
+@namespace_access = @local_namespace_access | @qualified_namespace_access | @import_namespace_access;
+@import_typeexpr = @import_type_access | @import_namespace_access | @import_var_type_access;
+
+@function_typeexpr = @plain_function_typeexpr | @constructor_typeexpr;
+
+// types
+types (
+ unique int id: @type,
+ int kind: int ref,
+ varchar(900) tostring: string ref
+);
+
+#keyset[parent, idx]
+type_child (
+ int child: @type ref,
+ int parent: @type ref,
+ int idx: int ref
+);
+
+case @type.kind of
+ 0 = @any_type
+| 1 = @string_type
+| 2 = @number_type
+| 3 = @union_type
+| 4 = @true_type
+| 5 = @false_type
+| 6 = @type_reference
+| 7 = @object_type
+| 8 = @canonical_type_variable_type
+| 9 = @typeof_type
+| 10 = @void_type
+| 11 = @undefined_type
+| 12 = @null_type
+| 13 = @never_type
+| 14 = @plain_symbol_type
+| 15 = @unique_symbol_type
+| 16 = @objectkeyword_type
+| 17 = @intersection_type
+| 18 = @tuple_type
+| 19 = @lexical_type_variable_type
+| 20 = @this_type
+| 21 = @number_literal_type
+| 22 = @string_literal_type
+| 23 = @unknown_type
+| 24 = @bigint_type
+| 25 = @bigint_literal_type
+;
+
+@boolean_literal_type = @true_type | @false_type;
+@symbol_type = @plain_symbol_type | @unique_symbol_type;
+@union_or_intersection_type = @union_type | @intersection_type;
+@typevariable_type = @canonical_type_variable_type | @lexical_type_variable_type;
+
+has_asserts_keyword(int node: @predicate_typeexpr ref);
+
+@typed_ast_node = @expr | @typeexpr | @function;
+ast_node_type(
+ unique int node: @typed_ast_node ref,
+ int typ: @type ref);
+
+declared_function_signature(
+ unique int node: @function ref,
+ int sig: @signature_type ref
+);
+
+invoke_expr_signature(
+ unique int node: @invokeexpr ref,
+ int sig: @signature_type ref
+);
+
+invoke_expr_overload_index(
+ unique int node: @invokeexpr ref,
+ int index: int ref
+);
+
+symbols (
+ unique int id: @symbol,
+ int kind: int ref,
+ varchar(900) name: string ref
+);
+
+symbol_parent (
+ unique int symbol: @symbol ref,
+ int parent: @symbol ref
+);
+
+symbol_module (
+ int symbol: @symbol ref,
+ varchar(900) moduleName: string ref
+);
+
+symbol_global (
+ int symbol: @symbol ref,
+ varchar(900) globalName: string ref
+);
+
+case @symbol.kind of
+ 0 = @root_symbol
+| 1 = @member_symbol
+| 2 = @other_symbol
+;
+
+@type_with_symbol = @type_reference | @typevariable_type | @typeof_type | @unique_symbol_type;
+@ast_node_with_symbol = @type_definition | @namespace_definition | @toplevel | @typeaccess | @namespace_access | @var_decl | @function | @invokeexpr | @import_declaration | @external_module_reference | @external_module_declaration;
+
+ast_node_symbol(
+ unique int node: @ast_node_with_symbol ref,
+ int symbol: @symbol ref);
+
+type_symbol(
+ unique int typ: @type_with_symbol ref,
+ int symbol: @symbol ref);
+
+#keyset[typ, name]
+type_property(
+ int typ: @type ref,
+ varchar(900) name: string ref,
+ int propertyType: @type ref);
+
+type_alias(
+ unique int aliasType: @type ref,
+ int underlyingType: @type ref);
+
+@literal_type = @string_literal_type | @number_literal_type | @boolean_literal_type | @bigint_literal_type;
+@type_with_literal_value = @string_literal_type | @number_literal_type | @bigint_literal_type;
+type_literal_value(
+ unique int typ: @type_with_literal_value ref,
+ varchar(900) value: string ref);
+
+signature_types (
+ unique int id: @signature_type,
+ int kind: int ref,
+ varchar(900) tostring: string ref,
+ int type_parameters: int ref,
+ int required_params: int ref
+);
+
+is_abstract_signature(
+ unique int sig: @signature_type ref
+);
+
+signature_rest_parameter(
+ unique int sig: @signature_type ref,
+ int rest_param_arra_type: @type ref
+);
+
+case @signature_type.kind of
+ 0 = @function_signature_type
+| 1 = @constructor_signature_type
+;
+
+#keyset[typ, kind, index]
+type_contains_signature (
+ int typ: @type ref,
+ int kind: int ref, // constructor/call/index
+ int index: int ref, // ordering of overloaded signatures
+ int sig: @signature_type ref
+);
+
+#keyset[parent, index]
+signature_contains_type (
+ int child: @type ref,
+ int parent: @signature_type ref,
+ int index: int ref
+);
+
+#keyset[sig, index]
+signature_parameter_name (
+ int sig: @signature_type ref,
+ int index: int ref,
+ varchar(900) name: string ref
+);
+
+number_index_type (
+ unique int baseType: @type ref,
+ int propertyType: @type ref
+);
+
+string_index_type (
+ unique int baseType: @type ref,
+ int propertyType: @type ref
+);
+
+base_type_names(
+ int typeName: @symbol ref,
+ int baseTypeName: @symbol ref
+);
+
+self_types(
+ int typeName: @symbol ref,
+ int selfType: @type_reference ref
+);
+
+tuple_type_min_length(
+ unique int typ: @type ref,
+ int minLength: int ref
+);
+
+tuple_type_rest_index(
+ unique int typ: @type ref,
+ int index: int ref
+);
+
+// comments
+comments (unique int id: @comment,
+ int kind: int ref,
+ int toplevel: @toplevel ref,
+ varchar(900) text: string ref,
+ varchar(900) tostring: string ref);
+
+case @comment.kind of
+ 0 = @slashslash_comment
+| 1 = @slashstar_comment
+| 2 = @doc_comment
+| 3 = @html_comment_start
+| 4 = @htmlcommentend;
+
+@html_comment = @html_comment_start | @htmlcommentend;
+@line_comment = @slashslash_comment | @html_comment;
+@block_comment = @slashstar_comment | @doc_comment;
+
+// source lines
+lines (unique int id: @line,
+ int toplevel: @toplevel ref,
+ varchar(900) text: string ref,
+ varchar(2) terminator: string ref);
+indentation (int file: @file ref,
+ int lineno: int ref,
+ varchar(1) indentChar: string ref,
+ int indentDepth: int ref);
+
+// JavaScript parse errors
+js_parse_errors (unique int id: @js_parse_error,
+ int toplevel: @toplevel ref,
+ varchar(900) message: string ref,
+ varchar(900) line: string ref);
+
+// regular expressions
+#keyset[parent, idx]
+regexpterm (unique int id: @regexpterm,
+ int kind: int ref,
+ int parent: @regexpparent ref,
+ int idx: int ref,
+ varchar(900) tostring: string ref);
+
+@regexpparent = @regexpterm | @regexp_literal | @string_literal | @add_expr;
+
+case @regexpterm.kind of
+ 0 = @regexp_alt
+| 1 = @regexp_seq
+| 2 = @regexp_caret
+| 3 = @regexp_dollar
+| 4 = @regexp_wordboundary
+| 5 = @regexp_nonwordboundary
+| 6 = @regexp_positive_lookahead
+| 7 = @regexp_negative_lookahead
+| 8 = @regexp_star
+| 9 = @regexp_plus
+| 10 = @regexp_opt
+| 11 = @regexp_range
+| 12 = @regexp_dot
+| 13 = @regexp_group
+| 14 = @regexp_normal_constant
+| 15 = @regexp_hex_escape
+| 16 = @regexp_unicode_escape
+| 17 = @regexp_dec_escape
+| 18 = @regexp_oct_escape
+| 19 = @regexp_ctrl_escape
+| 20 = @regexp_char_class_escape
+| 21 = @regexp_id_escape
+| 22 = @regexp_backref
+| 23 = @regexp_char_class
+| 24 = @regexp_char_range
+| 25 = @regexp_positive_lookbehind
+| 26 = @regexp_negative_lookbehind
+| 27 = @regexp_unicode_property_escape
+| 28 = @regexp_quoted_string
+| 29 = @regexp_intersection
+| 30 = @regexp_subtraction;
+
+regexp_parse_errors (unique int id: @regexp_parse_error,
+ int regexp: @regexpterm ref,
+ varchar(900) message: string ref);
+
+@regexp_quantifier = @regexp_star | @regexp_plus | @regexp_opt | @regexp_range;
+@regexp_escape = @regexp_char_escape | @regexp_char_class_escape | @regexp_unicode_property_escape;
+@regexp_char_escape = @regexp_hex_escape | @regexp_unicode_escape | @regexp_dec_escape | @regexp_oct_escape | @regexp_ctrl_escape | @regexp_id_escape;
+@regexp_constant = @regexp_normal_constant | @regexp_char_escape;
+@regexp_lookahead = @regexp_positive_lookahead | @regexp_negative_lookahead;
+@regexp_lookbehind = @regexp_positive_lookbehind | @regexp_negative_lookbehind;
+@regexp_subpattern = @regexp_lookahead | @regexp_lookbehind;
+@regexp_anchor = @regexp_dollar | @regexp_caret;
+
+is_greedy (int id: @regexp_quantifier ref);
+range_quantifier_lower_bound (unique int id: @regexp_range ref, int lo: int ref);
+range_quantifier_upper_bound (unique int id: @regexp_range ref, int hi: int ref);
+is_capture (unique int id: @regexp_group ref, int number: int ref);
+is_named_capture (unique int id: @regexp_group ref, string name: string ref);
+is_inverted (int id: @regexp_char_class ref);
+regexp_const_value (unique int id: @regexp_constant ref, varchar(1) value: string ref);
+char_class_escape (unique int id: @regexp_char_class_escape ref, varchar(1) value: string ref);
+backref (unique int id: @regexp_backref ref, int value: int ref);
+named_backref (unique int id: @regexp_backref ref, string name: string ref);
+unicode_property_escapename (unique int id: @regexp_unicode_property_escape ref, string name: string ref);
+unicode_property_escapevalue (unique int id: @regexp_unicode_property_escape ref, string value: string ref);
+
+// tokens
+#keyset[toplevel, idx]
+tokeninfo (unique int id: @token,
+ int kind: int ref,
+ int toplevel: @toplevel ref,
+ int idx: int ref,
+ varchar(900) value: string ref);
+
+case @token.kind of
+ 0 = @token_eof
+| 1 = @token_null_literal
+| 2 = @token_boolean_literal
+| 3 = @token_numeric_literal
+| 4 = @token_string_literal
+| 5 = @token_regular_expression
+| 6 = @token_identifier
+| 7 = @token_keyword
+| 8 = @token_punctuator;
+
+// associate comments with the token immediately following them (which may be EOF)
+next_token (int comment: @comment ref, int token: @token ref);
+
+// JSON
+#keyset[parent, idx]
+json (unique int id: @json_value,
+ int kind: int ref,
+ int parent: @json_parent ref,
+ int idx: int ref,
+ varchar(900) tostring: string ref);
+
+json_literals (varchar(900) value: string ref,
+ varchar(900) raw: string ref,
+ unique int expr: @json_value ref);
+
+json_properties (int obj: @json_object ref,
+ varchar(900) property: string ref,
+ int value: @json_value ref);
+
+json_errors (unique int id: @json_parse_error,
+ varchar(900) message: string ref);
+
+json_locations(unique int locatable: @json_locatable ref,
+ int location: @location_default ref);
+
+case @json_value.kind of
+ 0 = @json_null
+| 1 = @json_boolean
+| 2 = @json_number
+| 3 = @json_string
+| 4 = @json_array
+| 5 = @json_object;
+
+@json_parent = @json_object | @json_array | @file;
+
+@json_locatable = @json_value | @json_parse_error;
+
+// locations
+@ast_node = @toplevel | @stmt | @expr | @property | @typeexpr;
+
+@locatable = @file
+ | @ast_node
+ | @comment
+ | @line
+ | @js_parse_error | @regexp_parse_error
+ | @regexpterm
+ | @json_locatable
+ | @token
+ | @cfg_node
+ | @jsdoc | @jsdoc_type_expr | @jsdoc_tag
+ | @yaml_locatable
+ | @xmllocatable
+ | @configLocatable
+ | @template_placeholder_tag;
+
+hasLocation (unique int locatable: @locatable ref,
+ int location: @location ref);
+
+// CFG
+entry_cfg_node (unique int id: @entry_node, int container: @stmt_container ref);
+exit_cfg_node (unique int id: @exit_node, int container: @stmt_container ref);
+guard_node (unique int id: @guard_node, int kind: int ref, int test: @expr ref);
+case @guard_node.kind of
+ 0 = @falsy_guard
+| 1 = @truthy_guard;
+@condition_guard = @falsy_guard | @truthy_guard;
+
+@synthetic_cfg_node = @entry_node | @exit_node | @guard_node;
+@cfg_node = @synthetic_cfg_node | @expr_parent;
+
+successor (int pred: @cfg_node ref, int succ: @cfg_node ref);
+
+// JSDoc comments
+jsdoc (unique int id: @jsdoc, varchar(900) description: string ref, int comment: @comment ref);
+#keyset[parent, idx]
+jsdoc_tags (unique int id: @jsdoc_tag, varchar(900) title: string ref,
+ int parent: @jsdoc ref, int idx: int ref, varchar(900) tostring: string ref);
+jsdoc_tag_descriptions (unique int tag: @jsdoc_tag ref, varchar(900) text: string ref);
+jsdoc_tag_names (unique int tag: @jsdoc_tag ref, varchar(900) text: string ref);
+
+#keyset[parent, idx]
+jsdoc_type_exprs (unique int id: @jsdoc_type_expr,
+ int kind: int ref,
+ int parent: @jsdoc_type_expr_parent ref,
+ int idx: int ref,
+ varchar(900) tostring: string ref);
+case @jsdoc_type_expr.kind of
+ 0 = @jsdoc_any_type_expr
+| 1 = @jsdoc_null_type_expr
+| 2 = @jsdoc_undefined_type_expr
+| 3 = @jsdoc_unknown_type_expr
+| 4 = @jsdoc_void_type_expr
+| 5 = @jsdoc_identifier_type_expr
+| 6 = @jsdoc_applied_type_expr
+| 7 = @jsdoc_nullable_type_expr
+| 8 = @jsdoc_non_nullable_type_expr
+| 9 = @jsdoc_record_type_expr
+| 10 = @jsdoc_array_type_expr
+| 11 = @jsdoc_union_type_expr
+| 12 = @jsdoc_function_type_expr
+| 13 = @jsdoc_optional_type_expr
+| 14 = @jsdoc_rest_type_expr
+| 15 = @jsdoc_qualified_type_expr
+;
+
+#keyset[id, idx]
+jsdoc_record_field_name (int id: @jsdoc_record_type_expr ref, int idx: int ref, varchar(900) name: string ref);
+jsdoc_prefix_qualifier (int id: @jsdoc_type_expr ref);
+jsdoc_has_new_parameter (int fn: @jsdoc_function_type_expr ref);
+
+@jsdoc_type_expr_parent = @jsdoc_type_expr | @jsdoc_tag;
+
+jsdoc_errors (unique int id: @jsdoc_error, int tag: @jsdoc_tag ref, varchar(900) message: string ref, varchar(900) tostring: string ref);
+
+@dataflownode = @expr | @function_decl_stmt | @class_decl_stmt | @namespace_declaration | @enum_declaration | @property;
+
+@optionalchainable = @call_expr | @propaccess;
+
+isOptionalChaining(int id: @optionalchainable ref);
+
+/**
+ * The time taken for the extraction of a file.
+ * This table contains non-deterministic content.
+ *
+ * The sum of the `time` column for each (`file`, `timerKind`) pair
+ * is the total time taken for extraction of `file`. The `extractionPhase`
+ * column provides a granular view of the extraction time of the file.
+ */
+extraction_time(
+ int file : @file ref,
+ // see `com.semmle.js.extractor.ExtractionMetrics.ExtractionPhase`.
+ int extractionPhase: int ref,
+ // 0 for the elapsed CPU time in nanoseconds, 1 for the elapsed wallclock time in nanoseconds
+ int timerKind: int ref,
+ float time: float ref
+)
+
+/**
+* Non-timing related data for the extraction of a single file.
+* This table contains non-deterministic content.
+*/
+extraction_data(
+ int file : @file ref,
+ // the absolute path to the cache file
+ varchar(900) cacheFile: string ref,
+ boolean fromCache: boolean ref,
+ int length: int ref
+)
+
+/*- YAML -*/
+
+#keyset[parent, idx]
+yaml (unique int id: @yaml_node,
+ int kind: int ref,
+ int parent: @yaml_node_parent ref,
+ int idx: int ref,
+ string tag: string ref,
+ string tostring: string ref);
+
+case @yaml_node.kind of
+ 0 = @yaml_scalar_node
+| 1 = @yaml_mapping_node
+| 2 = @yaml_sequence_node
+| 3 = @yaml_alias_node
+;
+
+@yaml_collection_node = @yaml_mapping_node | @yaml_sequence_node;
+
+@yaml_node_parent = @yaml_collection_node | @file;
+
+yaml_anchors (unique int node: @yaml_node ref,
+ string anchor: string ref);
+
+yaml_aliases (unique int alias: @yaml_alias_node ref,
+ string target: string ref);
+
+yaml_scalars (unique int scalar: @yaml_scalar_node ref,
+ int style: int ref,
+ string value: string ref);
+
+yaml_errors (unique int id: @yaml_error,
+ string message: string ref);
+
+yaml_locations(unique int locatable: @yaml_locatable ref,
+ int location: @location_default ref);
+
+@yaml_locatable = @yaml_node | @yaml_error;
+
+/*- XML Files -*/
+
+xmlEncoding(
+ unique int id: @file ref,
+ string encoding: string ref
+);
+
+xmlDTDs(
+ unique int id: @xmldtd,
+ string root: string ref,
+ string publicId: string ref,
+ string systemId: string ref,
+ int fileid: @file ref
+);
+
+xmlElements(
+ unique int id: @xmlelement,
+ string name: string ref,
+ int parentid: @xmlparent ref,
+ int idx: int ref,
+ int fileid: @file ref
+);
+
+xmlAttrs(
+ unique int id: @xmlattribute,
+ int elementid: @xmlelement ref,
+ string name: string ref,
+ string value: string ref,
+ int idx: int ref,
+ int fileid: @file ref
+);
+
+xmlNs(
+ int id: @xmlnamespace,
+ string prefixName: string ref,
+ string URI: string ref,
+ int fileid: @file ref
+);
+
+xmlHasNs(
+ int elementId: @xmlnamespaceable ref,
+ int nsId: @xmlnamespace ref,
+ int fileid: @file ref
+);
+
+xmlComments(
+ unique int id: @xmlcomment,
+ string text: string ref,
+ int parentid: @xmlparent ref,
+ int fileid: @file ref
+);
+
+xmlChars(
+ unique int id: @xmlcharacters,
+ string text: string ref,
+ int parentid: @xmlparent ref,
+ int idx: int ref,
+ int isCDATA: int ref,
+ int fileid: @file ref
+);
+
+@xmlparent = @file | @xmlelement;
+@xmlnamespaceable = @xmlelement | @xmlattribute;
+
+xmllocations(
+ int xmlElement: @xmllocatable ref,
+ int location: @location_default ref
+);
+
+@xmllocatable = @xmlcharacters | @xmlelement | @xmlcomment | @xmlattribute | @xmldtd | @file | @xmlnamespace;
+
+/*- Configuration files with key value pairs -*/
+
+configs(
+ unique int id: @config
+);
+
+configNames(
+ unique int id: @configName,
+ int config: @config ref,
+ string name: string ref
+);
+
+configValues(
+ unique int id: @configValue,
+ int config: @config ref,
+ string value: string ref
+);
+
+configLocations(
+ int locatable: @configLocatable ref,
+ int location: @location_default ref
+);
+
+@configLocatable = @config | @configName | @configValue;
diff --git a/javascript/ql/lib/upgrades/5b5db607d20c7b449cef2d1c926b24d77c69bebb/upgrade.properties b/javascript/ql/lib/upgrades/5b5db607d20c7b449cef2d1c926b24d77c69bebb/upgrade.properties
new file mode 100644
index 00000000000..c26b1e1de09
--- /dev/null
+++ b/javascript/ql/lib/upgrades/5b5db607d20c7b449cef2d1c926b24d77c69bebb/upgrade.properties
@@ -0,0 +1,2 @@
+description: split up qualified names in jsdoc type exprs
+compatibility: partial
diff --git a/javascript/ql/src/codeql-suites/javascript-ccr.qls b/javascript/ql/src/codeql-suites/javascript-code-quality.qls
similarity index 100%
rename from javascript/ql/src/codeql-suites/javascript-ccr.qls
rename to javascript/ql/src/codeql-suites/javascript-code-quality.qls
diff --git a/javascript/ql/test/library-tests/JSDoc/NameResolution/test.expected b/javascript/ql/test/library-tests/JSDoc/NameResolution/test.expected
index 04bbd2a2ce0..97730513195 100644
--- a/javascript/ql/test/library-tests/JSDoc/NameResolution/test.expected
+++ b/javascript/ql/test/library-tests/JSDoc/NameResolution/test.expected
@@ -1,5 +1,10 @@
+| bar.js:5:14:5:14 | x | x |
| bar.js:5:14:5:18 | x.Foo | ns.very.long.namespace.Foo |
+| bar.js:12:14:12:17 | iife | iife |
| bar.js:12:14:12:21 | iife.Foo | IIFE.Foo |
+| closure.js:8:12:8:15 | goog | goog |
+| closure.js:8:12:8:19 | goog.net | goog.net |
| closure.js:8:12:8:28 | goog.net.SomeType | goog.net.SomeType |
+| closure.js:9:12:9:14 | net | net |
| closure.js:9:12:9:23 | net.SomeType | goog.net.SomeType |
| closure.js:10:12:10:19 | SomeType | goog.net.SomeType |
diff --git a/javascript/ql/test/library-tests/JSDoc/Nodes/tests.expected b/javascript/ql/test/library-tests/JSDoc/Nodes/tests.expected
index 32c716421c1..8c243f7a804 100644
--- a/javascript/ql/test/library-tests/JSDoc/Nodes/tests.expected
+++ b/javascript/ql/test/library-tests/JSDoc/Nodes/tests.expected
@@ -278,7 +278,11 @@ test_JSDocTypeExpr
| tst.js:26:14:26:20 | boolean | tst.js:26:5:26:11 | @define | 0 |
| tst.js:31:13:31:19 | boolean | tst.js:31:4:31:10 | @return | 0 |
| tst.js:53:11:53:16 | number | tst.js:53:4:53:8 | @enum | 0 |
+| tst.js:68:14:68:17 | goog | tst.js:68:14:68:20 | goog.ds | 0 |
+| tst.js:68:14:68:20 | goog.ds | tst.js:68:14:68:34 | goog.ds.BasicNodeList | 0 |
| tst.js:68:14:68:34 | goog.ds.BasicNodeList | tst.js:68:4:68:11 | @extends | 0 |
+| tst.js:68:19:68:20 | ds | tst.js:68:14:68:20 | goog.ds | 1 |
+| tst.js:68:22:68:34 | BasicNodeList | tst.js:68:14:68:34 | goog.ds.BasicNodeList | 1 |
| tst.js:95:17:95:21 | Shape | tst.js:95:4:95:14 | @implements | 0 |
| tst.js:110:14:110:18 | Shape | tst.js:110:4:110:11 | @extends | 0 |
| tst.js:134:13:134:18 | Object | tst.js:134:4:134:10 | @return | 0 |
@@ -298,7 +302,9 @@ test_JSDocTypeExpr
| tst.js:216:15:216:29 | (string\|number) | tst.js:216:5:216:12 | @typedef | 0 |
| tst.js:216:16:216:21 | string | tst.js:216:15:216:29 | (string\|number) | 0 |
| tst.js:216:23:216:28 | number | tst.js:216:15:216:29 | (string\|number) | 1 |
+| tst.js:219:13:219:16 | goog | tst.js:219:13:219:27 | goog.NumberLike | 0 |
| tst.js:219:13:219:27 | goog.NumberLike | tst.js:219:5:219:10 | @param | 0 |
+| tst.js:219:18:219:27 | NumberLike | tst.js:219:13:219:27 | goog.NumberLike | 1 |
| tst.js:223:12:223:36 | {myNum: number, myObject} | tst.js:223:5:223:9 | @type | 0 |
| tst.js:223:20:223:25 | number | tst.js:223:12:223:36 | {myNum: number, myObject} | 0 |
| tst.js:226:12:226:17 | number | tst.js:226:12:226:18 | number? | 0 |
@@ -311,10 +317,18 @@ test_JSDocTypeExpr
| tst.js:234:12:234:29 | function (): number | tst.js:234:4:234:9 | @param | 0 |
| tst.js:234:24:234:29 | number | tst.js:234:12:234:29 | function (): number | -1 |
| tst.js:235:12:235:46 | function (this: goog.ui.Menu, string) | tst.js:235:4:235:9 | @param | 0 |
+| tst.js:235:26:235:29 | goog | tst.js:235:26:235:32 | goog.ui | 0 |
+| tst.js:235:26:235:32 | goog.ui | tst.js:235:26:235:37 | goog.ui.Menu | 0 |
| tst.js:235:26:235:37 | goog.ui.Menu | tst.js:235:12:235:46 | function (this: goog.ui.Menu, string) | -2 |
+| tst.js:235:31:235:32 | ui | tst.js:235:26:235:32 | goog.ui | 1 |
+| tst.js:235:34:235:37 | Menu | tst.js:235:26:235:37 | goog.ui.Menu | 1 |
| tst.js:235:40:235:45 | string | tst.js:235:12:235:46 | function (this: goog.ui.Menu, string) | 0 |
| tst.js:236:12:236:45 | function (new: goog.ui.Menu, string) | tst.js:236:4:236:9 | @param | 0 |
+| tst.js:236:25:236:28 | goog | tst.js:236:25:236:31 | goog.ui | 0 |
+| tst.js:236:25:236:31 | goog.ui | tst.js:236:25:236:36 | goog.ui.Menu | 0 |
| tst.js:236:25:236:36 | goog.ui.Menu | tst.js:236:12:236:45 | function (new: goog.ui.Menu, string) | -2 |
+| tst.js:236:30:236:31 | ui | tst.js:236:25:236:31 | goog.ui | 1 |
+| tst.js:236:33:236:36 | Menu | tst.js:236:25:236:36 | goog.ui.Menu | 1 |
| tst.js:236:39:236:44 | string | tst.js:236:12:236:45 | function (new: goog.ui.Menu, string) | 0 |
| tst.js:237:12:237:48 | function (string, ...[number]): number | tst.js:237:4:237:9 | @param | 0 |
| tst.js:237:21:237:26 | string | tst.js:237:12:237:48 | function (string, ...[number]): number | 0 |
diff --git a/javascript/ql/test/library-tests/TypeAnnotations/JSDoc/JSDocTypeAnnotations.expected b/javascript/ql/test/library-tests/TypeAnnotations/JSDoc/JSDocTypeAnnotations.expected
index bacfb98cdc6..8ac3eea2be5 100644
--- a/javascript/ql/test/library-tests/TypeAnnotations/JSDoc/JSDocTypeAnnotations.expected
+++ b/javascript/ql/test/library-tests/TypeAnnotations/JSDoc/JSDocTypeAnnotations.expected
@@ -5,6 +5,8 @@ test_isNumber
test_QualifiedName
| VarType | tst.js:9:13:9:19 | VarType |
| boolean | tst.js:5:14:5:20 | boolean |
+| foo | tst.js:4:12:4:14 | foo |
+| foo.bar | tst.js:4:12:4:18 | foo.bar |
| foo.bar.baz | tst.js:4:12:4:22 | foo.bar.baz |
| number | tst.js:3:12:3:17 | number |
| string | tst.js:2:12:2:17 | string |
diff --git a/javascript/ql/test/library-tests/frameworks/ClientRequests/ClientRequests.expected b/javascript/ql/test/library-tests/frameworks/ClientRequests/ClientRequests.expected
index bb3a7300453..f787a7e6060 100644
--- a/javascript/ql/test/library-tests/frameworks/ClientRequests/ClientRequests.expected
+++ b/javascript/ql/test/library-tests/frameworks/ClientRequests/ClientRequests.expected
@@ -103,6 +103,13 @@ test_ClientRequest
| tst.js:334:5:334:25 | got.pag ... rl, {}) |
| tst.js:337:5:337:20 | jsonClient.get() |
| tst.js:340:5:340:21 | jsonClient2.get() |
+| tst.js:344:5:344:37 | axios.p ... config) |
+| tst.js:345:5:345:28 | axios.p ... , data) |
+| tst.js:346:5:346:36 | axios.p ... config) |
+| tst.js:347:5:347:30 | axios.p ... , data) |
+| tst.js:348:5:348:38 | axios.p ... config) |
+| tst.js:349:5:349:30 | axios.g ... url }) |
+| tst.js:352:5:352:66 | axiosIn ... text"}) |
test_getADataNode
| axiosTest.js:12:5:17:6 | axios({ ... \\n }) | axiosTest.js:15:18:15:55 | { 'Cont ... json' } |
| axiosTest.js:12:5:17:6 | axios({ ... \\n }) | axiosTest.js:16:15:16:35 | {x: 'te ... 'test'} |
@@ -146,6 +153,11 @@ test_getADataNode
| tst.js:257:1:262:2 | form.su ... rs()\\n}) | tst.js:255:25:255:35 | 'new_value' |
| tst.js:286:20:286:55 | new Web ... :8080') | tst.js:288:21:288:35 | 'Hello Server!' |
| tst.js:321:5:321:32 | superag ... st(url) | tst.js:321:39:321:42 | data |
+| tst.js:344:5:344:37 | axios.p ... config) | tst.js:344:25:344:28 | data |
+| tst.js:345:5:345:28 | axios.p ... , data) | tst.js:345:24:345:27 | data |
+| tst.js:346:5:346:36 | axios.p ... config) | tst.js:346:24:346:27 | data |
+| tst.js:347:5:347:30 | axios.p ... , data) | tst.js:347:26:347:29 | data |
+| tst.js:348:5:348:38 | axios.p ... config) | tst.js:348:26:348:29 | data |
test_getHost
| tst.js:87:5:87:39 | http.ge ... host}) | tst.js:87:34:87:37 | host |
| tst.js:89:5:89:23 | axios({host: host}) | tst.js:89:18:89:21 | host |
@@ -268,6 +280,14 @@ test_getUrl
| tst.js:337:5:337:20 | jsonClient.get() | tst.js:336:41:336:43 | url |
| tst.js:340:5:340:21 | jsonClient2.get() | tst.js:339:42:339:44 | url |
| tst.js:340:5:340:21 | jsonClient2.get() | tst.js:339:61:339:63 | url |
+| tst.js:344:5:344:37 | axios.p ... config) | tst.js:344:20:344:22 | url |
+| tst.js:345:5:345:28 | axios.p ... , data) | tst.js:345:19:345:21 | url |
+| tst.js:346:5:346:36 | axios.p ... config) | tst.js:346:19:346:21 | url |
+| tst.js:347:5:347:30 | axios.p ... , data) | tst.js:347:21:347:23 | url |
+| tst.js:348:5:348:38 | axios.p ... config) | tst.js:348:21:348:23 | url |
+| tst.js:349:5:349:30 | axios.g ... url }) | tst.js:349:18:349:29 | { url: url } |
+| tst.js:352:5:352:66 | axiosIn ... text"}) | tst.js:352:19:352:65 | {method ... "text"} |
+| tst.js:352:5:352:66 | axiosIn ... text"}) | tst.js:352:40:352:42 | url |
test_getAResponseDataNode
| axiosTest.js:4:5:7:6 | axios({ ... \\n }) | axiosTest.js:4:5:7:6 | axios({ ... \\n }) | json | true |
| axiosTest.js:12:5:17:6 | axios({ ... \\n }) | axiosTest.js:12:5:17:6 | axios({ ... \\n }) | json | true |
@@ -354,3 +374,10 @@ test_getAResponseDataNode
| tst.js:334:5:334:25 | got.pag ... rl, {}) | tst.js:334:5:334:25 | got.pag ... rl, {}) | text | true |
| tst.js:337:5:337:20 | jsonClient.get() | tst.js:337:5:337:20 | jsonClient.get() | text | true |
| tst.js:340:5:340:21 | jsonClient2.get() | tst.js:340:5:340:21 | jsonClient2.get() | text | true |
+| tst.js:344:5:344:37 | axios.p ... config) | tst.js:344:5:344:37 | axios.p ... config) | json | true |
+| tst.js:345:5:345:28 | axios.p ... , data) | tst.js:345:5:345:28 | axios.p ... , data) | json | true |
+| tst.js:346:5:346:36 | axios.p ... config) | tst.js:346:5:346:36 | axios.p ... config) | json | true |
+| tst.js:347:5:347:30 | axios.p ... , data) | tst.js:347:5:347:30 | axios.p ... , data) | json | true |
+| tst.js:348:5:348:38 | axios.p ... config) | tst.js:348:5:348:38 | axios.p ... config) | json | true |
+| tst.js:349:5:349:30 | axios.g ... url }) | tst.js:349:5:349:30 | axios.g ... url }) | json | true |
+| tst.js:352:5:352:66 | axiosIn ... text"}) | tst.js:352:5:352:66 | axiosIn ... text"}) | text | true |
diff --git a/javascript/ql/test/library-tests/frameworks/ClientRequests/tst.js b/javascript/ql/test/library-tests/frameworks/ClientRequests/tst.js
index c9fc40dc506..3cd086fae0e 100644
--- a/javascript/ql/test/library-tests/frameworks/ClientRequests/tst.js
+++ b/javascript/ql/test/library-tests/frameworks/ClientRequests/tst.js
@@ -339,3 +339,15 @@ function gotTests(url){
const jsonClient2 = got.extend({url: url}).extend({url: url});
jsonClient2.get();
}
+
+function moreAxiosTests(url, data, config){
+ axios.postForm(url, data, config);
+ axios.putForm(url, data);
+ axios.putForm(url, data, config);
+ axios.patchForm(url, data);
+ axios.patchForm(url, data, config);
+ axios.getUri({ url: url });
+
+ const axiosInstance = axios.create({});
+ axiosInstance({method: "get", url: url, responseType: "text"});
+}
diff --git a/javascript/ql/test/library-tests/frameworks/data/guardedRouteHandler.js b/javascript/ql/test/library-tests/frameworks/data/guardedRouteHandler.js
new file mode 100644
index 00000000000..972b8b9f111
--- /dev/null
+++ b/javascript/ql/test/library-tests/frameworks/data/guardedRouteHandler.js
@@ -0,0 +1,21 @@
+const express = require('express');
+const app = express();
+const testlib = require('testlib');
+
+app.get('/before', (req, res) => {
+ sink(req.injectedReqData); // OK [INCONSISTENCY] - happens before middleware
+ sink(req.injectedResData); // OK - wrong parameter
+
+ sink(res.injectedReqData); // OK - wrong parameter
+ sink(res.injectedResData); // OK [INCONSISTENCY] - happens before middleware
+});
+
+app.use(testlib.middleware());
+
+app.get('/after', (req, res) => {
+ sink(req.injectedReqData); // NOT OK
+ sink(req.injectedResData); // OK - wrong parameter
+
+ sink(res.injectedReqData); // OK - wrong parameter
+ sink(res.injectedResData); // NOT OK
+});
diff --git a/javascript/ql/test/library-tests/frameworks/data/test.expected b/javascript/ql/test/library-tests/frameworks/data/test.expected
index 6586eaeff15..0bc1b6b6ee0 100644
--- a/javascript/ql/test/library-tests/frameworks/data/test.expected
+++ b/javascript/ql/test/library-tests/frameworks/data/test.expected
@@ -1,6 +1,10 @@
legacyDataFlowDifference
consistencyIssue
taintFlow
+| guardedRouteHandler.js:6:10:6:28 | req.injectedReqData | guardedRouteHandler.js:6:10:6:28 | req.injectedReqData |
+| guardedRouteHandler.js:10:10:10:28 | res.injectedResData | guardedRouteHandler.js:10:10:10:28 | res.injectedResData |
+| guardedRouteHandler.js:16:10:16:28 | req.injectedReqData | guardedRouteHandler.js:16:10:16:28 | req.injectedReqData |
+| guardedRouteHandler.js:20:10:20:28 | res.injectedResData | guardedRouteHandler.js:20:10:20:28 | res.injectedResData |
| paramDecorator.ts:6:54:6:54 | x | paramDecorator.ts:7:10:7:10 | x |
| test.js:5:30:5:37 | source() | test.js:5:8:5:38 | testlib ... urce()) |
| test.js:6:22:6:29 | source() | test.js:6:8:6:30 | preserv ... urce()) |
diff --git a/javascript/ql/test/library-tests/frameworks/data/test.ext.yml b/javascript/ql/test/library-tests/frameworks/data/test.ext.yml
index b8e12739746..1ac621936a4 100644
--- a/javascript/ql/test/library-tests/frameworks/data/test.ext.yml
+++ b/javascript/ql/test/library-tests/frameworks/data/test.ext.yml
@@ -13,6 +13,8 @@ extensions:
- ['testlib', 'Member[getSourceArray].ReturnValue.ArrayElement', 'test-source']
- ['(testlib)', 'Member[parenthesizedPackageName].ReturnValue', 'test-source']
- ['danger-constant', 'Member[danger]', 'test-source']
+ - ['testlib', 'Member[middleware].ReturnValue.GuardedRouteHandler.Parameter[0].Member[injectedReqData]', 'test-source']
+ - ['testlib', 'Member[middleware].ReturnValue.GuardedRouteHandler.Parameter[1].Member[injectedResData]', 'test-source']
- addsTo:
pack: codeql/javascript-all
diff --git a/javascript/ql/test/library-tests/frameworks/hapi/src/hapihapi.js b/javascript/ql/test/library-tests/frameworks/hapi/src/hapihapi.js
new file mode 100644
index 00000000000..45706b7a940
--- /dev/null
+++ b/javascript/ql/test/library-tests/frameworks/hapi/src/hapihapi.js
@@ -0,0 +1,36 @@
+var server1 = new (require('@hapi/hapi')).Server(); // HTTP::Server
+
+var Hapi = require('@hapi/hapi');
+var server2 = new Hapi.Server(); // HTTP::Server
+
+function handler1(){} // HTTP::RouteHandler
+server2.route({
+ handler: handler1
+});
+
+
+server2.route({
+ handler: function handler2(request, reply){ // HTTP::RouteHandler
+ request.response.header('HEADER1', '') // HTTP::HeaderDefinition
+ }});
+
+server2.ext('onPreResponse', function handler3(request, reply) { // HTTP::RouteHandler
+})
+
+function handler4(request, reply){
+ request.rawPayload;
+ request.payload.foo;
+ request.query.bar;
+ request.url.path;
+ request.headers.baz;
+ request.state.token;
+}
+var route = {handler: handler4};
+server2.route(route);
+
+server2.cache({ segment: 'countries', expiresIn: 60*60*1000 });
+
+function getHandler() {
+ return function (req, h){}
+}
+server2.route({handler: getHandler()});
diff --git a/javascript/ql/test/library-tests/frameworks/hapi/tests.expected b/javascript/ql/test/library-tests/frameworks/hapi/tests.expected
index 4c752ee56a8..730bae77bf9 100644
--- a/javascript/ql/test/library-tests/frameworks/hapi/tests.expected
+++ b/javascript/ql/test/library-tests/frameworks/hapi/tests.expected
@@ -9,6 +9,11 @@ test_RouteSetup
| src/hapiglue.js:17:1:18:2 | server2 ... dler\\n}) |
| src/hapiglue.js:31:1:31:20 | server2.route(route) |
| src/hapiglue.js:38:1:38:38 | server2 ... ler()}) |
+| src/hapihapi.js:7:1:9:2 | server2 ... ler1\\n}) |
+| src/hapihapi.js:12:1:15:7 | server2 ... }}) |
+| src/hapihapi.js:17:1:18:2 | server2 ... dler\\n}) |
+| src/hapihapi.js:29:1:29:20 | server2.route(route) |
+| src/hapihapi.js:36:1:36:38 | server2 ... ler()}) |
test_RequestExpr
| src/hapi.js:13:32:13:38 | request | src/hapi.js:13:14:15:5 | functio ... n\\n } |
| src/hapi.js:13:32:13:38 | request | src/hapi.js:13:14:15:5 | functio ... n\\n } |
@@ -38,12 +43,27 @@ test_RequestExpr
| src/hapiglue.js:27:3:27:9 | request | src/hapiglue.js:20:1:29:1 | functio ... oken;\\n} |
| src/hapiglue.js:28:3:28:9 | request | src/hapiglue.js:20:1:29:1 | functio ... oken;\\n} |
| src/hapiglue.js:36:22:36:24 | req | src/hapiglue.js:36:12:36:33 | functio ... hapi){} |
+| src/hapihapi.js:13:32:13:38 | request | src/hapihapi.js:13:14:15:5 | functio ... n\\n } |
+| src/hapihapi.js:13:32:13:38 | request | src/hapihapi.js:13:14:15:5 | functio ... n\\n } |
+| src/hapihapi.js:14:9:14:15 | request | src/hapihapi.js:13:14:15:5 | functio ... n\\n } |
+| src/hapihapi.js:17:48:17:54 | request | src/hapihapi.js:17:30:18:1 | functio ... ndler\\n} |
+| src/hapihapi.js:20:19:20:25 | request | src/hapihapi.js:20:1:27:1 | functio ... oken;\\n} |
+| src/hapihapi.js:20:19:20:25 | request | src/hapihapi.js:20:1:27:1 | functio ... oken;\\n} |
+| src/hapihapi.js:21:3:21:9 | request | src/hapihapi.js:20:1:27:1 | functio ... oken;\\n} |
+| src/hapihapi.js:22:3:22:9 | request | src/hapihapi.js:20:1:27:1 | functio ... oken;\\n} |
+| src/hapihapi.js:23:3:23:9 | request | src/hapihapi.js:20:1:27:1 | functio ... oken;\\n} |
+| src/hapihapi.js:24:3:24:9 | request | src/hapihapi.js:20:1:27:1 | functio ... oken;\\n} |
+| src/hapihapi.js:25:3:25:9 | request | src/hapihapi.js:20:1:27:1 | functio ... oken;\\n} |
+| src/hapihapi.js:26:3:26:9 | request | src/hapihapi.js:20:1:27:1 | functio ... oken;\\n} |
+| src/hapihapi.js:34:22:34:24 | req | src/hapihapi.js:34:12:34:30 | function (req, h){} |
test_HeaderAccess
| src/hapi.js:25:3:25:21 | request.headers.baz | baz |
| src/hapiglue.js:27:3:27:21 | request.headers.baz | baz |
+| src/hapihapi.js:25:3:25:21 | request.headers.baz | baz |
test_ResponseExpr
| src/hapi.js:14:9:14:24 | request.response | src/hapi.js:13:14:15:5 | functio ... n\\n } |
| src/hapiglue.js:14:9:14:24 | request.response | src/hapiglue.js:13:14:15:5 | functio ... n\\n } |
+| src/hapihapi.js:14:9:14:24 | request.response | src/hapihapi.js:13:14:15:5 | functio ... n\\n } |
test_RouteHandler
| src/hapi.js:6:1:6:21 | functio ... er1(){} | src/hapi.js:4:15:4:31 | new Hapi.Server() |
| src/hapi.js:13:14:15:5 | functio ... n\\n } | src/hapi.js:4:15:4:31 | new Hapi.Server() |
@@ -55,9 +75,15 @@ test_RouteHandler
| src/hapiglue.js:17:30:18:1 | functio ... ndler\\n} | src/hapiglue.js:4:15:4:69 | new Hap ... ptions) |
| src/hapiglue.js:20:1:29:1 | functio ... oken;\\n} | src/hapiglue.js:4:15:4:69 | new Hap ... ptions) |
| src/hapiglue.js:36:12:36:33 | functio ... hapi){} | src/hapiglue.js:4:15:4:69 | new Hap ... ptions) |
+| src/hapihapi.js:6:1:6:21 | functio ... er1(){} | src/hapihapi.js:4:15:4:31 | new Hapi.Server() |
+| src/hapihapi.js:13:14:15:5 | functio ... n\\n } | src/hapihapi.js:4:15:4:31 | new Hapi.Server() |
+| src/hapihapi.js:17:30:18:1 | functio ... ndler\\n} | src/hapihapi.js:4:15:4:31 | new Hapi.Server() |
+| src/hapihapi.js:20:1:27:1 | functio ... oken;\\n} | src/hapihapi.js:4:15:4:31 | new Hapi.Server() |
+| src/hapihapi.js:34:12:34:30 | function (req, h){} | src/hapihapi.js:4:15:4:31 | new Hapi.Server() |
test_HeaderDefinition
| src/hapi.js:14:9:14:46 | request ... 1', '') | src/hapi.js:13:14:15:5 | functio ... n\\n } |
| src/hapiglue.js:14:9:14:46 | request ... 1', '') | src/hapiglue.js:13:14:15:5 | functio ... n\\n } |
+| src/hapihapi.js:14:9:14:46 | request ... 1', '') | src/hapihapi.js:13:14:15:5 | functio ... n\\n } |
test_ServerDefinition
| src/hapi.js:1:15:1:44 | new (re ... erver() |
| src/hapi.js:4:15:4:31 | new Hapi.Server() |
@@ -65,6 +91,8 @@ test_ServerDefinition
| src/hapiglue.js:4:15:4:69 | new Hap ... ptions) |
| src/hapiglue.js:43:19:43:24 | server |
| src/hapiglue.js:44:45:44:51 | server_ |
+| src/hapihapi.js:1:15:1:50 | new (re ... erver() |
+| src/hapihapi.js:4:15:4:31 | new Hapi.Server() |
test_RequestInputAccess
| src/hapi.js:21:3:21:20 | request.rawPayload | body | src/hapi.js:20:1:27:1 | functio ... oken;\\n} |
| src/hapi.js:22:3:22:21 | request.payload.foo | body | src/hapi.js:20:1:27:1 | functio ... oken;\\n} |
@@ -80,6 +108,12 @@ test_RequestInputAccess
| src/hapiglue.js:26:3:26:20 | request.url.origin | url | src/hapiglue.js:20:1:29:1 | functio ... oken;\\n} |
| src/hapiglue.js:27:3:27:21 | request.headers.baz | header | src/hapiglue.js:20:1:29:1 | functio ... oken;\\n} |
| src/hapiglue.js:28:3:28:21 | request.state.token | cookie | src/hapiglue.js:20:1:29:1 | functio ... oken;\\n} |
+| src/hapihapi.js:21:3:21:20 | request.rawPayload | body | src/hapihapi.js:20:1:27:1 | functio ... oken;\\n} |
+| src/hapihapi.js:22:3:22:21 | request.payload.foo | body | src/hapihapi.js:20:1:27:1 | functio ... oken;\\n} |
+| src/hapihapi.js:23:3:23:19 | request.query.bar | parameter | src/hapihapi.js:20:1:27:1 | functio ... oken;\\n} |
+| src/hapihapi.js:24:3:24:18 | request.url.path | url | src/hapihapi.js:20:1:27:1 | functio ... oken;\\n} |
+| src/hapihapi.js:25:3:25:21 | request.headers.baz | header | src/hapihapi.js:20:1:27:1 | functio ... oken;\\n} |
+| src/hapihapi.js:26:3:26:21 | request.state.token | cookie | src/hapihapi.js:20:1:27:1 | functio ... oken;\\n} |
test_RouteSetup_getServer
| src/hapi.js:7:1:9:2 | server2 ... ler1\\n}) | src/hapi.js:4:15:4:31 | new Hapi.Server() |
| src/hapi.js:12:1:15:7 | server2 ... }}) | src/hapi.js:4:15:4:31 | new Hapi.Server() |
@@ -91,9 +125,15 @@ test_RouteSetup_getServer
| src/hapiglue.js:17:1:18:2 | server2 ... dler\\n}) | src/hapiglue.js:4:15:4:69 | new Hap ... ptions) |
| src/hapiglue.js:31:1:31:20 | server2.route(route) | src/hapiglue.js:4:15:4:69 | new Hap ... ptions) |
| src/hapiglue.js:38:1:38:38 | server2 ... ler()}) | src/hapiglue.js:4:15:4:69 | new Hap ... ptions) |
+| src/hapihapi.js:7:1:9:2 | server2 ... ler1\\n}) | src/hapihapi.js:4:15:4:31 | new Hapi.Server() |
+| src/hapihapi.js:12:1:15:7 | server2 ... }}) | src/hapihapi.js:4:15:4:31 | new Hapi.Server() |
+| src/hapihapi.js:17:1:18:2 | server2 ... dler\\n}) | src/hapihapi.js:4:15:4:31 | new Hapi.Server() |
+| src/hapihapi.js:29:1:29:20 | server2.route(route) | src/hapihapi.js:4:15:4:31 | new Hapi.Server() |
+| src/hapihapi.js:36:1:36:38 | server2 ... ler()}) | src/hapihapi.js:4:15:4:31 | new Hapi.Server() |
test_HeaderDefinition_defines
| src/hapi.js:14:9:14:46 | request ... 1', '') | header1 | |
| src/hapiglue.js:14:9:14:46 | request ... 1', '') | header1 | |
+| src/hapihapi.js:14:9:14:46 | request ... 1', '') | header1 | |
test_RouteSetup_getARouteHandler
| src/hapi.js:7:1:9:2 | server2 ... ler1\\n}) | src/hapi.js:6:1:6:21 | functio ... er1(){} |
| src/hapi.js:12:1:15:7 | server2 ... }}) | src/hapi.js:13:14:15:5 | functio ... n\\n } |
@@ -109,6 +149,13 @@ test_RouteSetup_getARouteHandler
| src/hapiglue.js:38:1:38:38 | server2 ... ler()}) | src/hapiglue.js:35:1:37:1 | return of function getHandler |
| src/hapiglue.js:38:1:38:38 | server2 ... ler()}) | src/hapiglue.js:36:12:36:33 | functio ... hapi){} |
| src/hapiglue.js:38:1:38:38 | server2 ... ler()}) | src/hapiglue.js:38:25:38:36 | getHandler() |
+| src/hapihapi.js:7:1:9:2 | server2 ... ler1\\n}) | src/hapihapi.js:6:1:6:21 | functio ... er1(){} |
+| src/hapihapi.js:12:1:15:7 | server2 ... }}) | src/hapihapi.js:13:14:15:5 | functio ... n\\n } |
+| src/hapihapi.js:17:1:18:2 | server2 ... dler\\n}) | src/hapihapi.js:17:30:18:1 | functio ... ndler\\n} |
+| src/hapihapi.js:29:1:29:20 | server2.route(route) | src/hapihapi.js:20:1:27:1 | functio ... oken;\\n} |
+| src/hapihapi.js:36:1:36:38 | server2 ... ler()}) | src/hapihapi.js:33:1:35:1 | return of function getHandler |
+| src/hapihapi.js:36:1:36:38 | server2 ... ler()}) | src/hapihapi.js:34:12:34:30 | function (req, h){} |
+| src/hapihapi.js:36:1:36:38 | server2 ... ler()}) | src/hapihapi.js:36:25:36:36 | getHandler() |
test_RouteHandler_getARequestExpr
| src/hapi.js:13:14:15:5 | functio ... n\\n } | src/hapi.js:13:32:13:38 | request |
| src/hapi.js:13:14:15:5 | functio ... n\\n } | src/hapi.js:13:32:13:38 | request |
@@ -138,9 +185,24 @@ test_RouteHandler_getARequestExpr
| src/hapiglue.js:20:1:29:1 | functio ... oken;\\n} | src/hapiglue.js:27:3:27:9 | request |
| src/hapiglue.js:20:1:29:1 | functio ... oken;\\n} | src/hapiglue.js:28:3:28:9 | request |
| src/hapiglue.js:36:12:36:33 | functio ... hapi){} | src/hapiglue.js:36:22:36:24 | req |
+| src/hapihapi.js:13:14:15:5 | functio ... n\\n } | src/hapihapi.js:13:32:13:38 | request |
+| src/hapihapi.js:13:14:15:5 | functio ... n\\n } | src/hapihapi.js:13:32:13:38 | request |
+| src/hapihapi.js:13:14:15:5 | functio ... n\\n } | src/hapihapi.js:14:9:14:15 | request |
+| src/hapihapi.js:17:30:18:1 | functio ... ndler\\n} | src/hapihapi.js:17:48:17:54 | request |
+| src/hapihapi.js:20:1:27:1 | functio ... oken;\\n} | src/hapihapi.js:20:19:20:25 | request |
+| src/hapihapi.js:20:1:27:1 | functio ... oken;\\n} | src/hapihapi.js:20:19:20:25 | request |
+| src/hapihapi.js:20:1:27:1 | functio ... oken;\\n} | src/hapihapi.js:21:3:21:9 | request |
+| src/hapihapi.js:20:1:27:1 | functio ... oken;\\n} | src/hapihapi.js:22:3:22:9 | request |
+| src/hapihapi.js:20:1:27:1 | functio ... oken;\\n} | src/hapihapi.js:23:3:23:9 | request |
+| src/hapihapi.js:20:1:27:1 | functio ... oken;\\n} | src/hapihapi.js:24:3:24:9 | request |
+| src/hapihapi.js:20:1:27:1 | functio ... oken;\\n} | src/hapihapi.js:25:3:25:9 | request |
+| src/hapihapi.js:20:1:27:1 | functio ... oken;\\n} | src/hapihapi.js:26:3:26:9 | request |
+| src/hapihapi.js:34:12:34:30 | function (req, h){} | src/hapihapi.js:34:22:34:24 | req |
test_HeaderDefinition_getAHeaderName
| src/hapi.js:14:9:14:46 | request ... 1', '') | header1 |
| src/hapiglue.js:14:9:14:46 | request ... 1', '') | header1 |
+| src/hapihapi.js:14:9:14:46 | request ... 1', '') | header1 |
test_RouteHandler_getAResponseHeader
| src/hapi.js:13:14:15:5 | functio ... n\\n } | header1 | src/hapi.js:14:9:14:46 | request ... 1', '') |
| src/hapiglue.js:13:14:15:5 | functio ... n\\n } | header1 | src/hapiglue.js:14:9:14:46 | request ... 1', '') |
+| src/hapihapi.js:13:14:15:5 | functio ... n\\n } | header1 | src/hapihapi.js:14:9:14:46 | request ... 1', '') |
diff --git a/javascript/ql/test/query-tests/Security/CWE-022/TaintedPath/TaintedPath.expected b/javascript/ql/test/query-tests/Security/CWE-022/TaintedPath/TaintedPath.expected
index 17c3e12dedd..db9c0b11a35 100644
--- a/javascript/ql/test/query-tests/Security/CWE-022/TaintedPath/TaintedPath.expected
+++ b/javascript/ql/test/query-tests/Security/CWE-022/TaintedPath/TaintedPath.expected
@@ -51,6 +51,7 @@
| express.js:8:20:8:32 | req.query.bar | express.js:8:20:8:32 | req.query.bar | express.js:8:20:8:32 | req.query.bar | This path depends on a $@. | express.js:8:20:8:32 | req.query.bar | user-provided value |
| handlebars.js:11:32:11:39 | filePath | handlebars.js:29:46:29:60 | req.params.path | handlebars.js:11:32:11:39 | filePath | This path depends on a $@. | handlebars.js:29:46:29:60 | req.params.path | user-provided value |
| handlebars.js:15:25:15:32 | filePath | handlebars.js:43:15:43:29 | req.params.path | handlebars.js:15:25:15:32 | filePath | This path depends on a $@. | handlebars.js:43:15:43:29 | req.params.path | user-provided value |
+| hapi.js:15:44:15:51 | filepath | hapi.js:14:30:14:51 | request ... ilepath | hapi.js:15:44:15:51 | filepath | This path depends on a $@. | hapi.js:14:30:14:51 | request ... ilepath | user-provided value |
| normalizedPaths.js:13:19:13:22 | path | normalizedPaths.js:11:14:11:27 | req.query.path | normalizedPaths.js:13:19:13:22 | path | This path depends on a $@. | normalizedPaths.js:11:14:11:27 | req.query.path | user-provided value |
| normalizedPaths.js:14:19:14:29 | './' + path | normalizedPaths.js:11:14:11:27 | req.query.path | normalizedPaths.js:14:19:14:29 | './' + path | This path depends on a $@. | normalizedPaths.js:11:14:11:27 | req.query.path | user-provided value |
| normalizedPaths.js:15:19:15:38 | path + '/index.html' | normalizedPaths.js:11:14:11:27 | req.query.path | normalizedPaths.js:15:19:15:38 | path + '/index.html' | This path depends on a $@. | normalizedPaths.js:11:14:11:27 | req.query.path | user-provided value |
@@ -344,6 +345,8 @@ edges
| handlebars.js:13:73:13:80 | filePath | handlebars.js:15:25:15:32 | filePath | provenance | |
| handlebars.js:29:46:29:60 | req.params.path | handlebars.js:10:51:10:58 | filePath | provenance | |
| handlebars.js:43:15:43:29 | req.params.path | handlebars.js:13:73:13:80 | filePath | provenance | |
+| hapi.js:14:19:14:51 | filepath | hapi.js:15:44:15:51 | filepath | provenance | |
+| hapi.js:14:30:14:51 | request ... ilepath | hapi.js:14:19:14:51 | filepath | provenance | |
| normalizedPaths.js:11:7:11:27 | path | normalizedPaths.js:13:19:13:22 | path | provenance | |
| normalizedPaths.js:11:7:11:27 | path | normalizedPaths.js:14:26:14:29 | path | provenance | |
| normalizedPaths.js:11:7:11:27 | path | normalizedPaths.js:15:19:15:22 | path | provenance | |
@@ -821,6 +824,9 @@ nodes
| handlebars.js:15:25:15:32 | filePath | semmle.label | filePath |
| handlebars.js:29:46:29:60 | req.params.path | semmle.label | req.params.path |
| handlebars.js:43:15:43:29 | req.params.path | semmle.label | req.params.path |
+| hapi.js:14:19:14:51 | filepath | semmle.label | filepath |
+| hapi.js:14:30:14:51 | request ... ilepath | semmle.label | request ... ilepath |
+| hapi.js:15:44:15:51 | filepath | semmle.label | filepath |
| normalizedPaths.js:11:7:11:27 | path | semmle.label | path |
| normalizedPaths.js:11:14:11:27 | req.query.path | semmle.label | req.query.path |
| normalizedPaths.js:13:19:13:22 | path | semmle.label | path |
diff --git a/javascript/ql/test/query-tests/Security/CWE-022/TaintedPath/hapi.js b/javascript/ql/test/query-tests/Security/CWE-022/TaintedPath/hapi.js
new file mode 100644
index 00000000000..c90da206824
--- /dev/null
+++ b/javascript/ql/test/query-tests/Security/CWE-022/TaintedPath/hapi.js
@@ -0,0 +1,22 @@
+const Hapi = require('@hapi/hapi');
+const fs = require('fs').promises;
+
+(async () => {
+ const server = Hapi.server({
+ port: 3005,
+ host: 'localhost'
+ });
+
+ server.route({
+ method: 'GET',
+ path: '/hello',
+ handler: async (request, h) => {
+ const filepath = request.query.filepath; // $ Source
+ const data = await fs.readFile(filepath, 'utf8'); // $ Alert
+ const firstLine = data.split('\n')[0];
+ return firstLine;
+ }
+ });
+
+ await server.start();
+})();
diff --git a/javascript/ql/test/query-tests/Security/CWE-079/DomBasedXssWithResponseThreat/Xss.expected b/javascript/ql/test/query-tests/Security/CWE-079/DomBasedXssWithResponseThreat/Xss.expected
index ef0c88098b9..afc30e24608 100644
--- a/javascript/ql/test/query-tests/Security/CWE-079/DomBasedXssWithResponseThreat/Xss.expected
+++ b/javascript/ql/test/query-tests/Security/CWE-079/DomBasedXssWithResponseThreat/Xss.expected
@@ -1,4 +1,5 @@
#select
+| interceptors.js:9:56:9:72 | userGeneratedHtml | interceptors.js:7:6:7:13 | response | interceptors.js:9:56:9:72 | userGeneratedHtml | Cross-site scripting vulnerability due to $@. | interceptors.js:7:6:7:13 | response | user-provided value |
| test.jsx:27:29:27:32 | data | test.jsx:5:28:5:63 | fetch(" ... ntent") | test.jsx:27:29:27:32 | data | Cross-site scripting vulnerability due to $@. | test.jsx:5:28:5:63 | fetch(" ... ntent") | user-provided value |
| test.ts:21:57:21:76 | response.description | test.ts:8:9:8:79 | this.#h ... query') | test.ts:21:57:21:76 | response.description | Cross-site scripting vulnerability due to $@. | test.ts:8:9:8:79 | this.#h ... query') | user-provided value |
| test.ts:24:36:24:90 | `${ ... o}
` | test.ts:8:9:8:79 | this.#h ... query') | test.ts:24:36:24:90 | `