Compare commits

...

102 Commits

Author SHA1 Message Date
Cornelius Riemenschneider
e5c14dca5a C#: Fix integration test.
On an unrelated change related to test concurrency,
the standalone_dependencies_nuget_no_sources was failing.
I believe this has to do with the fact that it never picked up
the nuget.config, as it was in the root test directory, but the
extractor looks for it in the source root instead.
2024-08-28 10:18:42 +02:00
Tom Hvitved
22e1921391 Merge pull request #17313 from hvitved/dataflow/to-normal-sink-node-ex
Data flow: Move `toNormalSinkNodeEx` into `PathNodeMid`
2024-08-28 09:06:41 +02:00
Tom Hvitved
b589fcad11 Data flow: Tweak join-order in toNormalSinkNodeEx 2024-08-27 15:42:24 +02:00
Tom Hvitved
80b6135a64 Data flow: Move toNormalSinkNodeEx into PathNodeMid 2024-08-27 15:42:13 +02:00
Ian Lynagh
3a864d3de2 Merge pull request #17292 from igfoo/igfoo/open
Kotlin: Remove a redundant 'open'
2024-08-27 12:14:04 +01:00
Ian Lynagh
085bf2f662 Merge pull request #17293 from igfoo/igfoo/dtw
Kotlin: Restrict some TrapWriter types to DiagnosticTrapWriter
2024-08-27 12:13:59 +01:00
Michael Nebel
287857c5db Merge pull request #17301 from michaelnebel/shared/contentflowbadjoin
Shared: Fix bad join in content flow.
2024-08-27 10:17:04 +02:00
Paolo Tranquilli
b79be718e1 Merge pull request #17306 from github/redsun82/bazel-lfs
Bazel: fix logging bug in `git_lfs_probe.py`
2024-08-27 09:42:39 +02:00
Anders Schack-Mulligen
b3fa4f3d9e Merge pull request #17289 from aschackmull/dataflow/summaryctx
Dataflow: Simplify using a SummaryCtx type.
2024-08-27 09:32:43 +02:00
Paolo Tranquilli
0738e01e7e Bazel: fix logging bug in git_lfs_probe.py
The case of an `HTTPError` was printed to stdout (and therefore globbed
by bazel).

While I'm at it, I also introduced a timeout to `urlopen` and improved
the `no endpoints found` error message.
2024-08-27 09:12:37 +02:00
Michael Nebel
e81fdc951a Merge pull request #17246 from michaelnebel/modelgendebug
C#/Java: Add some model generator summary debugging queries.
2024-08-26 16:13:03 +02:00
Michael Nebel
77bfe39ca7 Shared: Address review comments. 2024-08-26 15:24:56 +02:00
Michael Nebel
4381bae5d1 Shared: Fix bad join. 2024-08-26 15:24:54 +02:00
Anders Schack-Mulligen
d8c8bcd386 Dataflow: Tweak qldoc. 2024-08-26 15:12:37 +02:00
Anders Schack-Mulligen
cbb58d0041 Dataflow: Add a getLocation rootdef. 2024-08-26 15:05:30 +02:00
Michael Nebel
34d83a6b0d C#/Java: Address review comments. 2024-08-26 15:02:27 +02:00
Asger F
4e3440aad0 Merge pull request #17275 from asgerf/cpp/taint-test-case-false-negative
C++: Reveal false negative in test case
2024-08-26 12:36:03 +02:00
Asger F
16c2cf24b3 C++: use inline annotation for missing flow 2024-08-26 11:53:31 +02:00
Asger F
592e2eafb6 Merge pull request #17262 from asgerf/shared/implicit-read
Shared: restrict flow after using implicit read
2024-08-26 11:48:50 +02:00
Paolo Tranquilli
c4c8c9ddc1 Merge pull request #17291 from github/criemen/ripunzip
Make ripunzip installer accessible from outside this repo.
2024-08-23 20:14:44 +02:00
Cornelius Riemenschneider
3ac8108c4a Address review. 2024-08-23 17:26:05 +02:00
Ian Lynagh
6a7d8b5301 Kotlin: Restrict some TrapWriter types to DiagnosticTrapWriter
We never use the greater generality, so this makes it easier to see
what's happening.
2024-08-23 15:41:21 +01:00
Ian Lynagh
7d500cf58c Kotlin: Remove a redundant 'open' 2024-08-23 15:08:10 +01:00
Tamás Vajk
d710c1e89d Merge pull request #17287 from tamasvajk/message-count-telemetry
C#: Add aggregated compiler and extractor message counts to extractio…
2024-08-23 14:41:27 +02:00
Cornelius Riemenschneider
d84e745ce9 Make ripunzip installer accessible from outside this repo.
* The relative path to misc doesn't work when running from another repo
* The buildifier dependency is not available from other repos,
  therefore we can't pull in //misc/bazel without further refactoring.

Therefore, inline the runfiles snippet here.
2024-08-23 14:24:51 +02:00
Anders Schack-Mulligen
65189e09f5 Dataflow: Simplify using a SummaryCtx type. 2024-08-23 14:18:46 +02:00
Asger F
8df7fbf6d6 Swift: update test output
The 'first' field is seen as a TaintInheritingContent, which means any read step for 'first' becomes a taint step too.
This type of taint step does not permit an implicit read before it, because it wasn't contributed by a configuration.
So there is no way for the taint to get out of the collection content before the taint step through '.first'.
The test previously passed because an implicit read at once of the earlier sinks could follow use-use flow down to the receiver of .first,
allowing it to escape the collection content.
2024-08-23 11:30:50 +02:00
Asger F
d27b28d371 C++: update test output
This reveals that some tests were passing for the wrong reasons.
See https://github.com/github/codeql/pull/17275
2024-08-23 11:29:24 +02:00
Asger F
9703f67794 Test output updates that only affect nodes/edges 2024-08-23 11:03:26 +02:00
Asger F
6bc8407bd6 Java: Update test output 2024-08-23 11:02:29 +02:00
Asger F
c3b36325b2 Shared: prevent use-use flow through implicit reads (part 1) 2024-08-23 11:02:28 +02:00
Michael Nebel
20d9fd11ac Merge pull request #17288 from michaelnebel/shared/contentflow
Shared: ContentFlow.
2024-08-23 09:52:27 +02:00
Michael Nebel
19c2eb17c4 C#: Remove redundant imports. 2024-08-23 09:04:13 +02:00
Chris Smowton
67d94376e8 Merge pull request #17227 from smowton/smowton/fix/baseline-vs-nonroot-vendor-dirs
Go / configure-baseline: account for multiple vendor directories and the `CODEQL_EXTRACTOR_GO_EXTRACT_VENDOR_DIRS` setting
2024-08-22 15:00:51 +01:00
Michael Nebel
d935c47231 C#: Use the shared content flow implementation. 2024-08-22 15:46:01 +02:00
Michael Nebel
e6424f0f45 Shared: Make ContentDataFlow reusable. 2024-08-22 15:45:58 +02:00
Owen Mansel-Chan
18b99ffecc Merge pull request #17284 from owen-mc/go/fix-frameworks-coverage
Go: Try to fix packages in frameworks coverage
2024-08-22 14:43:52 +01:00
Tamas Vajk
6827bedaa7 C#: Add aggregated compiler and extractor message counts to extraction telemetry query 2024-08-22 15:14:33 +02:00
Tamás Vajk
3dce56b0b1 Merge pull request #17276 from tamasvajk/impr/change-partial-method-location
C#: Change reporting location of partial methods
2024-08-22 15:10:21 +02:00
Michael Nebel
4cd34531c6 Shared: Add a copy of the existing C# Content Dataflow implementation. 2024-08-22 15:07:45 +02:00
Owen Mansel-Chan
2edadbf423 Try to fix packages in frameworks coverage 2024-08-22 11:44:34 +01:00
Asger F
a1688f6a1a Merge pull request #17240 from knewbury01/knewbury01/fix-helmetrequiredsetting-model
Update JS helmet model structure
2024-08-22 11:59:28 +02:00
Asger F
81239dcd95 Java: add test case 2024-08-22 11:26:05 +02:00
Michael Nebel
bd69b96752 Merge pull request #17273 from michaelnebel/csharp/sqlinject
C#: ASP.NET Controller is allowed to be abstract.
2024-08-22 11:18:48 +02:00
Asger F
43f54db4db Merge pull request #17274 from asgerf/java/implicit-pending-intents-implicit-read
Java: Reveal false negative in test
2024-08-22 11:00:07 +02:00
Tom Hvitved
d41d7c8246 Merge pull request #17207 from hvitved/csharp/content-set
C#: Implement `ContentSet`
2024-08-22 10:55:11 +02:00
Tom Hvitved
a213982b48 Merge pull request #17222 from hvitved/ruby/hash-splat-param-arg-matching
Ruby: Rework (hash) splat argument/parameter matching
2024-08-22 10:54:52 +02:00
Asger F
09aca6b47e Merge pull request #17212 from mbaluda/main
Add support for importing NPM modules in XSJS sources
2024-08-22 10:54:33 +02:00
Anders Schack-Mulligen
d97a301fef Merge pull request #17105 from aschackmull/dataflow/stage6
Dataflow: Refactor stage 6 to use shared stage code.
2024-08-22 09:46:49 +02:00
Tom Hvitved
e94fabcc19 Address review comment 2024-08-22 08:27:15 +02:00
Tom Hvitved
cb1b1da422 Ruby: Add another array flow test 2024-08-21 19:06:53 +02:00
Tom Hvitved
b0003c0453 Ruby: Remove two redundant checks 2024-08-21 19:06:29 +02:00
Tamas Vajk
f7bf5e89be Add change note 2024-08-21 15:58:05 +02:00
Tamas Vajk
7c4733e88f C#: Change reporting location of partial methods 2024-08-21 15:13:14 +02:00
Michael Nebel
7049499e95 C#: Add change-note. 2024-08-21 14:38:55 +02:00
Asger F
3aa32e4aff Java: use MISSING inline annotation 2024-08-21 13:40:40 +02:00
Asger F
f7ea8a1563 Java: trivial result set re-order 2024-08-21 13:37:38 +02:00
Asger F
5751fc2d3a Java: Reveal false negative in test
One of the sinks was flagged for the wrong reason in the test case.

The flow into the 'startActivities' sink isn't working properly, but this was not revealed by the test since an alternate, spurious path exists. The spurious path goes through the implicit read at the prior sink and takes a use-use step to the 'startActivities' sink. Swapping the order of the two sinks reveals the false negative.
2024-08-21 13:36:47 +02:00
Michael Nebel
45d4d5138a C#: Update expected test output. 2024-08-21 13:14:12 +02:00
Michael Nebel
79718f1cd6 C#: Remove requirement that a controller is not allowed to be abstract. 2024-08-21 13:00:15 +02:00
Michael Nebel
75772c5832 C#: Add abstract controller remote flow source example. 2024-08-21 13:00:10 +02:00
Michael Nebel
5d14307ea2 C#: Add a SQL injection test case for ASP.NET. 2024-08-21 12:14:30 +02:00
Chris Smowton
f13f19d5dc Fix typo 2024-08-21 10:22:42 +01:00
Chris Smowton
2939cefc68 Use platform path separators for file testing, and forward-slashes for reporting to CodeQL 2024-08-21 10:15:44 +01:00
Chris Smowton
c99a84689b Switch test expectations to use unix-style paths 2024-08-21 09:56:08 +01:00
Anders Schack-Mulligen
525b6f30e3 C++/C#/Java: Accept test changes. 2024-08-21 10:51:28 +02:00
Anders Schack-Mulligen
5fbdd83a23 Dataflow: Rename StagePathNode to PathNode. 2024-08-21 10:51:28 +02:00
Anders Schack-Mulligen
273c0bd121 Dataflow: Delete dead code. 2024-08-21 10:51:28 +02:00
Anders Schack-Mulligen
1787bcb05a Dataflow: Replace PathNode with Stage implementation. 2024-08-21 10:51:24 +02:00
Anders Schack-Mulligen
74739bedfc Dataflow: Add Stage 6 instantiation. 2024-08-21 10:44:46 +02:00
Anders Schack-Mulligen
831a66d812 Dataflow: Add getANonHiddenSuccessor to StagePathNodeImpl. 2024-08-21 10:44:45 +02:00
Anders Schack-Mulligen
e594e7283d Dataflow: Check stateful in/out-barriers in each stage. 2024-08-21 10:44:45 +02:00
Anders Schack-Mulligen
c2b25c7f2b Dataflow: Check clearsContent on store targets in StagePathGraph. 2024-08-21 10:44:44 +02:00
Anders Schack-Mulligen
b8d0b691da Dataflow: Introduce sink projection and add successor as member predicate. 2024-08-21 10:44:44 +02:00
Anders Schack-Mulligen
bc1dd45d4f Dataflow: Make private 2024-08-21 10:44:43 +02:00
Anders Schack-Mulligen
9429e5ccba Dataflow: Update StagePathNode.toString. 2024-08-21 10:44:43 +02:00
Anders Schack-Mulligen
81a815c343 Dataflow: Add StagePathNode.getState. 2024-08-21 10:44:43 +02:00
Anders Schack-Mulligen
bdcc5e7b67 Dataflow: Refactor getLocation 2024-08-21 10:44:42 +02:00
Anders Schack-Mulligen
bc0ae4cd1e Dataflow: Replace StagePathNode.getNode with getNodeEx. 2024-08-21 10:44:42 +02:00
Anders Schack-Mulligen
9bd3f3dee0 Dataflow: Rename StagePathNode to StagePathNodeImpl. 2024-08-21 10:44:41 +02:00
Chris Smowton
fc301206d1 Change note 2024-08-20 17:11:58 +01:00
Chris Smowton
3acab640b2 Add configure-baseline integration test 2024-08-20 17:07:09 +01:00
Chris Smowton
15b5bcc67c Output to stdout, not stderr 2024-08-20 17:01:54 +01:00
Chris Smowton
8b9617cd38 Update bazel build files 2024-08-20 15:56:28 +01:00
Chris Smowton
ea3e5c8a99 Clarify comment 2024-08-20 15:56:27 +01:00
Chris Smowton
f1f6f9b580 Share vendor-dir extraction logic between extractor and configure-baseline script 2024-08-20 15:56:26 +01:00
Chris Smowton
22802fd41f Improve struct naming 2024-08-20 15:56:25 +01:00
Chris Smowton
5d34dbf2c2 Remove unnecessary batch script flag 2024-08-20 15:56:24 +01:00
Chris Smowton
624d2b83c0 Tidy comments 2024-08-20 15:56:23 +01:00
Chris Smowton
21366dd502 Go / configure-baseline: account for multiple vendor directories and the CODEQL_EXTRACTOR_GO_EXTRACT_VENDOR_DIRS setting
Our existing configure-baseline scripts would give the wrong result if a `vendor` directory wasn't at the root of the repository, or if the `CODEQL_EXTRACTOR_GO_EXTRACT_VENDOR_DIRS` variable was set to `true` indicating the user wants their vendored code scanned.

Here I replace the shell scripts that implemented the very simplest behaviour with a small Go program.
2024-08-20 15:56:22 +01:00
Michael Nebel
6ea01b81bb C#: Add some summary debugging queries. 2024-08-20 16:28:18 +02:00
Michael Nebel
fd311d5143 Java: Add some summary debugging queries. 2024-08-20 16:28:15 +02:00
Tom Hvitved
d15e1b5598 Ruby: Prevent synthetic splat matching for actual splats at same positions 2024-08-20 16:21:59 +02:00
Tom Hvitved
c4b0f81883 Ruby: Prevent positional matching when preceded by a splat 2024-08-20 16:21:58 +02:00
Tom Hvitved
20dc242830 Ruby: Rework hash splat argument/parameter matching 2024-08-20 16:21:57 +02:00
Tom Hvitved
6d4f3bd014 Ruby: Rework splat argument/parameter matching 2024-08-20 16:21:56 +02:00
Asger F
7dcdad066f Update javascript/ql/lib/semmle/javascript/frameworks/helmet/Helmet.qll 2024-08-16 09:44:53 +02:00
Kristen Newbury
81787a159e Add QL docs to helmet model 2024-08-15 16:32:37 -04:00
Kristen Newbury
e84dda4fa6 Update JS helmet model structure 2024-08-15 16:08:48 -04:00
Tom Hvitved
d638b5c7d4 Sync shared file 2024-08-13 15:27:38 +02:00
Tom Hvitved
f6ec56a977 C#: Implement ContentSet 2024-08-13 15:27:36 +02:00
Mauro Baluda
be0a60a7f6 Add support for importing NPM modules in XSJS sources 2024-08-13 14:45:03 +02:00
122 changed files with 3361 additions and 4459 deletions

View File

@@ -24,5 +24,5 @@ jobs:
extra_args: >
buildifier --all-files 2>&1 ||
(
echo -e "In order to format all bazel files, please run:\n bazel run //misc/bazel:buildifier"; exit 1
echo -e "In order to format all bazel files, please run:\n bazel run //misc/bazel/buildifier"; exit 1
)

View File

@@ -26,7 +26,7 @@ repos:
name: Format bazel files
files: \.(bazel|bzl)
language: system
entry: bazel run //misc/bazel:buildifier
entry: bazel run //misc/bazel/buildifier
pass_filenames: false
# DISABLED: can be enabled by copying this config and installing `pre-commit` with `--config` on the copy

View File

@@ -848,6 +848,8 @@ edges
| simple.cpp:120:8:120:8 | *a [i] | simple.cpp:120:10:120:10 | i | provenance | |
| struct_init.c:14:24:14:25 | *ab [a] | struct_init.c:14:24:14:25 | *ab [a] | provenance | |
| struct_init.c:14:24:14:25 | *ab [a] | struct_init.c:15:8:15:9 | *ab [a] | provenance | |
| struct_init.c:14:24:14:25 | *ab [a] | struct_init.c:15:8:15:9 | *ab [a] | provenance | |
| struct_init.c:15:8:15:9 | *ab [a] | struct_init.c:15:12:15:12 | a | provenance | |
| struct_init.c:15:8:15:9 | *ab [a] | struct_init.c:15:12:15:12 | a | provenance | |
| struct_init.c:20:13:20:14 | *definition of ab [a] | struct_init.c:22:8:22:9 | *ab [a] | provenance | |
| struct_init.c:20:13:20:14 | *definition of ab [a] | struct_init.c:24:10:24:12 | *& ... [a] | provenance | |
@@ -1758,6 +1760,8 @@ nodes
| simple.cpp:120:10:120:10 | i | semmle.label | i |
| struct_init.c:14:24:14:25 | *ab [a] | semmle.label | *ab [a] |
| struct_init.c:14:24:14:25 | *ab [a] | semmle.label | *ab [a] |
| struct_init.c:14:24:14:25 | *ab [a] | semmle.label | *ab [a] |
| struct_init.c:15:8:15:9 | *ab [a] | semmle.label | *ab [a] |
| struct_init.c:15:8:15:9 | *ab [a] | semmle.label | *ab [a] |
| struct_init.c:15:12:15:12 | a | semmle.label | a |
| struct_init.c:20:13:20:14 | *definition of ab [a] | semmle.label | *definition of ab [a] |

View File

@@ -737,6 +737,8 @@ edges
| simple.cpp:120:8:120:8 | a [i] | simple.cpp:120:10:120:10 | i | provenance | |
| struct_init.c:14:24:14:25 | ab [a] | struct_init.c:14:24:14:25 | ab [a] | provenance | |
| struct_init.c:14:24:14:25 | ab [a] | struct_init.c:15:8:15:9 | ab [a] | provenance | |
| struct_init.c:14:24:14:25 | ab [a] | struct_init.c:15:8:15:9 | ab [a] | provenance | |
| struct_init.c:15:8:15:9 | ab [a] | struct_init.c:15:12:15:12 | a | provenance | |
| struct_init.c:15:8:15:9 | ab [a] | struct_init.c:15:12:15:12 | a | provenance | |
| struct_init.c:15:8:15:9 | ab [a] | struct_init.c:15:12:15:12 | a | provenance | |
| struct_init.c:15:8:15:9 | ab [post update] [a] | struct_init.c:14:24:14:25 | ab [a] | provenance | |
@@ -1549,6 +1551,8 @@ nodes
| simple.cpp:120:10:120:10 | i | semmle.label | i |
| struct_init.c:14:24:14:25 | ab [a] | semmle.label | ab [a] |
| struct_init.c:14:24:14:25 | ab [a] | semmle.label | ab [a] |
| struct_init.c:14:24:14:25 | ab [a] | semmle.label | ab [a] |
| struct_init.c:15:8:15:9 | ab [a] | semmle.label | ab [a] |
| struct_init.c:15:8:15:9 | ab [a] | semmle.label | ab [a] |
| struct_init.c:15:8:15:9 | ab [post update] [a] | semmle.label | ab [post update] [a] |
| struct_init.c:15:12:15:12 | a | semmle.label | a |

View File

@@ -450,7 +450,7 @@ void test_qualifiers()
b.member = source();
sink(b); // $ ir MISSING: ast
sink(b.member); // $ ast,ir
sink(b.getMember()); // $ ir MISSING: ast
sink(b.getMember()); // $ MISSING: ir ast
c = new MyClass2(0);

View File

@@ -115,8 +115,8 @@ void test_vector_swap() {
v3.swap(v4);
sink(v1);
sink(v2); // $ ir MISSING:ast
sink(v3); // $ ir MISSING:ast
sink(v2); // $ MISSING:ir ast
sink(v3); // $ MISSING:ir ast
sink(v4);
}

View File

@@ -3,6 +3,7 @@ using System.Collections.Concurrent;
using System.IO;
using System.Linq;
using Microsoft.CodeAnalysis;
using Semmle.Extraction.Entities;
using Semmle.Util;
namespace Semmle.Extraction.CSharp.Entities
@@ -89,13 +90,21 @@ namespace Semmle.Extraction.CSharp.Entities
trapFile.compilation_finished(this, (float)p.Total.Cpu.TotalSeconds, (float)p.Total.Elapsed.TotalSeconds);
}
public void PopulateAggregatedMessages()
{
ExtractionMessage.groupedMessageCounts.ForEach(pair =>
{
Context.TrapWriter.Writer.compilation_info(this, $"Extractor message count for group '{pair.Key}'", pair.Value.ToString());
});
}
public override void WriteId(EscapingTextWriter trapFile)
{
trapFile.Write(hashCode);
trapFile.Write(";compilation");
}
public override Location ReportingLocation => throw new NotImplementedException();
public override Microsoft.CodeAnalysis.Location ReportingLocation => throw new NotImplementedException();
public override bool NeedsPopulation => Context.IsAssemblyScope;

View File

@@ -21,7 +21,7 @@ namespace Semmle.Extraction.CSharp.Entities
public override Microsoft.CodeAnalysis.Location ReportingLocation =>
IsCompilerGeneratedDelegate()
? Symbol.ContainingType.GetSymbolLocation()
: Symbol.GetSymbolLocation();
: BodyDeclaringSymbol.GetSymbolLocation();
public override bool NeedsPopulation => base.NeedsPopulation || IsCompilerGeneratedDelegate();

View File

@@ -250,6 +250,8 @@ namespace Semmle.Extraction.CSharp
public void LogPerformance(Entities.PerformanceMetrics p) => compilationEntity.PopulatePerformance(p);
public void ExtractAggregatedMessages() => compilationEntity.PopulateAggregatedMessages();
#nullable restore warnings
/// <summary>

View File

@@ -458,6 +458,7 @@ namespace Semmle.Extraction.CSharp
sw.Restart();
analyser.PerformExtraction(options.Threads);
analyser.ExtractAggregatedMessages();
sw.Stop();
var cpuTime2 = currentProcess.TotalProcessorTime;
var userTime2 = currentProcess.UserProcessorTime;

View File

@@ -26,6 +26,7 @@ codeql_csharp_library(
],
"//conditions:default": [],
}),
internals_visible_to = ["Semmle.Extraction.CSharp"],
visibility = ["//csharp:__subpackages__"],
deps = [
"//csharp/extractor/Semmle.Util",

View File

@@ -1,4 +1,5 @@
using System.IO;
using System.Collections.Concurrent;
using System.IO;
using System.Threading;
using Semmle.Util;
@@ -7,6 +8,8 @@ namespace Semmle.Extraction.Entities
internal class ExtractionMessage : FreshEntity
{
private static readonly int limit = EnvironmentVariables.TryGetExtractorNumberOption<int>("MESSAGE_LIMIT") ?? 10000;
internal static readonly ConcurrentDictionary<string, int> groupedMessageCounts = [];
private static int messageCount = 0;
private readonly Message msg;
@@ -25,6 +28,10 @@ namespace Semmle.Extraction.Entities
protected override void Populate(TextWriter trapFile)
{
// For the time being we're counting the number of messages per severity, we could introduce other groupings in the future
var key = msg.Severity.ToString();
groupedMessageCounts.AddOrUpdate(key, 1, (_, c) => c + 1);
if (!bypassLimit)
{
var val = Interlocked.Increment(ref messageCount);

View File

@@ -5,6 +5,8 @@
</PropertyGroup>
<ItemGroup>
<ProjectReference Include="..\Semmle.Util\Semmle.Util.csproj" />
<InternalsVisibleTo Include="Semmle.Extraction.CSharp" />
</ItemGroup>
<Import Project="..\..\.paket\Paket.Restore.targets" />
</Project>

View File

@@ -7,3 +7,5 @@ extractorMessagesLeachedLimit
compilationInfo
| Compiler diagnostic count for CS0103 | 3.0 |
| Compiler diagnostic count for CS8019 | 7.0 |
| Extractor message count for group 'Error' | 8.0 |
| Extractor message count for group 'Warning' | 1.0 |

View File

@@ -11,7 +11,8 @@ query predicate extractorMessagesLeachedLimit(ExtractorMessage msg) {
query predicate compilationInfo(string key, float value) {
exists(Compilation c, string infoValue |
infoValue = c.getInfo(key) and key.matches("Compiler diagnostic count for%")
infoValue = c.getInfo(key) and
key.matches(["Compiler diagnostic count for%", "Extractor message count for group%"])
|
value = infoValue.toFloat()
)

View File

@@ -4,7 +4,7 @@ import semmle.code.csharp.commons.Diagnostics
query predicate compilationInfo(string key, float value) {
key != "Resolved references" and
key != "Resolved assembly conflicts" and
not key.matches("Compiler diagnostic count for%") and
not key.matches(["Compiler diagnostic count for%", "Extractor message count for group%"]) and
exists(Compilation c, string infoKey, string infoValue | infoValue = c.getInfo(infoKey) |
key = infoKey and
value = infoValue.toFloat()

View File

@@ -0,0 +1,4 @@
---
category: minorAnalysis
---
* Parameters of public methods in abstract controller-like classes are now considered remote flow sources.

View File

@@ -0,0 +1,4 @@
---
category: minorAnalysis
---
* The reported location of `partial` methods has been changed from the definition to the implementation part.

View File

@@ -1,504 +1,4 @@
/**
* Provides classes for performing global (inter-procedural)
* content-sensitive data flow analyses.
*
* Unlike `DataFlow::Global`, we allow for data to be stored (possibly nested) inside
* contents of sources and sinks.
* We track flow paths of the form
*
* ```
* source --value-->* node
* (--read--> node --value-->* node)*
* --(non-value|value)-->* node
* (--store--> node --value-->* node)*
* --value-->* sink
* ```
*
* where `--value-->` is a value-preserving flow step, `--read-->` is a read
* step, `--store-->` is a store step, and `--(non-value)-->` is a
* non-value-preserving flow step.
*
* That is, first a sequence of 0 or more reads, followed by 0 or more additional
* steps, followed by 0 or more stores, with value-preserving steps allowed in
* between all other steps.
*/
private import csharp
private import codeql.util.Boolean
private import DataFlowImplCommon
private import DataFlowImplSpecific::Private
private import DataFlowImplSpecific::Private as DataFlowPrivate
/**
* An input configuration for content data flow.
*/
signature module ConfigSig {
/**
* Holds if `source` is a relevant data flow source.
*/
predicate isSource(DataFlow::Node source);
/**
* Holds if `sink` is a relevant data flow sink.
*/
predicate isSink(DataFlow::Node sink);
/**
* Holds if data may flow from `node1` to `node2` in addition to the normal data-flow steps.
*/
default predicate isAdditionalFlowStep(DataFlow::Node node1, DataFlow::Node node2) { none() }
/** Holds if data flow into `node` is prohibited. */
default predicate isBarrier(DataFlow::Node node) { none() }
/**
* Gets a data flow configuration feature to add restrictions to the set of
* valid flow paths.
*
* - `FeatureHasSourceCallContext`:
* Assume that sources have some existing call context to disallow
* conflicting return-flow directly following the source.
* - `FeatureHasSinkCallContext`:
* Assume that sinks have some existing call context to disallow
* conflicting argument-to-parameter flow directly preceding the sink.
* - `FeatureEqualSourceSinkCallContext`:
* Implies both of the above and additionally ensures that the entire flow
* path preserves the call context.
*/
default DataFlow::FlowFeature getAFeature() { none() }
/** Gets a limit on the number of reads out of sources and number of stores into sinks. */
default int accessPathLimit() { result = DataFlowPrivate::accessPathLimit() }
/** Holds if `c` is relevant for reads out of sources or stores into sinks. */
default predicate isRelevantContent(DataFlow::ContentSet c) { any() }
}
/**
* Constructs a global content data flow computation.
*/
module Global<ConfigSig ContentConfig> {
private module FlowConfig implements DataFlow::StateConfigSig {
class FlowState = State;
predicate isSource(DataFlow::Node source, FlowState state) {
ContentConfig::isSource(source) and
state.(InitState).decode(true)
}
predicate isSink(DataFlow::Node sink, FlowState state) {
ContentConfig::isSink(sink) and
(
state instanceof InitState or
state instanceof StoreState or
state instanceof ReadState
)
}
predicate isAdditionalFlowStep(
DataFlow::Node node1, FlowState state1, DataFlow::Node node2, FlowState state2
) {
storeStep(node1, state1, _, node2, state2) or
readStep(node1, state1, _, node2, state2) or
additionalStep(node1, state1, node2, state2)
}
predicate isAdditionalFlowStep = ContentConfig::isAdditionalFlowStep/2;
predicate isBarrier = ContentConfig::isBarrier/1;
DataFlow::FlowFeature getAFeature() { result = ContentConfig::getAFeature() }
predicate accessPathLimit = ContentConfig::accessPathLimit/0;
// needed to record reads/stores inside summarized callables
predicate includeHiddenNodes() { any() }
}
private module Flow = DataFlow::GlobalWithState<FlowConfig>;
/**
* Holds if data stored inside `sourceAp` on `source` flows to `sinkAp` inside `sink`
* for this configuration. `preservesValue` indicates whether any of the additional
* flow steps defined by `isAdditionalFlowStep` are needed.
*
* For the source access path, `sourceAp`, the top of the stack represents the content
* that was last read from. That is, if `sourceAp` is `Field1.Field2` (with `Field1`
* being the top of the stack), then there is flow from `source.Field2.Field1`.
*
* For the sink access path, `sinkAp`, the top of the stack represents the content
* that was last stored into. That is, if `sinkAp` is `Field1.Field2` (with `Field1`
* being the top of the stack), then there is flow into `sink.Field1.Field2`.
*/
predicate flow(
DataFlow::Node source, AccessPath sourceAp, DataFlow::Node sink, AccessPath sinkAp,
boolean preservesValue
) {
exists(Flow::PathNode pathSource, Flow::PathNode pathSink |
Flow::flowPath(pathSource, pathSink) and
nodeReaches(pathSource, TAccessPathNil(), TAccessPathNil(), pathSink, sourceAp, sinkAp) and
source = pathSource.getNode() and
sink = pathSink.getNode()
|
pathSink.getState().(InitState).decode(preservesValue)
or
pathSink.getState().(ReadState).decode(_, preservesValue)
or
pathSink.getState().(StoreState).decode(_, preservesValue)
)
}
private newtype TState =
TInitState(Boolean preservesValue) or
TStoreState(int size, Boolean preservesValue) {
size in [1 .. ContentConfig::accessPathLimit()]
} or
TReadState(int size, Boolean preservesValue) { size in [1 .. ContentConfig::accessPathLimit()] }
abstract private class State extends TState {
abstract string toString();
}
/** A flow state representing no reads or stores. */
private class InitState extends State, TInitState {
private boolean preservesValue_;
InitState() { this = TInitState(preservesValue_) }
override string toString() { result = "Init(" + preservesValue_ + ")" }
predicate decode(boolean preservesValue) { preservesValue = preservesValue_ }
}
/** A flow state representing that content has been stored into. */
private class StoreState extends State, TStoreState {
private boolean preservesValue_;
private int size_;
StoreState() { this = TStoreState(size_, preservesValue_) }
override string toString() { result = "StoreState(" + size_ + "," + preservesValue_ + ")" }
predicate decode(int size, boolean preservesValue) {
size = size_ and preservesValue = preservesValue_
}
}
/** A flow state representing that content has been read from. */
private class ReadState extends State, TReadState {
private boolean preservesValue_;
private int size_;
ReadState() { this = TReadState(size_, preservesValue_) }
override string toString() { result = "ReadState(" + size_ + "," + preservesValue_ + ")" }
predicate decode(int size, boolean preservesValue) {
size = size_ and preservesValue = preservesValue_
}
}
private predicate storeStep(
DataFlow::Node node1, State state1, DataFlow::ContentSet c, DataFlow::Node node2,
StoreState state2
) {
exists(boolean preservesValue, int size |
storeSet(node1, c, node2, _, _) and
ContentConfig::isRelevantContent(c) and
state2.decode(size + 1, preservesValue)
|
state1.(InitState).decode(preservesValue) and size = 0
or
state1.(ReadState).decode(_, preservesValue) and size = 0
or
state1.(StoreState).decode(size, preservesValue)
)
}
private predicate readStep(
DataFlow::Node node1, State state1, DataFlow::ContentSet c, DataFlow::Node node2,
ReadState state2
) {
exists(int size |
readSet(node1, c, node2) and
ContentConfig::isRelevantContent(c) and
state2.decode(size + 1, true)
|
state1.(InitState).decode(true) and
size = 0
or
state1.(ReadState).decode(size, true)
)
}
private predicate additionalStep(
DataFlow::Node node1, State state1, DataFlow::Node node2, State state2
) {
ContentConfig::isAdditionalFlowStep(node1, node2) and
(
state1 instanceof InitState and
state2.(InitState).decode(false)
or
exists(int size |
state1.(ReadState).decode(size, _) and
state2.(ReadState).decode(size, false)
)
)
}
private newtype TAccessPath =
TAccessPathNil() or
TAccessPathCons(DataFlow::ContentSet head, AccessPath tail) {
nodeReachesStore(_, _, _, _, head, _, tail)
or
nodeReachesRead(_, _, _, _, head, tail, _)
}
/** An access path. */
class AccessPath extends TAccessPath {
/** Gets the head of this access path, if any. */
DataFlow::ContentSet getHead() { this = TAccessPathCons(result, _) }
/** Gets the tail of this access path, if any. */
AccessPath getTail() { this = TAccessPathCons(_, result) }
/**
* Gets a textual representation of this access path.
*
* Elements are dot-separated, and the head of the stack is
* rendered first.
*/
string toString() {
this = TAccessPathNil() and
result = ""
or
exists(DataFlow::ContentSet head, AccessPath tail |
this = TAccessPathCons(head, tail) and
result = head + "." + tail
)
}
}
/**
* Provides a big-step flow relation, where flow stops at read/store steps that
* must be recorded, and flow via `subpaths` such that reads/stores inside
* summarized callables can be recorded as well.
*/
private module BigStepFlow {
private predicate reachesSink(Flow::PathNode node) {
FlowConfig::isSink(node.getNode(), node.getState())
or
reachesSink(node.getASuccessor())
}
/**
* Holds if the flow step `pred -> succ` should not be allowed to be included
* in the big-step relation.
*/
pragma[nomagic]
private predicate excludeStep(Flow::PathNode pred, Flow::PathNode succ) {
pred.getASuccessor() = succ and
(
// we need to record reads/stores inside summarized callables
Flow::PathGraph::subpaths(pred, _, _, succ)
or
// only allow flow into a summarized callable, as part of the big-step
// relation, when flow can reach a sink without going back out
Flow::PathGraph::subpaths(pred, succ, _, _) and
not reachesSink(succ)
or
// needed to record store steps
storeStep(pred.getNode(), pred.getState(), _, succ.getNode(), succ.getState())
or
// needed to record read steps
readStep(pred.getNode(), pred.getState(), _, succ.getNode(), succ.getState())
)
}
pragma[nomagic]
private DataFlowCallable getEnclosingCallableImpl(Flow::PathNode node) {
result = getNodeEnclosingCallable(node.getNode())
}
pragma[inline]
private DataFlowCallable getEnclosingCallable(Flow::PathNode node) {
pragma[only_bind_into](result) = getEnclosingCallableImpl(pragma[only_bind_out](node))
}
pragma[nomagic]
private predicate bigStepEntry(Flow::PathNode node) {
(
FlowConfig::isSource(node.getNode(), node.getState())
or
excludeStep(_, node)
or
Flow::PathGraph::subpaths(_, node, _, _)
)
}
pragma[nomagic]
private predicate bigStepExit(Flow::PathNode node) {
(
bigStepEntry(node)
or
FlowConfig::isSink(node.getNode(), node.getState())
or
excludeStep(node, _)
or
Flow::PathGraph::subpaths(_, _, node, _)
)
}
pragma[nomagic]
private predicate step(Flow::PathNode pred, Flow::PathNode succ) {
pred.getASuccessor() = succ and
not excludeStep(pred, succ)
}
pragma[nomagic]
private predicate stepRec(Flow::PathNode pred, Flow::PathNode succ) {
step(pred, succ) and
not bigStepEntry(pred)
}
private predicate stepRecPlus(Flow::PathNode n1, Flow::PathNode n2) = fastTC(stepRec/2)(n1, n2)
/**
* Holds if there is flow `pathSucc+(pred) = succ`, and such a flow path does
* not go through any reads/stores that need to be recorded, or summarized
* steps.
*/
pragma[nomagic]
private predicate bigStep(Flow::PathNode pred, Flow::PathNode succ) {
exists(Flow::PathNode mid |
bigStepEntry(pred) and
step(pred, mid)
|
succ = mid
or
stepRecPlus(mid, succ)
) and
bigStepExit(succ)
}
pragma[nomagic]
predicate bigStepNotLocal(Flow::PathNode pred, Flow::PathNode succ) {
bigStep(pred, succ) and
not getEnclosingCallable(pred) = getEnclosingCallable(succ)
}
pragma[nomagic]
predicate bigStepMaybeLocal(Flow::PathNode pred, Flow::PathNode succ) {
bigStep(pred, succ) and
getEnclosingCallable(pred) = getEnclosingCallable(succ)
}
}
/**
* Holds if `source` can reach `node`, having read `reads` from the source and
* written `stores` into `node`.
*
* `source` is either a source from a configuration, in which case `scReads` and
* `scStores` are always empty, or it is the parameter of a summarized callable,
* in which case `scReads` and `scStores` record the reads/stores for a summary
* context, that is, the reads/stores for an argument that can reach the parameter.
*/
pragma[nomagic]
private predicate nodeReaches(
Flow::PathNode source, AccessPath scReads, AccessPath scStores, Flow::PathNode node,
AccessPath reads, AccessPath stores
) {
node = source and
reads = scReads and
stores = scStores and
(
Flow::flowPath(source, _) and
scReads = TAccessPathNil() and
scStores = TAccessPathNil()
or
// the argument in a sub path can be reached, so we start flow from the sub path
// parameter, while recording the read/store summary context
exists(Flow::PathNode arg |
nodeReachesSubpathArg(_, _, _, arg, scReads, scStores) and
Flow::PathGraph::subpaths(arg, source, _, _)
)
)
or
exists(Flow::PathNode mid |
nodeReaches(source, scReads, scStores, mid, reads, stores) and
BigStepFlow::bigStepMaybeLocal(mid, node)
)
or
exists(Flow::PathNode mid |
nodeReaches(source, scReads, scStores, mid, reads, stores) and
BigStepFlow::bigStepNotLocal(mid, node) and
// when flow is not local, we cannot flow back out, so we may stop
// flow early when computing summary flow
Flow::flowPath(source, _) and
scReads = TAccessPathNil() and
scStores = TAccessPathNil()
)
or
// store step
exists(AccessPath storesMid, DataFlow::ContentSet c |
nodeReachesStore(source, scReads, scStores, node, c, reads, storesMid) and
stores = TAccessPathCons(c, storesMid)
)
or
// read step
exists(AccessPath readsMid, DataFlow::ContentSet c |
nodeReachesRead(source, scReads, scStores, node, c, readsMid, stores) and
reads = TAccessPathCons(c, readsMid)
)
or
// flow-through step; match outer stores/reads with inner store/read summary contexts
exists(Flow::PathNode mid, AccessPath innerScReads, AccessPath innerScStores |
nodeReachesSubpathArg(source, scReads, scStores, mid, innerScReads, innerScStores) and
subpathArgReachesOut(mid, innerScReads, innerScStores, node, reads, stores)
)
}
pragma[nomagic]
private predicate nodeReachesStore(
Flow::PathNode source, AccessPath scReads, AccessPath scStores, Flow::PathNode node,
DataFlow::ContentSet c, AccessPath reads, AccessPath stores
) {
exists(Flow::PathNode mid |
nodeReaches(source, scReads, scStores, mid, reads, stores) and
storeStep(mid.getNode(), mid.getState(), c, node.getNode(), node.getState()) and
mid.getASuccessor() = node
)
}
pragma[nomagic]
private predicate nodeReachesRead(
Flow::PathNode source, AccessPath scReads, AccessPath scStores, Flow::PathNode node,
DataFlow::ContentSet c, AccessPath reads, AccessPath stores
) {
exists(Flow::PathNode mid |
nodeReaches(source, scReads, scStores, mid, reads, stores) and
readStep(mid.getNode(), mid.getState(), c, node.getNode(), node.getState()) and
mid.getASuccessor() = node
)
}
pragma[nomagic]
private predicate nodeReachesSubpathArg(
Flow::PathNode source, AccessPath scReads, AccessPath scStores, Flow::PathNode arg,
AccessPath reads, AccessPath stores
) {
nodeReaches(source, scReads, scStores, arg, reads, stores) and
Flow::PathGraph::subpaths(arg, _, _, _)
}
pragma[nomagic]
private predicate subpathArgReachesOut(
Flow::PathNode arg, AccessPath scReads, AccessPath scStores, Flow::PathNode out,
AccessPath reads, AccessPath stores
) {
exists(Flow::PathNode source, Flow::PathNode ret |
nodeReaches(source, scReads, scStores, ret, reads, stores) and
Flow::PathGraph::subpaths(arg, source, ret, out)
)
}
}
private import semmle.code.csharp.Location
private import DataFlowImplSpecific
private import codeql.dataflow.internal.ContentDataFlowImpl
import MakeImplContentDataFlow<Location, CsharpDataFlow>

View File

@@ -908,19 +908,20 @@ private class Argument extends Expr {
*
* `postUpdate` indicates whether the store targets a post-update node.
*/
private predicate fieldOrPropertyStore(Expr e, Content c, Expr src, Expr q, boolean postUpdate) {
private predicate fieldOrPropertyStore(Expr e, ContentSet c, Expr src, Expr q, boolean postUpdate) {
exists(FieldOrProperty f |
c = f.getContent() and
c = f.getContentSet() and
(
f.isFieldLike() and
f instanceof InstanceFieldOrProperty
or
exists(
FlowSummaryImpl::Private::SummarizedCallableImpl sc,
FlowSummaryImpl::Private::SummaryComponentStack input
FlowSummaryImpl::Private::SummaryComponentStack input, ContentSet readSet
|
sc.propagatesFlow(input, _, _, _) and
input.contains(FlowSummaryImpl::Private::SummaryComponent::content(f.getContent()))
input.contains(FlowSummaryImpl::Private::SummaryComponent::content(readSet)) and
c.getAStoreContent() = readSet.getAReadContent()
)
)
|
@@ -970,28 +971,13 @@ private predicate fieldOrPropertyStore(Expr e, Content c, Expr src, Expr q, bool
)
}
/** Holds if property `p1` overrides or implements source declaration property `p2`. */
private predicate overridesOrImplementsSourceDecl(Property p1, Property p2) {
p1.getOverridee*().getUnboundDeclaration() = p2
or
p1.getAnUltimateImplementee().getUnboundDeclaration() = p2
}
/**
* Holds if `e2` is an expression that reads field or property `c` from
* expression `e1`. This takes overriding into account for properties written
* from library code.
* expression `e1`.
*/
private predicate fieldOrPropertyRead(Expr e1, Content c, FieldOrPropertyRead e2) {
private predicate fieldOrPropertyRead(Expr e1, ContentSet c, FieldOrPropertyRead e2) {
e1 = e2.getQualifier() and
exists(FieldOrProperty ret | c = ret.getContent() |
ret = e2.getTarget()
or
exists(Property target |
target.getGetter() = e2.(PropertyCall).getARuntimeTarget() and
overridesOrImplementsSourceDecl(target, ret)
)
)
c = e2.getTarget().(FieldOrProperty).getContentSet()
}
/**
@@ -1208,6 +1194,11 @@ private module Cached {
} or
TCapturedVariableContent(VariableCapture::CapturedVariable v)
cached
newtype TContentSet =
TSingletonContent(Content c) { not c instanceof PropertyContent } or
TPropertyContentSet(Property p) { p.isUnboundDeclaration() }
cached
newtype TContentApprox =
TFieldApproxContent(string firstChar) { firstChar = approximateFieldContent(_) } or
@@ -2076,10 +2067,10 @@ class FieldOrProperty extends Assignable, Modifiable {
}
/** Gets the content that matches this field or property. */
Content getContent() {
result.(FieldContent).getField() = this.getUnboundDeclaration()
ContentSet getContentSet() {
result.isField(this.getUnboundDeclaration())
or
result.(PropertyContent).getProperty() = this.getUnboundDeclaration()
result.isProperty(this.getUnboundDeclaration())
}
}
@@ -2211,8 +2202,8 @@ private class StoreStepConfiguration extends ControlFlowReachabilityConfiguratio
}
pragma[nomagic]
private PropertyContent getResultContent() {
result.getProperty() = any(SystemThreadingTasksTaskTClass c_).getResultProperty()
private ContentSet getResultContent() {
result.isProperty(any(SystemThreadingTasksTaskTClass c_).getResultProperty())
}
private predicate primaryConstructorParameterStore(
@@ -2226,17 +2217,16 @@ private predicate primaryConstructorParameterStore(
)
}
/**
* Holds if data can flow from `node1` to `node2` via an assignment to
* content `c`.
*/
predicate storeStep(Node node1, ContentSet c, Node node2) {
pragma[nomagic]
private predicate recordParameter(RecordType t, Parameter p, string name) {
p.getName() = name and p.getCallable().getDeclaringType() = t
}
private predicate storeContentStep(Node node1, Content c, Node node2) {
exists(StoreStepConfiguration x, ExprNode node, boolean postUpdate |
hasNodePath(x, node1, node) and
if postUpdate = true then node = node2.(PostUpdateNode).getPreUpdateNode() else node = node2
|
fieldOrPropertyStore(_, c, node1.asExpr(), node.getExpr(), postUpdate)
or
arrayStore(_, node1.asExpr(), node.getExpr(), postUpdate) and c instanceof ElementContent
)
or
@@ -2257,26 +2247,59 @@ predicate storeStep(Node node1, ContentSet c, Node node2) {
c instanceof ElementContent
)
or
primaryConstructorParameterStore(node1, c, node2)
or
exists(Parameter p, DataFlowCallable callable |
node1 = TExplicitParameterNode(p, callable) and
node2 = TPrimaryConstructorThisAccessNode(p, true, callable) and
not recordParameter(_, p, _) and
c.(PrimaryConstructorParameterContent).getParameter() = p
)
or
VariableCapture::storeStep(node1, c, node2)
}
pragma[nomagic]
private predicate recordProperty(RecordType t, ContentSet c, string name) {
exists(Property p |
c.isProperty(p) and
p.getName() = name and
p.getDeclaringType() = t
)
}
/**
* Holds if data can flow from `node1` to `node2` via an assignment to
* content `c`.
*/
predicate storeStep(Node node1, ContentSet c, Node node2) {
exists(Content cont |
storeContentStep(node1, cont, node2) and
c.isSingleton(cont)
)
or
exists(StoreStepConfiguration x, ExprNode node, boolean postUpdate |
hasNodePath(x, node1, node) and
if postUpdate = true then node = node2.(PostUpdateNode).getPreUpdateNode() else node = node2
|
fieldOrPropertyStore(_, c, node1.asExpr(), node.getExpr(), postUpdate)
)
or
exists(Expr e |
e = node1.asExpr() and
node2.(AsyncReturnNode).getExpr() = e and
c = getResultContent()
)
or
primaryConstructorParameterStore(node1, c, node2)
or
exists(Parameter p, DataFlowCallable callable |
exists(Parameter p, DataFlowCallable callable, RecordType t, string name |
node1 = TExplicitParameterNode(p, callable) and
node2 = TPrimaryConstructorThisAccessNode(p, true, callable) and
if p.getCallable().getDeclaringType() instanceof RecordType
then c.(PropertyContent).getProperty().getName() = p.getName()
else c.(PrimaryConstructorParameterContent).getParameter() = p
recordParameter(t, p, name) and
recordProperty(t, c, name)
)
or
FlowSummaryImpl::Private::Steps::summaryStoreStep(node1.(FlowSummaryNode).getSummaryNode(), c,
node2.(FlowSummaryNode).getSummaryNode())
or
VariableCapture::storeStep(node1, c, node2)
}
private class ReadStepConfiguration extends ControlFlowReachabilityConfiguration {
@@ -2344,14 +2367,8 @@ private class ReadStepConfiguration extends ControlFlowReachabilityConfiguration
}
}
/**
* Holds if data can flow from `node1` to `node2` via a read of content `c`.
*/
predicate readStep(Node node1, ContentSet c, Node node2) {
private predicate readContentStep(Node node1, Content c, Node node2) {
exists(ReadStepConfiguration x |
hasNodePath(x, node1, node2) and
fieldOrPropertyRead(node1.asExpr(), c, node2.asExpr())
or
hasNodePath(x, node1, node2) and
arrayRead(node1.asExpr(), node2.asExpr()) and
c instanceof ElementContent
@@ -2363,10 +2380,6 @@ predicate readStep(Node node1, ContentSet c, Node node2) {
c instanceof ElementContent
)
or
hasNodePath(x, node1, node2) and
node2.asExpr().(AwaitExpr).getExpr() = node1.asExpr() and
c = getResultContent()
or
node1 =
any(InstanceParameterAccessPreNode n |
n.getUnderlyingControlFlowNode() = node2.(ExprNode).getControlFlowNode() and
@@ -2404,31 +2417,30 @@ predicate readStep(Node node1, ContentSet c, Node node2) {
)
)
or
FlowSummaryImpl::Private::Steps::summaryReadStep(node1.(FlowSummaryNode).getSummaryNode(), c,
node2.(FlowSummaryNode).getSummaryNode())
or
VariableCapture::readStep(node1, c, node2)
}
/**
* Holds if values stored inside content `c` are cleared at node `n`. For example,
* any value stored inside `f` is cleared at the pre-update node associated with `x`
* in `x.f = newValue`.
* Holds if data can flow from `node1` to `node2` via a read of content `c`.
*/
predicate clearsContent(Node n, ContentSet c) {
fieldOrPropertyStore(_, c, _, n.asExpr(), true)
or
fieldOrPropertyStore(_, c, _, n.(ObjectInitializerNode).getInitializer(), false)
or
FlowSummaryImpl::Private::Steps::summaryClearsContent(n.(FlowSummaryNode).getSummaryNode(), c)
or
exists(WithExpr we, ObjectInitializer oi, FieldOrProperty f |
oi = we.getInitializer() and
n.asExpr() = oi and
f = oi.getAMemberInitializer().getInitializedMember() and
c = f.getContent()
predicate readStep(Node node1, ContentSet c, Node node2) {
exists(Content cont |
readContentStep(node1, cont, node2) and
c.isSingleton(cont)
)
or
exists(ReadStepConfiguration x | hasNodePath(x, node1, node2) |
fieldOrPropertyRead(node1.asExpr(), c, node2.asExpr())
or
node2.asExpr().(AwaitExpr).getExpr() = node1.asExpr() and
c = getResultContent()
)
or
FlowSummaryImpl::Private::Steps::summaryReadStep(node1.(FlowSummaryNode).getSummaryNode(), c,
node2.(FlowSummaryNode).getSummaryNode())
}
private predicate clearsCont(Node n, Content c) {
exists(Argument a, Struct s, Field f |
a = n.(PostUpdateNode).getPreUpdateNode().asExpr() and
a.getType() = s and
@@ -2442,6 +2454,31 @@ predicate clearsContent(Node n, ContentSet c) {
VariableCapture::clearsContent(n, c)
}
/**
* Holds if values stored inside content `c` are cleared at node `n`. For example,
* any value stored inside `f` is cleared at the pre-update node associated with `x`
* in `x.f = newValue`.
*/
predicate clearsContent(Node n, ContentSet c) {
exists(Content cont |
clearsCont(n, cont) and
c.isSingleton(cont)
)
or
fieldOrPropertyStore(_, c, _, n.asExpr(), true)
or
fieldOrPropertyStore(_, c, _, n.(ObjectInitializerNode).getInitializer(), false)
or
FlowSummaryImpl::Private::Steps::summaryClearsContent(n.(FlowSummaryNode).getSummaryNode(), c)
or
exists(WithExpr we, ObjectInitializer oi, FieldOrProperty f |
oi = we.getInitializer() and
n.asExpr() = oi and
f = oi.getAMemberInitializer().getInitializedMember() and
c = f.getContentSet()
)
}
/**
* Holds if the value that is being tracked is expected to be stored inside content `c`
* at node `n`.
@@ -2449,7 +2486,7 @@ predicate clearsContent(Node n, ContentSet c) {
predicate expectsContent(Node n, ContentSet c) {
FlowSummaryImpl::Private::Steps::summaryExpectsContent(n.(FlowSummaryNode).getSummaryNode(), c)
or
n.asExpr() instanceof SpreadElementExpr and c instanceof ElementContent
n.asExpr() instanceof SpreadElementExpr and c.isElement()
}
class NodeRegion instanceof ControlFlow::BasicBlock {
@@ -3050,8 +3087,3 @@ abstract class SyntheticField extends string {
/** Gets the type of this synthetic field. */
Type getType() { result instanceof ObjectType }
}
/**
* Holds if the the content `c` is a container.
*/
predicate containerContent(DataFlow::Content c) { c instanceof DataFlow::ElementContent }

View File

@@ -267,22 +267,82 @@ class CapturedVariableContent extends Content, TCapturedVariableContent {
override Location getLocation() { result = v.getLocation() }
}
/** Holds if property `p1` overrides or implements source declaration property `p2`. */
private predicate overridesOrImplementsSourceDecl(Property p1, Property p2) {
p1.getOverridee*().getUnboundDeclaration() = p2
or
p1.getAnUltimateImplementee().getUnboundDeclaration() = p2
}
/**
* An entity that represents a set of `Content`s.
*
* The set may be interpreted differently depending on whether it is
* stored into (`getAStoreContent`) or read from (`getAReadContent`).
*/
class ContentSet instanceof Content {
class ContentSet extends TContentSet {
/** Holds if this content set is the singleton `{c}`. */
predicate isSingleton(Content c) { this = TSingletonContent(c) }
/**
* Holds if this content set represents the property `p`.
*
*
* For `getAReadContent`, this set represents all properties that may
* (reflexively and transitively) override/implement `p` (or vice versa).
*/
predicate isProperty(Property p) { this = TPropertyContentSet(p) }
/** Holds if this content set represent the field `f`. */
predicate isField(Field f) { this.isSingleton(TFieldContent(f)) }
/** Holds if this content set represents an element in a collection. */
predicate isElement() { this.isSingleton(TElementContent()) }
/** Gets a content that may be stored into when storing into this set. */
Content getAStoreContent() { result = this }
Content getAStoreContent() {
this.isSingleton(result)
or
this.isProperty(result.(PropertyContent).getProperty())
}
/** Gets a content that may be read from when reading from this set. */
Content getAReadContent() { result = this }
Content getAReadContent() {
this.isSingleton(result)
or
exists(Property p1, Property p2 |
this.isProperty(p1) and
p2 = result.(PropertyContent).getProperty()
|
overridesOrImplementsSourceDecl(p2, p1)
or
overridesOrImplementsSourceDecl(p1, p2)
)
}
/** Gets a textual representation of this content set. */
string toString() { result = super.toString() }
string toString() {
exists(Content c |
this.isSingleton(c) and
result = c.toString()
)
or
exists(Property p |
this.isProperty(p) and
result = "property " + p.getName()
)
}
/** Gets the location of this content set. */
Location getLocation() { result = super.getLocation() }
Location getLocation() {
exists(Content c |
this.isSingleton(c) and
result = c.getLocation()
)
or
exists(Property p |
this.isProperty(p) and
result = p.getLocation()
)
}
}

View File

@@ -46,7 +46,7 @@ module Input implements InputSig<Location, DataFlowImplSpecific::CsharpDataFlow>
result = "delegate-self"
}
string encodeContent(ContentSet c, string arg) {
private string encodeCont(Content c, string arg) {
c = TElementContent() and result = "Element" and arg = ""
or
exists(Field f, string qualifier, string name |
@@ -56,27 +56,34 @@ module Input implements InputSig<Location, DataFlowImplSpecific::CsharpDataFlow>
result = "Field"
)
or
exists(Property p, string qualifier, string name |
c = TPropertyContent(p) and
p.hasFullyQualifiedName(qualifier, name) and
arg = getQualifiedName(qualifier, name) and
result = "Property"
)
or
exists(SyntheticField f |
c = TSyntheticFieldContent(f) and result = "SyntheticField" and arg = f
)
}
string encodeContent(ContentSet c, string arg) {
exists(Content cont |
c.isSingleton(cont) and
result = encodeCont(cont, arg)
)
or
exists(Property p, string qualifier, string name |
c.isProperty(p) and
p.hasFullyQualifiedName(qualifier, name) and
arg = getQualifiedName(qualifier, name) and
result = "Property"
)
}
string encodeWithoutContent(ContentSet c, string arg) {
result = "WithoutElement" and
c = TElementContent() and
c.isElement() and
arg = ""
}
string encodeWithContent(ContentSet c, string arg) {
result = "WithElement" and
c = TElementContent() and
c.isElement() and
arg = ""
}
@@ -103,12 +110,10 @@ private module TypesInput implements Impl::Private::TypesInputSig {
result.asGvnType() = Gvn::getGlobalValueNumber(any(ObjectType t))
}
DataFlowType getContentType(ContentSet c) {
private DataFlowType getContType(Content c) {
exists(Type t | result.asGvnType() = Gvn::getGlobalValueNumber(t) |
t = c.(FieldContent).getField().getType()
or
t = c.(PropertyContent).getProperty().getType()
or
t = c.(SyntheticFieldContent).getField().getType()
or
c instanceof ElementContent and
@@ -116,6 +121,17 @@ private module TypesInput implements Impl::Private::TypesInputSig {
)
}
DataFlowType getContentType(ContentSet c) {
exists(Content cont |
c.isSingleton(cont) and
result = getContType(cont)
)
or
exists(Property p |
c.isProperty(p) and result.asGvnType() = Gvn::getGlobalValueNumber(p.getType())
)
}
DataFlowType getParameterType(Impl::Public::SummarizedCallable c, ParameterPosition pos) {
exists(Type t | result.asGvnType() = Gvn::getGlobalValueNumber(t) |
exists(int i |
@@ -311,17 +327,16 @@ module Private {
}
/** Gets a summary component that represents an element in a collection. */
SummaryComponent element() { result = content(any(DataFlow::ElementContent c)) }
SummaryComponent element() { result = content(any(ContentSet cs | cs.isElement())) }
/** Gets a summary component for property `p`. */
SummaryComponent property(Property p) {
result =
content(any(DataFlow::PropertyContent c | c.getProperty() = p.getUnboundDeclaration()))
result = content(any(DataFlow::ContentSet c | c.isProperty(p.getUnboundDeclaration())))
}
/** Gets a summary component for field `f`. */
SummaryComponent field(Field f) {
result = content(any(DataFlow::FieldContent c | c.getField() = f.getUnboundDeclaration()))
result = content(any(DataFlow::ContentSet c | c.isField(f.getUnboundDeclaration())))
}
/** Gets a summary component that represents the return value of a call. */

View File

@@ -122,22 +122,22 @@ private module Cached {
FlowSummaryImpl::Private::Steps::summaryThroughStepTaint(nodeFrom, nodeTo, _)
or
// Taint collection by adding a tainted element
exists(DataFlow::ElementContent c |
exists(DataFlow::ContentSet c | c.isElement() |
storeStep(nodeFrom, c, nodeTo)
or
FlowSummaryImpl::Private::Steps::summarySetterStep(nodeFrom, c, nodeTo, _)
)
or
exists(DataFlow::Content c |
exists(DataFlow::ContentSet c |
readStep(nodeFrom, c, nodeTo)
or
FlowSummaryImpl::Private::Steps::summaryGetterStep(nodeFrom, c, nodeTo, _)
|
// Taint members
c = any(TaintedMember m).(FieldOrProperty).getContent()
c = any(TaintedMember m).(FieldOrProperty).getContentSet()
or
// Read from a tainted collection
c = TElementContent()
c.isElement()
)
)
}
@@ -152,12 +152,12 @@ private module Cached {
localTaintStepCommon(nodeFrom, nodeTo)
or
// Taint members
readStep(nodeFrom, any(TaintedMember m).(FieldOrProperty).getContent(), nodeTo)
readStep(nodeFrom, any(TaintedMember m).(FieldOrProperty).getContentSet(), nodeTo)
or
// Although flow through collections is modeled precisely using stores/reads, we still
// allow flow out of a _tainted_ collection. This is needed in order to support taint-
// tracking configurations where the source is a collection
readStep(nodeFrom, TElementContent(), nodeTo)
readStep(nodeFrom, any(DataFlow::ContentSet c | c.isElement()), nodeTo)
or
nodeTo = nodeFrom.(DataFlow::NonLocalJumpNode).getAJumpSuccessor(false)
) and

View File

@@ -282,12 +282,12 @@ module EntityFramework {
* If `t2` is a column type, `c2` will be included in the model (see
* https://docs.microsoft.com/en-us/ef/core/modeling/entity-types?tabs=data-annotations).
*/
private predicate step(Content c1, Type t1, Content c2, Type t2, int dist) {
private predicate step(ContentSet c1, Type t1, ContentSet c2, Type t2, int dist) {
exists(Property p1 |
p1 = this.getADbSetProperty(t2) and
c1.(PropertyContent).getProperty() = p1 and
c1.isProperty(p1) and
t1 = p1.getType() and
c2 instanceof ElementContent and
c2.isElement() and
dist = 0
)
or
@@ -299,17 +299,17 @@ module EntityFramework {
exists(Property p2 |
p2.getDeclaringType().(Class) = t1 and
not isColumnType(t1) and
c2.(PropertyContent).getProperty() = p2 and
c2.isProperty(p2) and
t2 = p2.getType() and
not isNotMapped(p2)
)
or
exists(ConstructedInterface ci |
c1 instanceof PropertyContent and
c1.isProperty(_) and
t1.(ValueOrRefType).getABaseType*() = ci and
not t1 instanceof StringType and
ci.getUnboundDeclaration() instanceof SystemCollectionsGenericIEnumerableTInterface and
c2 instanceof ElementContent and
c2.isElement() and
t2 = ci.getTypeArgument(0)
)
)
@@ -340,16 +340,16 @@ module EntityFramework {
* ```
*/
Property getAColumnProperty(int dist) {
exists(PropertyContent c, Type t |
exists(ContentSet c, Type t |
this.step(_, _, c, t, dist) and
c.getProperty() = result and
c.isProperty(result) and
isColumnType(t)
)
}
private predicate stepRev(Content c1, Type t1, Content c2, Type t2, int dist) {
private predicate stepRev(ContentSet c1, Type t1, ContentSet c2, Type t2, int dist) {
this.step(c1, t1, c2, t2, dist) and
c2.(PropertyContent).getProperty() = this.getAColumnProperty(dist)
c2.isProperty(this.getAColumnProperty(dist))
or
this.stepRev(c2, t2, _, _, dist + 1) and
this.step(c1, t1, c2, t2, dist)
@@ -364,13 +364,13 @@ module EntityFramework {
/** Holds if component stack `head :: tail` is required for the input specification. */
predicate requiresComponentStackIn(
Content head, Type headType, SummaryComponentStack tail, int dist
ContentSet head, Type headType, SummaryComponentStack tail, int dist
) {
tail = SummaryComponentStack::qualifier() and
this.stepRev(head, headType, _, _, 0) and
dist = -1
or
exists(Content tailHead, Type tailType, SummaryComponentStack tailTail |
exists(ContentSet tailHead, Type tailType, SummaryComponentStack tailTail |
this.requiresComponentStackIn(tailHead, tailType, tailTail, dist - 1) and
tail = SummaryComponentStack::push(SummaryComponent::content(tailHead), tailTail) and
this.stepRev(tailHead, tailType, head, headType, dist)
@@ -379,18 +379,18 @@ module EntityFramework {
/** Holds if component stack `head :: tail` is required for the output specification. */
predicate requiresComponentStackOut(
Content head, Type headType, SummaryComponentStack tail, int dist,
ContentSet head, Type headType, SummaryComponentStack tail, int dist,
DbContextClassSetProperty dbSetProp
) {
exists(PropertyContent c1 |
exists(ContentSet c1 |
dbSetProp = this.getADbSetProperty(headType) and
this.stepRev(c1, _, head, headType, 0) and
c1.getProperty() = dbSetProp and
c1.isProperty(dbSetProp) and
tail = SummaryComponentStack::return() and
dist = 0
)
or
exists(Content tailHead, SummaryComponentStack tailTail, Type tailType |
exists(ContentSet tailHead, SummaryComponentStack tailTail, Type tailType |
this.requiresComponentStackOut(tailHead, tailType, tailTail, dist - 1, dbSetProp) and
tail = SummaryComponentStack::push(SummaryComponent::content(tailHead), tailTail) and
this.stepRev(tailHead, tailType, head, headType, dist)
@@ -402,9 +402,9 @@ module EntityFramework {
*/
pragma[noinline]
predicate input(SummaryComponentStack input, Property mapped) {
exists(PropertyContent head, SummaryComponentStack tail |
exists(ContentSet head, SummaryComponentStack tail |
this.requiresComponentStackIn(head, _, tail, _) and
head.getProperty() = mapped and
head.isProperty(mapped) and
mapped = this.getAColumnProperty(_) and
input = SummaryComponentStack::push(SummaryComponent::content(head), tail)
)
@@ -418,9 +418,9 @@ module EntityFramework {
private predicate output(
SummaryComponentStack output, Property mapped, DbContextClassSetProperty dbSet
) {
exists(PropertyContent head, SummaryComponentStack tail |
exists(ContentSet head, SummaryComponentStack tail |
this.requiresComponentStackOut(head, _, tail, _, dbSet) and
head.getProperty() = mapped and
head.isProperty(mapped) and
mapped = this.getAColumnProperty(_) and
output = SummaryComponentStack::push(SummaryComponent::content(head), tail)
)
@@ -505,7 +505,7 @@ module EntityFramework {
private class DbContextSaveChangesRequiredSummaryComponentStack extends RequiredSummaryComponentStack
{
override predicate required(SummaryComponent head, SummaryComponentStack tail) {
exists(Content c | head = SummaryComponent::content(c) |
exists(ContentSet c | head = SummaryComponent::content(c) |
any(DbContextClass cls).requiresComponentStackIn(c, _, tail, _)
or
any(DbContextClass cls).requiresComponentStackOut(c, _, tail, _, _)

View File

@@ -205,7 +205,6 @@ class MicrosoftAspNetCoreMvcController extends Class {
)
) and
this.isPublic() and
(not this.isAbstract() or this instanceof MicrosoftAspNetCoreMvcControllerBaseClass) and
not this instanceof Generic and
(
this.getABaseType*() instanceof MicrosoftAspNetCoreMvcControllerBaseClass

View File

@@ -12,6 +12,7 @@ import DatabaseQuality
predicate compilationInfo(string key, float value) {
not key.matches("Compiler diagnostic count for%") and
not key.matches("Extractor message count for group%") and
exists(Compilation c, string infoKey, string infoValue | infoValue = c.getInfo(infoKey) |
key = infoKey and
value = infoValue.toFloat()
@@ -22,6 +23,16 @@ predicate compilationInfo(string key, float value) {
)
}
predicate compilerDiagnostics(string key, int value) {
key.matches("Compiler diagnostic count for%") and
strictsum(Compilation c | | c.getInfo(key).toInt()) = value
}
predicate extractorMessages(string key, int value) {
key.matches("Extractor message count for group%") and
strictsum(Compilation c | | c.getInfo(key).toInt()) = value
}
predicate fileCount(string key, int value) {
key = "Number of files" and
value = strictcount(File f)
@@ -140,6 +151,8 @@ from string key, float value
where
(
compilationInfo(key, value) or
compilerDiagnostics(key, value) or
extractorMessages(key, value) or
fileCount(key, value) or
fileCountByExtension(key, value) or
totalNumberOfLines(key, value) or

View File

@@ -0,0 +1,27 @@
/**
* @name Capture Summary Models Partial Path
* @description Capture Summary Models Partial Path
* @kind path-problem
* @precision low
* @id csharp/utils/modelgenerator/summary-models-partial-path
* @severity info
* @tags modelgenerator
*/
import csharp
import utils.modelgenerator.internal.CaptureModels
import PartialFlow::PartialPathGraph
int explorationLimit() { result = 3 }
module PartialFlow = PropagateFlow::FlowExplorationFwd<explorationLimit/0>;
from
PartialFlow::PartialPathNode source, PartialFlow::PartialPathNode sink,
DataFlowSummaryTargetApi api, DataFlow::ParameterNode p
where
PartialFlow::partialFlow(source, sink, _) and
p = source.getNode() and
p.asParameter() = api.getAParameter()
select sink.getNode(), source, sink, "There is flow from a $@ to $@.", source.getNode(),
"parameter", sink.getNode(), "intermediate value"

View File

@@ -0,0 +1,24 @@
/**
* @name Capture Summary Models Path
* @description Capture Summary Models Path
* @kind path-problem
* @precision low
* @id csharp/utils/modelgenerator/summary-models-path
* @severity warning
* @tags modelgenerator
*/
import csharp
import utils.modelgenerator.internal.CaptureModels
import PropagateFlow::PathGraph
from
PropagateFlow::PathNode source, PropagateFlow::PathNode sink, DataFlowSummaryTargetApi api,
DataFlow::Node p, DataFlow::Node returnNodeExt
where
PropagateFlow::flowPath(source, sink) and
p = source.getNode() and
returnNodeExt = sink.getNode() and
exists(captureThroughFlow0(api, p, returnNodeExt))
select sink.getNode(), source, sink, "There is flow from $@ to the $@.", source.getNode(),
"parameter", sink.getNode(), "return value"

View File

@@ -0,0 +1 @@
The queries in this directory are purely used for model generator debugging purposes in VS Code.

View File

@@ -50,7 +50,7 @@ module Printing = ModelPrinting<ModelPrintingInput>;
/**
* Holds if `c` is a relevant content kind, where the underlying type is relevant.
*/
private predicate isRelevantTypeInContent(DataFlow::Content c) {
private predicate isRelevantTypeInContent(DataFlow::ContentSet c) {
isRelevantType(getUnderlyingContentType(c))
}
@@ -58,24 +58,22 @@ private predicate isRelevantTypeInContent(DataFlow::Content c) {
* Holds if data can flow from `node1` to `node2` either via a read or a write of an intermediate field `f`.
*/
private predicate isRelevantTaintStep(DataFlow::Node node1, DataFlow::Node node2) {
exists(DataFlow::Content f |
exists(DataFlow::ContentSet f |
DataFlowPrivate::readStep(node1, f, node2) and
// Partially restrict the content types used for intermediate steps.
(not exists(getUnderlyingContentType(f)) or isRelevantTypeInContent(f))
)
or
exists(DataFlow::Content f | DataFlowPrivate::storeStep(node1, f, node2) |
DataFlowPrivate::containerContent(f)
)
exists(DataFlow::ContentSet f | DataFlowPrivate::storeStep(node1, f, node2) | containerContent(f))
}
/**
* Holds if content `c` is either a field, a synthetic field or language specific
* content of a relevant type or a container like content.
*/
private predicate isRelevantContent(DataFlow::Content c) {
private predicate isRelevantContent(DataFlow::ContentSet c) {
isRelevantTypeInContent(c) or
DataFlowPrivate::containerContent(c)
containerContent(c)
}
/**
@@ -170,8 +168,8 @@ module PropagateFlowConfig implements DataFlow::StateConfigSig {
predicate isAdditionalFlowStep(
DataFlow::Node node1, FlowState state1, DataFlow::Node node2, FlowState state2
) {
exists(DataFlow::Content c |
DataFlowImplCommon::store(node1, c, node2, _, _) and
exists(DataFlow::ContentSet c |
DataFlowImplCommon::store(node1, c.getAStoreContent(), node2, _, _) and
isRelevantContent(c) and
(
state1 instanceof TaintRead and state2.(TaintStore).getStep() = 1
@@ -180,7 +178,7 @@ module PropagateFlowConfig implements DataFlow::StateConfigSig {
)
)
or
exists(DataFlow::Content c |
exists(DataFlow::ContentSet c |
DataFlowPrivate::readStep(node1, c, node2) and
isRelevantContent(c) and
state1.(TaintRead).getStep() + 1 = state2.(TaintRead).getStep()
@@ -196,14 +194,13 @@ module PropagateFlowConfig implements DataFlow::StateConfigSig {
}
}
private module PropagateFlow = TaintTracking::GlobalWithState<PropagateFlowConfig>;
module PropagateFlow = TaintTracking::GlobalWithState<PropagateFlowConfig>;
/**
* Gets the summary model(s) of `api`, if there is flow from parameters to return value or parameter.
*/
string captureThroughFlow(DataFlowSummaryTargetApi api) {
exists(DataFlow::ParameterNode p, ReturnNodeExt returnNodeExt, string input, string output |
PropagateFlow::flow(p, returnNodeExt) and
string captureThroughFlow0(
DataFlowSummaryTargetApi api, DataFlow::ParameterNode p, ReturnNodeExt returnNodeExt
) {
exists(string input, string output |
p.getEnclosingCallable() = api and
returnNodeExt.(DataFlow::Node).getEnclosingCallable() = api and
input = parameterNodeAsInput(p) and
output = returnNodeExt.getOutput() and
@@ -212,6 +209,16 @@ string captureThroughFlow(DataFlowSummaryTargetApi api) {
)
}
/**
* Gets the summary model(s) of `api`, if there is flow from parameters to return value or parameter.
*/
string captureThroughFlow(DataFlowSummaryTargetApi api) {
exists(DataFlow::ParameterNode p, ReturnNodeExt returnNodeExt |
PropagateFlow::flow(p, returnNodeExt) and
result = captureThroughFlow0(api, p, returnNodeExt)
)
}
/**
* A dataflow configuration used for finding new sources.
* The sources are the already known existing sources and the sinks are the API return nodes.

View File

@@ -210,10 +210,24 @@ predicate isRelevantType(CS::Type t) {
/**
* Gets the underlying type of the content `c`.
*/
CS::Type getUnderlyingContentType(DataFlow::Content c) {
private CS::Type getUnderlyingContType(DataFlow::Content c) {
result = c.(DataFlow::FieldContent).getField().getType() or
result = c.(DataFlow::SyntheticFieldContent).getField().getType() or
result = c.(DataFlow::PropertyContent).getProperty().getType()
result = c.(DataFlow::SyntheticFieldContent).getField().getType()
}
/**
* Gets the underlying type of the content `c`.
*/
CS::Type getUnderlyingContentType(DataFlow::ContentSet c) {
exists(DataFlow::Content cont |
c.isSingleton(cont) and
result = getUnderlyingContType(cont)
)
or
exists(CS::Property p |
c.isProperty(p) and
result = p.getType()
)
}
/**
@@ -325,3 +339,8 @@ predicate isRelevantSinkKind(string kind) { any() }
*/
bindingset[kind]
predicate isRelevantSourceKind(string kind) { any() }
/**
* Holds if the the content `c` is a container.
*/
predicate containerContent(DataFlow::ContentSet c) { c.isElement() }

View File

@@ -52,12 +52,10 @@ edges
| CollectionFlow.cs:30:69:30:72 | access to parameter dict : Dictionary<T,T> [element, property Value] : A | CollectionFlow.cs:30:69:30:79 | access to property Values : ICollection<T> [element] : A | provenance | MaD:2 |
| CollectionFlow.cs:30:69:30:72 | access to parameter dict : Dictionary<T,T> [element, property Value] : A | CollectionFlow.cs:30:69:30:79 | access to property Values : ICollection<T> [element] : A | provenance | MaD:8 |
| CollectionFlow.cs:30:69:30:79 | access to property Values : ICollection<T> [element] : A | CollectionFlow.cs:30:69:30:87 | call to method First<T> : A | provenance | MaD:16 |
| CollectionFlow.cs:30:69:30:79 | access to property Values : ICollection<T> [element] : A | CollectionFlow.cs:30:69:30:87 | call to method First<T> : A | provenance | MaD:16 |
| CollectionFlow.cs:32:58:32:61 | dict : Dictionary<T,T> [element, property Key] : A | CollectionFlow.cs:32:67:32:70 | access to parameter dict : Dictionary<T,T> [element, property Key] : A | provenance | |
| CollectionFlow.cs:32:67:32:70 | access to parameter dict : Dictionary<T,T> [element, property Key] : A | CollectionFlow.cs:32:67:32:75 | access to property Keys : ICollection<T> [element] : A | provenance | MaD:1 |
| CollectionFlow.cs:32:67:32:70 | access to parameter dict : Dictionary<T,T> [element, property Key] : A | CollectionFlow.cs:32:67:32:75 | access to property Keys : ICollection<T> [element] : A | provenance | MaD:7 |
| CollectionFlow.cs:32:67:32:75 | access to property Keys : ICollection<T> [element] : A | CollectionFlow.cs:32:67:32:83 | call to method First<T> : A | provenance | MaD:16 |
| CollectionFlow.cs:32:67:32:75 | access to property Keys : ICollection<T> [element] : A | CollectionFlow.cs:32:67:32:83 | call to method First<T> : A | provenance | MaD:16 |
| CollectionFlow.cs:34:57:34:60 | dict : Dictionary<T,T> [element, property Key] : A | CollectionFlow.cs:34:66:34:69 | access to parameter dict : Dictionary<T,T> [element, property Key] : A | provenance | |
| CollectionFlow.cs:34:66:34:69 | access to parameter dict : Dictionary<T,T> [element, property Key] : A | CollectionFlow.cs:34:66:34:77 | call to method First<KeyValuePair<T,Int32>> : KeyValuePair<T,Int32> [property Key] : A | provenance | MaD:16 |
| CollectionFlow.cs:34:66:34:77 | call to method First<KeyValuePair<T,Int32>> : KeyValuePair<T,Int32> [property Key] : A | CollectionFlow.cs:34:66:34:81 | access to property Key : A | provenance | |
@@ -378,14 +376,10 @@ nodes
| CollectionFlow.cs:30:60:30:63 | dict : Dictionary<T,T> [element, property Value] : A | semmle.label | dict : Dictionary<T,T> [element, property Value] : A |
| CollectionFlow.cs:30:69:30:72 | access to parameter dict : Dictionary<T,T> [element, property Value] : A | semmle.label | access to parameter dict : Dictionary<T,T> [element, property Value] : A |
| CollectionFlow.cs:30:69:30:79 | access to property Values : ICollection<T> [element] : A | semmle.label | access to property Values : ICollection<T> [element] : A |
| CollectionFlow.cs:30:69:30:79 | access to property Values : ICollection<T> [element] : A | semmle.label | access to property Values : ICollection<T> [element] : A |
| CollectionFlow.cs:30:69:30:87 | call to method First<T> : A | semmle.label | call to method First<T> : A |
| CollectionFlow.cs:30:69:30:87 | call to method First<T> : A | semmle.label | call to method First<T> : A |
| CollectionFlow.cs:32:58:32:61 | dict : Dictionary<T,T> [element, property Key] : A | semmle.label | dict : Dictionary<T,T> [element, property Key] : A |
| CollectionFlow.cs:32:67:32:70 | access to parameter dict : Dictionary<T,T> [element, property Key] : A | semmle.label | access to parameter dict : Dictionary<T,T> [element, property Key] : A |
| CollectionFlow.cs:32:67:32:75 | access to property Keys : ICollection<T> [element] : A | semmle.label | access to property Keys : ICollection<T> [element] : A |
| CollectionFlow.cs:32:67:32:75 | access to property Keys : ICollection<T> [element] : A | semmle.label | access to property Keys : ICollection<T> [element] : A |
| CollectionFlow.cs:32:67:32:83 | call to method First<T> : A | semmle.label | call to method First<T> : A |
| CollectionFlow.cs:32:67:32:83 | call to method First<T> : A | semmle.label | call to method First<T> : A |
| CollectionFlow.cs:34:57:34:60 | dict : Dictionary<T,T> [element, property Key] : A | semmle.label | dict : Dictionary<T,T> [element, property Key] : A |
| CollectionFlow.cs:34:66:34:69 | access to parameter dict : Dictionary<T,T> [element, property Key] : A | semmle.label | access to parameter dict : Dictionary<T,T> [element, property Key] : A |
@@ -671,20 +665,15 @@ subpaths
| CollectionFlow.cs:156:28:156:31 | access to local variable dict : Dictionary<T,T> [element, property Value] : A | CollectionFlow.cs:26:58:26:61 | dict : Dictionary<T,T> [element, property Value] : A | CollectionFlow.cs:26:67:26:73 | access to indexer : A | CollectionFlow.cs:156:14:156:32 | call to method DictIndexZero<A> |
| CollectionFlow.cs:157:29:157:32 | access to local variable dict : Dictionary<T,T> [element, property Value] : A | CollectionFlow.cs:28:59:28:62 | dict : Dictionary<T,T> [element, property Value] : A | CollectionFlow.cs:28:68:28:85 | access to property Value : A | CollectionFlow.cs:157:14:157:33 | call to method DictFirstValue<A> |
| CollectionFlow.cs:158:30:158:33 | access to local variable dict : Dictionary<T,T> [element, property Value] : A | CollectionFlow.cs:30:60:30:63 | dict : Dictionary<T,T> [element, property Value] : A | CollectionFlow.cs:30:69:30:87 | call to method First<T> : A | CollectionFlow.cs:158:14:158:34 | call to method DictValuesFirst<A> |
| CollectionFlow.cs:158:30:158:33 | access to local variable dict : Dictionary<T,T> [element, property Value] : A | CollectionFlow.cs:30:60:30:63 | dict : Dictionary<T,T> [element, property Value] : A | CollectionFlow.cs:30:69:30:87 | call to method First<T> : A | CollectionFlow.cs:158:14:158:34 | call to method DictValuesFirst<A> |
| CollectionFlow.cs:178:28:178:31 | access to local variable dict : Dictionary<T,T> [element, property Value] : A | CollectionFlow.cs:26:58:26:61 | dict : Dictionary<T,T> [element, property Value] : A | CollectionFlow.cs:26:67:26:73 | access to indexer : A | CollectionFlow.cs:178:14:178:32 | call to method DictIndexZero<A> |
| CollectionFlow.cs:179:29:179:32 | access to local variable dict : Dictionary<T,T> [element, property Value] : A | CollectionFlow.cs:28:59:28:62 | dict : Dictionary<T,T> [element, property Value] : A | CollectionFlow.cs:28:68:28:85 | access to property Value : A | CollectionFlow.cs:179:14:179:33 | call to method DictFirstValue<A> |
| CollectionFlow.cs:180:30:180:33 | access to local variable dict : Dictionary<T,T> [element, property Value] : A | CollectionFlow.cs:30:60:30:63 | dict : Dictionary<T,T> [element, property Value] : A | CollectionFlow.cs:30:69:30:87 | call to method First<T> : A | CollectionFlow.cs:180:14:180:34 | call to method DictValuesFirst<A> |
| CollectionFlow.cs:180:30:180:33 | access to local variable dict : Dictionary<T,T> [element, property Value] : A | CollectionFlow.cs:30:60:30:63 | dict : Dictionary<T,T> [element, property Value] : A | CollectionFlow.cs:30:69:30:87 | call to method First<T> : A | CollectionFlow.cs:180:14:180:34 | call to method DictValuesFirst<A> |
| CollectionFlow.cs:199:28:199:31 | access to local variable dict : Dictionary<T,T> [element, property Value] : A | CollectionFlow.cs:26:58:26:61 | dict : Dictionary<T,T> [element, property Value] : A | CollectionFlow.cs:26:67:26:73 | access to indexer : A | CollectionFlow.cs:199:14:199:32 | call to method DictIndexZero<A> |
| CollectionFlow.cs:200:29:200:32 | access to local variable dict : Dictionary<T,T> [element, property Value] : A | CollectionFlow.cs:28:59:28:62 | dict : Dictionary<T,T> [element, property Value] : A | CollectionFlow.cs:28:68:28:85 | access to property Value : A | CollectionFlow.cs:200:14:200:33 | call to method DictFirstValue<A> |
| CollectionFlow.cs:201:30:201:33 | access to local variable dict : Dictionary<T,T> [element, property Value] : A | CollectionFlow.cs:30:60:30:63 | dict : Dictionary<T,T> [element, property Value] : A | CollectionFlow.cs:30:69:30:87 | call to method First<T> : A | CollectionFlow.cs:201:14:201:34 | call to method DictValuesFirst<A> |
| CollectionFlow.cs:201:30:201:33 | access to local variable dict : Dictionary<T,T> [element, property Value] : A | CollectionFlow.cs:30:60:30:63 | dict : Dictionary<T,T> [element, property Value] : A | CollectionFlow.cs:30:69:30:87 | call to method First<T> : A | CollectionFlow.cs:201:14:201:34 | call to method DictValuesFirst<A> |
| CollectionFlow.cs:221:28:221:31 | access to local variable dict : Dictionary<T,T> [element, property Key] : A | CollectionFlow.cs:32:58:32:61 | dict : Dictionary<T,T> [element, property Key] : A | CollectionFlow.cs:32:67:32:83 | call to method First<T> : A | CollectionFlow.cs:221:14:221:32 | call to method DictKeysFirst<A> |
| CollectionFlow.cs:221:28:221:31 | access to local variable dict : Dictionary<T,T> [element, property Key] : A | CollectionFlow.cs:32:58:32:61 | dict : Dictionary<T,T> [element, property Key] : A | CollectionFlow.cs:32:67:32:83 | call to method First<T> : A | CollectionFlow.cs:221:14:221:32 | call to method DictKeysFirst<A> |
| CollectionFlow.cs:222:27:222:30 | access to local variable dict : Dictionary<T,T> [element, property Key] : A | CollectionFlow.cs:34:57:34:60 | dict : Dictionary<T,T> [element, property Key] : A | CollectionFlow.cs:34:66:34:81 | access to property Key : A | CollectionFlow.cs:222:14:222:31 | call to method DictFirstKey<A> |
| CollectionFlow.cs:240:28:240:31 | access to local variable dict : Dictionary<T,T> [element, property Key] : A | CollectionFlow.cs:32:58:32:61 | dict : Dictionary<T,T> [element, property Key] : A | CollectionFlow.cs:32:67:32:83 | call to method First<T> : A | CollectionFlow.cs:240:14:240:32 | call to method DictKeysFirst<A> |
| CollectionFlow.cs:240:28:240:31 | access to local variable dict : Dictionary<T,T> [element, property Key] : A | CollectionFlow.cs:32:58:32:61 | dict : Dictionary<T,T> [element, property Key] : A | CollectionFlow.cs:32:67:32:83 | call to method First<T> : A | CollectionFlow.cs:240:14:240:32 | call to method DictKeysFirst<A> |
| CollectionFlow.cs:241:27:241:30 | access to local variable dict : Dictionary<T,T> [element, property Key] : A | CollectionFlow.cs:34:57:34:60 | dict : Dictionary<T,T> [element, property Key] : A | CollectionFlow.cs:34:66:34:81 | access to property Key : A | CollectionFlow.cs:241:14:241:31 | call to method DictFirstKey<A> |
| CollectionFlow.cs:334:23:334:23 | access to local variable a : A | CollectionFlow.cs:328:32:328:38 | element : A | CollectionFlow.cs:328:23:328:27 | array [Return] : A[] [element] : A | CollectionFlow.cs:334:18:334:20 | [post] access to local variable as : A[] [element] : A |
| CollectionFlow.cs:337:20:337:22 | access to local variable as : A[] [element] : A | CollectionFlow.cs:22:34:22:35 | ts : A[] [element] : A | CollectionFlow.cs:22:41:22:45 | access to array element : A | CollectionFlow.cs:337:14:337:23 | call to method First<A> |

View File

@@ -16,10 +16,10 @@ query predicate summaryThroughStep(
preservesValue = false
}
query predicate summaryGetterStep(DataFlow::Node arg, DataFlow::Node out, Content c) {
query predicate summaryGetterStep(DataFlow::Node arg, DataFlow::Node out, ContentSet c) {
FlowSummaryImpl::Private::Steps::summaryGetterStep(arg, c, out, _)
}
query predicate summarySetterStep(DataFlow::Node arg, DataFlow::Node out, Content c) {
query predicate summarySetterStep(DataFlow::Node arg, DataFlow::Node out, ContentSet c) {
FlowSummaryImpl::Private::Steps::summarySetterStep(arg, c, out, _)
}

View File

@@ -58,4 +58,9 @@ namespace Testing
app.Run();
}
}
}
public abstract class AbstractTestController : Controller
{
public void MyActionMethod(string param) { }
}
}

View File

@@ -12,3 +12,4 @@ remoteFlowSources
| AspRemoteFlowSource.cs:53:63:53:73 | mapPutParam |
| AspRemoteFlowSource.cs:54:69:54:82 | mapDeleteParam |
| AspRemoteFlowSource.cs:56:41:56:44 | item |
| AspRemoteFlowSource.cs:64:43:64:47 | param |

View File

@@ -301,14 +301,22 @@ edges
| GlobalDataFlow.cs:89:13:89:18 | access to local variable sink17 : String | GlobalDataFlow.cs:90:15:90:20 | access to local variable sink17 | provenance | |
| GlobalDataFlow.cs:89:22:89:110 | call to method Aggregate<String,String,String> : String | GlobalDataFlow.cs:89:13:89:18 | access to local variable sink17 : String | provenance | |
| GlobalDataFlow.cs:89:23:89:66 | (...) ... : null [element] : String | GlobalDataFlow.cs:89:22:89:110 | call to method Aggregate<String,String,String> : String | provenance | MaD:2 |
| GlobalDataFlow.cs:89:23:89:66 | (...) ... : null [element] : String | GlobalDataFlow.cs:89:89:89:89 | s : String | provenance | MaD:2 |
| GlobalDataFlow.cs:89:23:89:66 | (...) ... : null [element] : String | GlobalDataFlow.cs:89:104:89:104 | x : String | provenance | MaD:2 |
| GlobalDataFlow.cs:89:57:89:66 | { ..., ... } : null [element] : String | GlobalDataFlow.cs:89:23:89:66 | (...) ... : null [element] : String | provenance | |
| GlobalDataFlow.cs:89:59:89:64 | access to local variable sink14 : String | GlobalDataFlow.cs:89:57:89:66 | { ..., ... } : null [element] : String | provenance | |
| GlobalDataFlow.cs:89:89:89:89 | s : String | GlobalDataFlow.cs:89:95:89:101 | ... + ... : String | provenance | |
| GlobalDataFlow.cs:89:104:89:104 | x : String | GlobalDataFlow.cs:89:109:89:109 | access to parameter x : String | provenance | |
| GlobalDataFlow.cs:91:13:91:18 | access to local variable sink18 : String | GlobalDataFlow.cs:92:15:92:20 | access to local variable sink18 | provenance | |
| GlobalDataFlow.cs:91:13:91:18 | access to local variable sink18 : String | GlobalDataFlow.cs:94:24:94:29 | access to local variable sink18 : String | provenance | |
| GlobalDataFlow.cs:91:13:91:18 | access to local variable sink18 : String | GlobalDataFlow.cs:97:23:97:28 | access to local variable sink18 : String | provenance | |
| GlobalDataFlow.cs:91:13:91:18 | access to local variable sink18 : String | GlobalDataFlow.cs:100:24:100:29 | access to local variable sink18 : String | provenance | |
| GlobalDataFlow.cs:91:22:91:110 | call to method Aggregate<String,String,String> : String | GlobalDataFlow.cs:91:13:91:18 | access to local variable sink18 : String | provenance | |
| GlobalDataFlow.cs:91:75:91:80 | access to local variable sink14 : String | GlobalDataFlow.cs:91:22:91:110 | call to method Aggregate<String,String,String> : String | provenance | MaD:3 |
| GlobalDataFlow.cs:91:75:91:80 | access to local variable sink14 : String | GlobalDataFlow.cs:91:84:91:86 | acc : String | provenance | MaD:3 |
| GlobalDataFlow.cs:91:75:91:80 | access to local variable sink14 : String | GlobalDataFlow.cs:91:104:91:104 | x : String | provenance | MaD:3 |
| GlobalDataFlow.cs:91:84:91:86 | acc : String | GlobalDataFlow.cs:91:95:91:101 | ... + ... : String | provenance | |
| GlobalDataFlow.cs:91:104:91:104 | x : String | GlobalDataFlow.cs:91:109:91:109 | access to parameter x : String | provenance | |
| GlobalDataFlow.cs:94:24:94:29 | access to local variable sink18 : String | GlobalDataFlow.cs:94:36:94:41 | access to local variable sink21 : Int32 | provenance | MaD:22 |
| GlobalDataFlow.cs:94:36:94:41 | access to local variable sink21 : Int32 | GlobalDataFlow.cs:95:15:95:20 | access to local variable sink21 | provenance | |
| GlobalDataFlow.cs:97:23:97:28 | access to local variable sink18 : String | GlobalDataFlow.cs:97:35:97:40 | access to local variable sink22 : Boolean | provenance | MaD:20 |
@@ -788,10 +796,18 @@ nodes
| GlobalDataFlow.cs:89:23:89:66 | (...) ... : null [element] : String | semmle.label | (...) ... : null [element] : String |
| GlobalDataFlow.cs:89:57:89:66 | { ..., ... } : null [element] : String | semmle.label | { ..., ... } : null [element] : String |
| GlobalDataFlow.cs:89:59:89:64 | access to local variable sink14 : String | semmle.label | access to local variable sink14 : String |
| GlobalDataFlow.cs:89:89:89:89 | s : String | semmle.label | s : String |
| GlobalDataFlow.cs:89:95:89:101 | ... + ... : String | semmle.label | ... + ... : String |
| GlobalDataFlow.cs:89:104:89:104 | x : String | semmle.label | x : String |
| GlobalDataFlow.cs:89:109:89:109 | access to parameter x : String | semmle.label | access to parameter x : String |
| GlobalDataFlow.cs:90:15:90:20 | access to local variable sink17 | semmle.label | access to local variable sink17 |
| GlobalDataFlow.cs:91:13:91:18 | access to local variable sink18 : String | semmle.label | access to local variable sink18 : String |
| GlobalDataFlow.cs:91:22:91:110 | call to method Aggregate<String,String,String> : String | semmle.label | call to method Aggregate<String,String,String> : String |
| GlobalDataFlow.cs:91:75:91:80 | access to local variable sink14 : String | semmle.label | access to local variable sink14 : String |
| GlobalDataFlow.cs:91:84:91:86 | acc : String | semmle.label | acc : String |
| GlobalDataFlow.cs:91:95:91:101 | ... + ... : String | semmle.label | ... + ... : String |
| GlobalDataFlow.cs:91:104:91:104 | x : String | semmle.label | x : String |
| GlobalDataFlow.cs:91:109:91:109 | access to parameter x : String | semmle.label | access to parameter x : String |
| GlobalDataFlow.cs:92:15:92:20 | access to local variable sink18 | semmle.label | access to local variable sink18 |
| GlobalDataFlow.cs:94:24:94:29 | access to local variable sink18 : String | semmle.label | access to local variable sink18 : String |
| GlobalDataFlow.cs:94:36:94:41 | access to local variable sink21 : Int32 | semmle.label | access to local variable sink21 : Int32 |
@@ -1102,6 +1118,10 @@ subpaths
| GlobalDataFlow.cs:83:23:83:66 | (...) ... : null [element] : String | GlobalDataFlow.cs:315:31:315:40 | sinkParam8 : String | GlobalDataFlow.cs:318:16:318:25 | access to parameter sinkParam8 : String | GlobalDataFlow.cs:83:22:83:87 | call to method Select<String,String> : IEnumerable<T> [element] : String |
| GlobalDataFlow.cs:85:23:85:66 | (...) ... : null [element] : String | GlobalDataFlow.cs:85:118:85:118 | x : String | GlobalDataFlow.cs:85:127:85:127 | access to parameter x : String | GlobalDataFlow.cs:85:22:85:128 | call to method Zip<String,String,String> : IEnumerable<T> [element] : String |
| GlobalDataFlow.cs:87:70:87:113 | (...) ... : null [element] : String | GlobalDataFlow.cs:87:121:87:121 | y : String | GlobalDataFlow.cs:87:127:87:127 | access to parameter y : String | GlobalDataFlow.cs:87:22:87:128 | call to method Zip<String,String,String> : IEnumerable<T> [element] : String |
| GlobalDataFlow.cs:89:23:89:66 | (...) ... : null [element] : String | GlobalDataFlow.cs:89:89:89:89 | s : String | GlobalDataFlow.cs:89:95:89:101 | ... + ... : String | GlobalDataFlow.cs:89:22:89:110 | call to method Aggregate<String,String,String> : String |
| GlobalDataFlow.cs:89:23:89:66 | (...) ... : null [element] : String | GlobalDataFlow.cs:89:104:89:104 | x : String | GlobalDataFlow.cs:89:109:89:109 | access to parameter x : String | GlobalDataFlow.cs:89:22:89:110 | call to method Aggregate<String,String,String> : String |
| GlobalDataFlow.cs:91:75:91:80 | access to local variable sink14 : String | GlobalDataFlow.cs:91:84:91:86 | acc : String | GlobalDataFlow.cs:91:95:91:101 | ... + ... : String | GlobalDataFlow.cs:91:22:91:110 | call to method Aggregate<String,String,String> : String |
| GlobalDataFlow.cs:91:75:91:80 | access to local variable sink14 : String | GlobalDataFlow.cs:91:104:91:104 | x : String | GlobalDataFlow.cs:91:109:91:109 | access to parameter x : String | GlobalDataFlow.cs:91:22:91:110 | call to method Aggregate<String,String,String> : String |
| GlobalDataFlow.cs:138:63:138:63 | access to parameter x : String | GlobalDataFlow.cs:387:46:387:46 | x : String | GlobalDataFlow.cs:389:16:389:19 | delegate call : String | GlobalDataFlow.cs:138:45:138:64 | call to method ApplyFunc<String,String> : String |
| GlobalDataFlow.cs:139:29:139:33 | access to local variable sink3 : String | GlobalDataFlow.cs:138:40:138:40 | x : String | GlobalDataFlow.cs:138:45:138:64 | call to method ApplyFunc<String,String> : String | GlobalDataFlow.cs:139:21:139:34 | delegate call : String |
| GlobalDataFlow.cs:147:39:147:43 | access to local variable sink4 : String | GlobalDataFlow.cs:387:46:387:46 | x : String | GlobalDataFlow.cs:389:16:389:19 | delegate call : String | GlobalDataFlow.cs:147:21:147:44 | call to method ApplyFunc<String,String> : String |

View File

@@ -56,6 +56,15 @@ public class HomeController5 : HomeController4
}
}
// is abstract
public abstract class HomeController6 : Controller
{
public string Index()
{
return "This is Home Controller";
}
}
// is not public
internal class NotHomeController : Controller
{
@@ -65,17 +74,8 @@ internal class NotHomeController : Controller
}
}
// is abstract
public abstract class NotHomeController2 : Controller
{
public string Index()
{
return "This is Home Controller";
}
}
// contains generic parameters
public class NotHomeController3<T> : Controller
public class NotHomeController2<T> : Controller
{
public string Index()
{
@@ -85,7 +85,7 @@ public class NotHomeController3<T> : Controller
// has [NonController] attribute
[NonController]
public class NotHomeController4 : Controller
public class NotHomeController3 : Controller
{
public string Index()
{
@@ -94,10 +94,10 @@ public class NotHomeController4 : Controller
}
// derived from a class that has [NonController] attribute
public class NotController : NotHomeController4
public class NotController : NotHomeController3
{
public string Index()
{
return "This is Home Controller";
}
}
}

View File

@@ -4,3 +4,4 @@
| AspNetCore.cs:32:14:32:28 | HomeController3 |
| AspNetCore.cs:42:14:42:28 | HomeController4 |
| AspNetCore.cs:51:14:51:28 | HomeController5 |
| AspNetCore.cs:60:23:60:37 | HomeController6 |

View File

@@ -1,6 +1,6 @@
| Partial.cs:3:18:3:39 | PartialMethodWithBody1 | true |
| Partial.cs:4:18:4:42 | PartialMethodWithoutBody1 | true |
| Partial.cs:5:17:5:23 | Method2 | false |
| Partial.cs:10:18:10:39 | PartialMethodWithBody1 | true |
| Partial.cs:11:17:11:23 | Method3 | false |
| Partial.cs:16:18:16:42 | PartialMethodWithoutBody2 | true |
| Partial.cs:17:17:17:23 | Method4 | false |

View File

@@ -1,6 +1,6 @@
| Partial.cs:1:15:1:26 | TwoPartClass |
| Partial.cs:3:18:3:39 | PartialMethodWithBody1 |
| Partial.cs:4:18:4:42 | PartialMethodWithoutBody1 |
| Partial.cs:8:15:8:26 | TwoPartClass |
| Partial.cs:10:18:10:39 | PartialMethodWithBody1 |
| Partial.cs:14:15:14:33 | OnePartPartialClass |
| Partial.cs:16:18:16:42 | PartialMethodWithoutBody2 |

View File

@@ -1,10 +1,10 @@
| Partial.cs:1:15:1:26 | TwoPartClass | Partial.cs:3:18:3:39 | PartialMethodWithBody1 |
| Partial.cs:1:15:1:26 | TwoPartClass | Partial.cs:4:18:4:42 | PartialMethodWithoutBody1 |
| Partial.cs:1:15:1:26 | TwoPartClass | Partial.cs:5:17:5:23 | Method2 |
| Partial.cs:1:15:1:26 | TwoPartClass | Partial.cs:10:18:10:39 | PartialMethodWithBody1 |
| Partial.cs:1:15:1:26 | TwoPartClass | Partial.cs:11:17:11:23 | Method3 |
| Partial.cs:8:15:8:26 | TwoPartClass | Partial.cs:3:18:3:39 | PartialMethodWithBody1 |
| Partial.cs:8:15:8:26 | TwoPartClass | Partial.cs:4:18:4:42 | PartialMethodWithoutBody1 |
| Partial.cs:8:15:8:26 | TwoPartClass | Partial.cs:5:17:5:23 | Method2 |
| Partial.cs:8:15:8:26 | TwoPartClass | Partial.cs:10:18:10:39 | PartialMethodWithBody1 |
| Partial.cs:8:15:8:26 | TwoPartClass | Partial.cs:11:17:11:23 | Method3 |
| Partial.cs:14:15:14:33 | OnePartPartialClass | Partial.cs:16:18:16:42 | PartialMethodWithoutBody2 |
| Partial.cs:14:15:14:33 | OnePartPartialClass | Partial.cs:17:17:17:23 | Method4 |

View File

@@ -1,3 +1,3 @@
| Partial.cs:3:18:3:39 | PartialMethodWithBody1 | true |
| Partial.cs:4:18:4:42 | PartialMethodWithoutBody1 | false |
| Partial.cs:10:18:10:39 | PartialMethodWithBody1 | true |
| Partial.cs:16:18:16:42 | PartialMethodWithoutBody2 | false |

View File

@@ -1,13 +1,13 @@
Partial.cs:
# 1| [Class] TwoPartClass
# 3| 5: [Method] PartialMethodWithBody1
# 3| -1: [TypeMention] Void
# 10| 4: [BlockStmt] {...}
# 4| 6: [Method] PartialMethodWithoutBody1
# 4| 5: [Method] PartialMethodWithoutBody1
# 4| -1: [TypeMention] Void
# 5| 7: [Method] Method2
# 5| 6: [Method] Method2
# 5| -1: [TypeMention] Void
# 5| 4: [BlockStmt] {...}
# 10| 7: [Method] PartialMethodWithBody1
# 3| -1: [TypeMention] Void
# 10| 4: [BlockStmt] {...}
# 11| 8: [Method] Method3
# 11| -1: [TypeMention] Void
# 11| 4: [BlockStmt] {...}

View File

@@ -10,7 +10,12 @@ namespace Test
using System.Data;
using System.Data.Entity;
using System.Data.SqlClient;
using System.Diagnostics.CodeAnalysis;
using System.Threading;
using System.Threading.Tasks;
using System.Web.UI.WebControls;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
public class EntityFrameworkContext : DbContext
{
@@ -110,4 +115,28 @@ namespace Test
System.Windows.Forms.TextBox box1;
}
public abstract class MyController : Controller
{
[HttpPost("{userId:string}")]
public async Task<IActionResult> GetUserById([FromRoute] string userId, CancellationToken cancellationToken)
{
// This is a vulnerable method due to SQL injection
string query = "SELECT * FROM Users WHERE UserId = '" + userId + "'";
using (SqlConnection connection = new SqlConnection("YourConnectionString"))
{
SqlCommand command = new SqlCommand(query, connection);
connection.Open();
SqlDataReader reader = command.ExecuteReader();
while (reader.Read())
{
Console.WriteLine(String.Format("{0}, {1}", reader["UserId"], reader["Username"]));
}
}
return Ok();
}
}
}

View File

@@ -1,14 +1,15 @@
#select
| SecondOrderSqlInjection.cs:25:71:25:145 | ... + ... | SecondOrderSqlInjection.cs:20:48:20:78 | call to method ExecuteReader : SqlDataReader | SecondOrderSqlInjection.cs:25:71:25:145 | ... + ... | This query depends on $@. | SecondOrderSqlInjection.cs:20:48:20:78 | call to method ExecuteReader : SqlDataReader | this database input |
| SecondOrderSqlInjection.cs:45:57:45:59 | access to local variable sql | SecondOrderSqlInjection.cs:33:36:33:78 | object creation of type FileStream : FileStream | SecondOrderSqlInjection.cs:45:57:45:59 | access to local variable sql | This query depends on $@. | SecondOrderSqlInjection.cs:33:36:33:78 | object creation of type FileStream : FileStream | this file stream |
| SqlInjection.cs:34:50:34:55 | access to local variable query1 | SqlInjection.cs:33:21:33:35 | access to field categoryTextBox : TextBox | SqlInjection.cs:34:50:34:55 | access to local variable query1 | This query depends on $@. | SqlInjection.cs:33:21:33:35 | access to field categoryTextBox : TextBox | this ASP.NET user input |
| SqlInjection.cs:69:56:69:61 | access to local variable query1 | SqlInjection.cs:68:33:68:47 | access to field categoryTextBox : TextBox | SqlInjection.cs:69:56:69:61 | access to local variable query1 | This query depends on $@. | SqlInjection.cs:68:33:68:47 | access to field categoryTextBox : TextBox | this ASP.NET user input |
| SqlInjection.cs:70:55:70:60 | access to local variable query1 | SqlInjection.cs:68:33:68:47 | access to field categoryTextBox : TextBox | SqlInjection.cs:70:55:70:60 | access to local variable query1 | This query depends on $@. | SqlInjection.cs:68:33:68:47 | access to field categoryTextBox : TextBox | this ASP.NET user input |
| SqlInjection.cs:83:50:83:55 | access to local variable query1 | SqlInjection.cs:82:21:82:29 | access to property Text : String | SqlInjection.cs:83:50:83:55 | access to local variable query1 | This query depends on $@. | SqlInjection.cs:82:21:82:29 | access to property Text : String | this TextBox text |
| SqlInjection.cs:93:42:93:52 | access to local variable queryString | SqlInjection.cs:92:21:92:29 | access to property Text : String | SqlInjection.cs:93:42:93:52 | access to local variable queryString | This query depends on $@. | SqlInjection.cs:92:21:92:29 | access to property Text : String | this TextBox text |
| SqlInjection.cs:94:50:94:52 | access to local variable cmd | SqlInjection.cs:92:21:92:29 | access to property Text : String | SqlInjection.cs:94:50:94:52 | access to local variable cmd | This query depends on $@. | SqlInjection.cs:92:21:92:29 | access to property Text : String | this TextBox text |
| SqlInjection.cs:104:42:104:52 | access to local variable queryString | SqlInjection.cs:103:21:103:38 | call to method ReadLine : String | SqlInjection.cs:104:42:104:52 | access to local variable queryString | This query depends on $@. | SqlInjection.cs:103:21:103:38 | call to method ReadLine : String | this read from stdin |
| SqlInjection.cs:105:50:105:52 | access to local variable cmd | SqlInjection.cs:103:21:103:38 | call to method ReadLine : String | SqlInjection.cs:105:50:105:52 | access to local variable cmd | This query depends on $@. | SqlInjection.cs:103:21:103:38 | call to method ReadLine : String | this read from stdin |
| SqlInjection.cs:39:50:39:55 | access to local variable query1 | SqlInjection.cs:38:21:38:35 | access to field categoryTextBox : TextBox | SqlInjection.cs:39:50:39:55 | access to local variable query1 | This query depends on $@. | SqlInjection.cs:38:21:38:35 | access to field categoryTextBox : TextBox | this ASP.NET user input |
| SqlInjection.cs:74:56:74:61 | access to local variable query1 | SqlInjection.cs:73:33:73:47 | access to field categoryTextBox : TextBox | SqlInjection.cs:74:56:74:61 | access to local variable query1 | This query depends on $@. | SqlInjection.cs:73:33:73:47 | access to field categoryTextBox : TextBox | this ASP.NET user input |
| SqlInjection.cs:75:55:75:60 | access to local variable query1 | SqlInjection.cs:73:33:73:47 | access to field categoryTextBox : TextBox | SqlInjection.cs:75:55:75:60 | access to local variable query1 | This query depends on $@. | SqlInjection.cs:73:33:73:47 | access to field categoryTextBox : TextBox | this ASP.NET user input |
| SqlInjection.cs:88:50:88:55 | access to local variable query1 | SqlInjection.cs:87:21:87:29 | access to property Text : String | SqlInjection.cs:88:50:88:55 | access to local variable query1 | This query depends on $@. | SqlInjection.cs:87:21:87:29 | access to property Text : String | this TextBox text |
| SqlInjection.cs:98:42:98:52 | access to local variable queryString | SqlInjection.cs:97:21:97:29 | access to property Text : String | SqlInjection.cs:98:42:98:52 | access to local variable queryString | This query depends on $@. | SqlInjection.cs:97:21:97:29 | access to property Text : String | this TextBox text |
| SqlInjection.cs:99:50:99:52 | access to local variable cmd | SqlInjection.cs:97:21:97:29 | access to property Text : String | SqlInjection.cs:99:50:99:52 | access to local variable cmd | This query depends on $@. | SqlInjection.cs:97:21:97:29 | access to property Text : String | this TextBox text |
| SqlInjection.cs:109:42:109:52 | access to local variable queryString | SqlInjection.cs:108:21:108:38 | call to method ReadLine : String | SqlInjection.cs:109:42:109:52 | access to local variable queryString | This query depends on $@. | SqlInjection.cs:108:21:108:38 | call to method ReadLine : String | this read from stdin |
| SqlInjection.cs:110:50:110:52 | access to local variable cmd | SqlInjection.cs:108:21:108:38 | call to method ReadLine : String | SqlInjection.cs:110:50:110:52 | access to local variable cmd | This query depends on $@. | SqlInjection.cs:108:21:108:38 | call to method ReadLine : String | this read from stdin |
| SqlInjection.cs:129:53:129:57 | access to local variable query | SqlInjection.cs:122:73:122:78 | userId : String | SqlInjection.cs:129:53:129:57 | access to local variable query | This query depends on $@. | SqlInjection.cs:122:73:122:78 | userId : String | this ASP.NET Core MVC action method parameter |
| SqlInjectionDapper.cs:21:55:21:59 | access to local variable query | SqlInjectionDapper.cs:20:86:20:94 | access to property Text : String | SqlInjectionDapper.cs:21:55:21:59 | access to local variable query | This query depends on $@. | SqlInjectionDapper.cs:20:86:20:94 | access to property Text : String | this TextBox text |
| SqlInjectionDapper.cs:30:66:30:70 | access to local variable query | SqlInjectionDapper.cs:29:86:29:94 | access to property Text : String | SqlInjectionDapper.cs:30:66:30:70 | access to local variable query | This query depends on $@. | SqlInjectionDapper.cs:29:86:29:94 | access to property Text : String | this TextBox text |
| SqlInjectionDapper.cs:39:63:39:67 | access to local variable query | SqlInjectionDapper.cs:38:86:38:94 | access to property Text : String | SqlInjectionDapper.cs:39:63:39:67 | access to local variable query | This query depends on $@. | SqlInjectionDapper.cs:38:86:38:94 | access to property Text : String | this TextBox text |
@@ -40,27 +41,29 @@ edges
| SecondOrderSqlInjection.cs:40:25:40:27 | access to local variable sql : String | SecondOrderSqlInjection.cs:45:57:45:59 | access to local variable sql | provenance | Sink:MaD:10 |
| SecondOrderSqlInjection.cs:40:31:40:33 | access to local variable sql : String | SecondOrderSqlInjection.cs:40:31:40:40 | call to method Trim : String | provenance | MaD:28 |
| SecondOrderSqlInjection.cs:40:31:40:40 | call to method Trim : String | SecondOrderSqlInjection.cs:40:25:40:27 | access to local variable sql : String | provenance | |
| SqlInjection.cs:32:21:32:26 | access to local variable query1 : String | SqlInjection.cs:34:50:34:55 | access to local variable query1 | provenance | Sink:MaD:18 |
| SqlInjection.cs:33:21:33:35 | access to field categoryTextBox : TextBox | SqlInjection.cs:33:21:33:40 | access to property Text : String | provenance | MaD:26 |
| SqlInjection.cs:33:21:33:40 | access to property Text : String | SqlInjection.cs:32:21:32:26 | access to local variable query1 : String | provenance | |
| SqlInjection.cs:67:25:67:30 | access to local variable query1 : String | SqlInjection.cs:69:56:69:61 | access to local variable query1 | provenance | Sink:MaD:7 |
| SqlInjection.cs:67:25:67:30 | access to local variable query1 : String | SqlInjection.cs:70:55:70:60 | access to local variable query1 | provenance | Sink:MaD:8 |
| SqlInjection.cs:68:33:68:47 | access to field categoryTextBox : TextBox | SqlInjection.cs:68:33:68:52 | access to property Text : String | provenance | MaD:26 |
| SqlInjection.cs:68:33:68:52 | access to property Text : String | SqlInjection.cs:67:25:67:30 | access to local variable query1 : String | provenance | |
| SqlInjection.cs:81:21:81:26 | access to local variable query1 : String | SqlInjection.cs:83:50:83:55 | access to local variable query1 | provenance | Sink:MaD:18 |
| SqlInjection.cs:82:21:82:29 | access to property Text : String | SqlInjection.cs:81:21:81:26 | access to local variable query1 : String | provenance | |
| SqlInjection.cs:91:21:91:31 | access to local variable queryString : String | SqlInjection.cs:93:42:93:52 | access to local variable queryString | provenance | Sink:MaD:15 |
| SqlInjection.cs:91:21:91:31 | access to local variable queryString : String | SqlInjection.cs:93:42:93:52 | access to local variable queryString : String | provenance | |
| SqlInjection.cs:92:21:92:29 | access to property Text : String | SqlInjection.cs:91:21:91:31 | access to local variable queryString : String | provenance | |
| SqlInjection.cs:93:21:93:23 | access to local variable cmd : SqlCommand | SqlInjection.cs:94:50:94:52 | access to local variable cmd | provenance | Sink:MaD:17 |
| SqlInjection.cs:93:27:93:53 | object creation of type SqlCommand : SqlCommand | SqlInjection.cs:93:21:93:23 | access to local variable cmd : SqlCommand | provenance | |
| SqlInjection.cs:93:42:93:52 | access to local variable queryString : String | SqlInjection.cs:93:27:93:53 | object creation of type SqlCommand : SqlCommand | provenance | MaD:19 |
| SqlInjection.cs:102:21:102:31 | access to local variable queryString : String | SqlInjection.cs:104:42:104:52 | access to local variable queryString | provenance | Sink:MaD:15 |
| SqlInjection.cs:102:21:102:31 | access to local variable queryString : String | SqlInjection.cs:104:42:104:52 | access to local variable queryString : String | provenance | |
| SqlInjection.cs:103:21:103:38 | call to method ReadLine : String | SqlInjection.cs:102:21:102:31 | access to local variable queryString : String | provenance | Src:MaD:27 |
| SqlInjection.cs:104:21:104:23 | access to local variable cmd : SqlCommand | SqlInjection.cs:105:50:105:52 | access to local variable cmd | provenance | Sink:MaD:17 |
| SqlInjection.cs:104:27:104:53 | object creation of type SqlCommand : SqlCommand | SqlInjection.cs:104:21:104:23 | access to local variable cmd : SqlCommand | provenance | |
| SqlInjection.cs:104:42:104:52 | access to local variable queryString : String | SqlInjection.cs:104:27:104:53 | object creation of type SqlCommand : SqlCommand | provenance | MaD:19 |
| SqlInjection.cs:37:21:37:26 | access to local variable query1 : String | SqlInjection.cs:39:50:39:55 | access to local variable query1 | provenance | Sink:MaD:18 |
| SqlInjection.cs:38:21:38:35 | access to field categoryTextBox : TextBox | SqlInjection.cs:38:21:38:40 | access to property Text : String | provenance | MaD:26 |
| SqlInjection.cs:38:21:38:40 | access to property Text : String | SqlInjection.cs:37:21:37:26 | access to local variable query1 : String | provenance | |
| SqlInjection.cs:72:25:72:30 | access to local variable query1 : String | SqlInjection.cs:74:56:74:61 | access to local variable query1 | provenance | Sink:MaD:7 |
| SqlInjection.cs:72:25:72:30 | access to local variable query1 : String | SqlInjection.cs:75:55:75:60 | access to local variable query1 | provenance | Sink:MaD:8 |
| SqlInjection.cs:73:33:73:47 | access to field categoryTextBox : TextBox | SqlInjection.cs:73:33:73:52 | access to property Text : String | provenance | MaD:26 |
| SqlInjection.cs:73:33:73:52 | access to property Text : String | SqlInjection.cs:72:25:72:30 | access to local variable query1 : String | provenance | |
| SqlInjection.cs:86:21:86:26 | access to local variable query1 : String | SqlInjection.cs:88:50:88:55 | access to local variable query1 | provenance | Sink:MaD:18 |
| SqlInjection.cs:87:21:87:29 | access to property Text : String | SqlInjection.cs:86:21:86:26 | access to local variable query1 : String | provenance | |
| SqlInjection.cs:96:21:96:31 | access to local variable queryString : String | SqlInjection.cs:98:42:98:52 | access to local variable queryString | provenance | Sink:MaD:15 |
| SqlInjection.cs:96:21:96:31 | access to local variable queryString : String | SqlInjection.cs:98:42:98:52 | access to local variable queryString : String | provenance | |
| SqlInjection.cs:97:21:97:29 | access to property Text : String | SqlInjection.cs:96:21:96:31 | access to local variable queryString : String | provenance | |
| SqlInjection.cs:98:21:98:23 | access to local variable cmd : SqlCommand | SqlInjection.cs:99:50:99:52 | access to local variable cmd | provenance | Sink:MaD:17 |
| SqlInjection.cs:98:27:98:53 | object creation of type SqlCommand : SqlCommand | SqlInjection.cs:98:21:98:23 | access to local variable cmd : SqlCommand | provenance | |
| SqlInjection.cs:98:42:98:52 | access to local variable queryString : String | SqlInjection.cs:98:27:98:53 | object creation of type SqlCommand : SqlCommand | provenance | MaD:19 |
| SqlInjection.cs:107:21:107:31 | access to local variable queryString : String | SqlInjection.cs:109:42:109:52 | access to local variable queryString | provenance | Sink:MaD:15 |
| SqlInjection.cs:107:21:107:31 | access to local variable queryString : String | SqlInjection.cs:109:42:109:52 | access to local variable queryString : String | provenance | |
| SqlInjection.cs:108:21:108:38 | call to method ReadLine : String | SqlInjection.cs:107:21:107:31 | access to local variable queryString : String | provenance | Src:MaD:27 |
| SqlInjection.cs:109:21:109:23 | access to local variable cmd : SqlCommand | SqlInjection.cs:110:50:110:52 | access to local variable cmd | provenance | Sink:MaD:17 |
| SqlInjection.cs:109:27:109:53 | object creation of type SqlCommand : SqlCommand | SqlInjection.cs:109:21:109:23 | access to local variable cmd : SqlCommand | provenance | |
| SqlInjection.cs:109:42:109:52 | access to local variable queryString : String | SqlInjection.cs:109:27:109:53 | object creation of type SqlCommand : SqlCommand | provenance | MaD:19 |
| SqlInjection.cs:122:73:122:78 | userId : String | SqlInjection.cs:125:20:125:24 | access to local variable query : String | provenance | |
| SqlInjection.cs:125:20:125:24 | access to local variable query : String | SqlInjection.cs:129:53:129:57 | access to local variable query | provenance | Sink:MaD:16 |
| SqlInjectionDapper.cs:20:21:20:25 | access to local variable query : String | SqlInjectionDapper.cs:21:55:21:59 | access to local variable query | provenance | Sink:MaD:4 |
| SqlInjectionDapper.cs:20:86:20:94 | access to property Text : String | SqlInjectionDapper.cs:20:21:20:25 | access to local variable query : String | provenance | |
| SqlInjectionDapper.cs:29:21:29:25 | access to local variable query : String | SqlInjectionDapper.cs:30:66:30:70 | access to local variable query | provenance | Sink:MaD:5 |
@@ -144,32 +147,35 @@ nodes
| SecondOrderSqlInjection.cs:40:31:40:33 | access to local variable sql : String | semmle.label | access to local variable sql : String |
| SecondOrderSqlInjection.cs:40:31:40:40 | call to method Trim : String | semmle.label | call to method Trim : String |
| SecondOrderSqlInjection.cs:45:57:45:59 | access to local variable sql | semmle.label | access to local variable sql |
| SqlInjection.cs:32:21:32:26 | access to local variable query1 : String | semmle.label | access to local variable query1 : String |
| SqlInjection.cs:33:21:33:35 | access to field categoryTextBox : TextBox | semmle.label | access to field categoryTextBox : TextBox |
| SqlInjection.cs:33:21:33:40 | access to property Text : String | semmle.label | access to property Text : String |
| SqlInjection.cs:34:50:34:55 | access to local variable query1 | semmle.label | access to local variable query1 |
| SqlInjection.cs:67:25:67:30 | access to local variable query1 : String | semmle.label | access to local variable query1 : String |
| SqlInjection.cs:68:33:68:47 | access to field categoryTextBox : TextBox | semmle.label | access to field categoryTextBox : TextBox |
| SqlInjection.cs:68:33:68:52 | access to property Text : String | semmle.label | access to property Text : String |
| SqlInjection.cs:69:56:69:61 | access to local variable query1 | semmle.label | access to local variable query1 |
| SqlInjection.cs:70:55:70:60 | access to local variable query1 | semmle.label | access to local variable query1 |
| SqlInjection.cs:81:21:81:26 | access to local variable query1 : String | semmle.label | access to local variable query1 : String |
| SqlInjection.cs:82:21:82:29 | access to property Text : String | semmle.label | access to property Text : String |
| SqlInjection.cs:83:50:83:55 | access to local variable query1 | semmle.label | access to local variable query1 |
| SqlInjection.cs:91:21:91:31 | access to local variable queryString : String | semmle.label | access to local variable queryString : String |
| SqlInjection.cs:92:21:92:29 | access to property Text : String | semmle.label | access to property Text : String |
| SqlInjection.cs:93:21:93:23 | access to local variable cmd : SqlCommand | semmle.label | access to local variable cmd : SqlCommand |
| SqlInjection.cs:93:27:93:53 | object creation of type SqlCommand : SqlCommand | semmle.label | object creation of type SqlCommand : SqlCommand |
| SqlInjection.cs:93:42:93:52 | access to local variable queryString | semmle.label | access to local variable queryString |
| SqlInjection.cs:93:42:93:52 | access to local variable queryString : String | semmle.label | access to local variable queryString : String |
| SqlInjection.cs:94:50:94:52 | access to local variable cmd | semmle.label | access to local variable cmd |
| SqlInjection.cs:102:21:102:31 | access to local variable queryString : String | semmle.label | access to local variable queryString : String |
| SqlInjection.cs:103:21:103:38 | call to method ReadLine : String | semmle.label | call to method ReadLine : String |
| SqlInjection.cs:104:21:104:23 | access to local variable cmd : SqlCommand | semmle.label | access to local variable cmd : SqlCommand |
| SqlInjection.cs:104:27:104:53 | object creation of type SqlCommand : SqlCommand | semmle.label | object creation of type SqlCommand : SqlCommand |
| SqlInjection.cs:104:42:104:52 | access to local variable queryString | semmle.label | access to local variable queryString |
| SqlInjection.cs:104:42:104:52 | access to local variable queryString : String | semmle.label | access to local variable queryString : String |
| SqlInjection.cs:105:50:105:52 | access to local variable cmd | semmle.label | access to local variable cmd |
| SqlInjection.cs:37:21:37:26 | access to local variable query1 : String | semmle.label | access to local variable query1 : String |
| SqlInjection.cs:38:21:38:35 | access to field categoryTextBox : TextBox | semmle.label | access to field categoryTextBox : TextBox |
| SqlInjection.cs:38:21:38:40 | access to property Text : String | semmle.label | access to property Text : String |
| SqlInjection.cs:39:50:39:55 | access to local variable query1 | semmle.label | access to local variable query1 |
| SqlInjection.cs:72:25:72:30 | access to local variable query1 : String | semmle.label | access to local variable query1 : String |
| SqlInjection.cs:73:33:73:47 | access to field categoryTextBox : TextBox | semmle.label | access to field categoryTextBox : TextBox |
| SqlInjection.cs:73:33:73:52 | access to property Text : String | semmle.label | access to property Text : String |
| SqlInjection.cs:74:56:74:61 | access to local variable query1 | semmle.label | access to local variable query1 |
| SqlInjection.cs:75:55:75:60 | access to local variable query1 | semmle.label | access to local variable query1 |
| SqlInjection.cs:86:21:86:26 | access to local variable query1 : String | semmle.label | access to local variable query1 : String |
| SqlInjection.cs:87:21:87:29 | access to property Text : String | semmle.label | access to property Text : String |
| SqlInjection.cs:88:50:88:55 | access to local variable query1 | semmle.label | access to local variable query1 |
| SqlInjection.cs:96:21:96:31 | access to local variable queryString : String | semmle.label | access to local variable queryString : String |
| SqlInjection.cs:97:21:97:29 | access to property Text : String | semmle.label | access to property Text : String |
| SqlInjection.cs:98:21:98:23 | access to local variable cmd : SqlCommand | semmle.label | access to local variable cmd : SqlCommand |
| SqlInjection.cs:98:27:98:53 | object creation of type SqlCommand : SqlCommand | semmle.label | object creation of type SqlCommand : SqlCommand |
| SqlInjection.cs:98:42:98:52 | access to local variable queryString | semmle.label | access to local variable queryString |
| SqlInjection.cs:98:42:98:52 | access to local variable queryString : String | semmle.label | access to local variable queryString : String |
| SqlInjection.cs:99:50:99:52 | access to local variable cmd | semmle.label | access to local variable cmd |
| SqlInjection.cs:107:21:107:31 | access to local variable queryString : String | semmle.label | access to local variable queryString : String |
| SqlInjection.cs:108:21:108:38 | call to method ReadLine : String | semmle.label | call to method ReadLine : String |
| SqlInjection.cs:109:21:109:23 | access to local variable cmd : SqlCommand | semmle.label | access to local variable cmd : SqlCommand |
| SqlInjection.cs:109:27:109:53 | object creation of type SqlCommand : SqlCommand | semmle.label | object creation of type SqlCommand : SqlCommand |
| SqlInjection.cs:109:42:109:52 | access to local variable queryString | semmle.label | access to local variable queryString |
| SqlInjection.cs:109:42:109:52 | access to local variable queryString : String | semmle.label | access to local variable queryString : String |
| SqlInjection.cs:110:50:110:52 | access to local variable cmd | semmle.label | access to local variable cmd |
| SqlInjection.cs:122:73:122:78 | userId : String | semmle.label | userId : String |
| SqlInjection.cs:125:20:125:24 | access to local variable query : String | semmle.label | access to local variable query : String |
| SqlInjection.cs:129:53:129:57 | access to local variable query | semmle.label | access to local variable query |
| SqlInjectionDapper.cs:20:21:20:25 | access to local variable query : String | semmle.label | access to local variable query : String |
| SqlInjectionDapper.cs:20:86:20:94 | access to property Text : String | semmle.label | access to property Text : String |
| SqlInjectionDapper.cs:21:55:21:59 | access to local variable query | semmle.label | access to local variable query |

View File

@@ -3,3 +3,4 @@ semmle-extractor-options: --load-sources-from-project:${testdir}/../../../resour
semmle-extractor-options: --load-sources-from-project:${testdir}/../../../resources/stubs/System.Data.SqlClient/4.8.5/System.Data.SqlClient.csproj
semmle-extractor-options: --load-sources-from-project:${testdir}/../../../resources/stubs/System.Data.SQLite/1.0.118/System.Data.SQLite.csproj
semmle-extractor-options: ${testdir}/../../../resources/stubs/System.Windows.cs
semmle-extractor-options: --load-sources-from-project:${testdir}/../../../resources/stubs/_frameworks/Microsoft.AspNetCore.App/Microsoft.AspNetCore.App.csproj

View File

@@ -47,6 +47,7 @@ codeql_pkg_files(
"//go/extractor/cli/go-autobuilder",
"//go/extractor/cli/go-bootstrap",
"//go/extractor/cli/go-build-runner",
"//go/extractor/cli/go-configure-baseline",
"//go/extractor/cli/go-extractor",
"//go/extractor/cli/go-gen-dbscheme",
"//go/extractor/cli/go-tokenizer",

View File

@@ -1,3 +0,0 @@
{
"paths-ignore": []
}

View File

@@ -1,5 +0,0 @@
{
"paths-ignore": [
"vendor/**"
]
}

View File

@@ -1,6 +1,4 @@
@echo off
if exist vendor\modules.txt (
type "%CODEQL_EXTRACTOR_GO_ROOT%\tools\baseline-config-vendor.json"
) else (
type "%CODEQL_EXTRACTOR_GO_ROOT%\tools\baseline-config-empty.json"
)
type NUL && "%CODEQL_EXTRACTOR_GO_ROOT%/tools/%CODEQL_PLATFORM%/go-configure-baseline.exe"
exit /b %ERRORLEVEL%

View File

@@ -1,7 +1,3 @@
#!/bin/sh
if [ -f vendor/modules.txt ]; then
cat "$CODEQL_EXTRACTOR_GO_ROOT/tools/baseline-config-vendor.json"
else
cat "$CODEQL_EXTRACTOR_GO_ROOT/tools/baseline-config-empty.json"
fi
"$CODEQL_EXTRACTOR_GO_ROOT/tools/$CODEQL_PLATFORM/go-configure-baseline"

View File

@@ -0,0 +1,18 @@
# generated running `bazel run //go/gazelle`, do not edit
load("@rules_go//go:def.bzl", "go_library")
load("//go:rules.bzl", "codeql_go_binary")
go_library(
name = "go-configure-baseline_lib",
srcs = ["go-configure-baseline.go"],
importpath = "github.com/github/codeql-go/extractor/cli/go-configure-baseline",
visibility = ["//visibility:private"],
deps = ["//go/extractor/configurebaseline"],
)
codeql_go_binary(
name = "go-configure-baseline",
embed = [":go-configure-baseline_lib"],
visibility = ["//visibility:public"],
)

View File

@@ -0,0 +1,16 @@
package main
import (
"fmt"
"github.com/github/codeql-go/extractor/configurebaseline"
)
func main() {
jsonResult, err := configurebaseline.GetConfigBaselineAsJSON(".")
if err != nil {
panic(err)
} else {
fmt.Println(string(jsonResult))
}
}

View File

@@ -0,0 +1,11 @@
# generated running `bazel run //go/gazelle`, do not edit
load("@rules_go//go:def.bzl", "go_library")
go_library(
name = "configurebaseline",
srcs = ["configurebaseline.go"],
importpath = "github.com/github/codeql-go/extractor/configurebaseline",
visibility = ["//visibility:public"],
deps = ["//go/extractor/util"],
)

View File

@@ -0,0 +1,52 @@
package configurebaseline
import (
"encoding/json"
"io/fs"
"os"
"path"
"path/filepath"
"github.com/github/codeql-go/extractor/util"
)
func fileExists(path string) bool {
stat, err := os.Stat(path)
return err == nil && stat.Mode().IsRegular()
}
// Decides if `dirPath` is a vendor directory by testing whether it is called `vendor`
// and contains a `modules.txt` file.
func isGolangVendorDirectory(dirPath string) bool {
return filepath.Base(dirPath) == "vendor" && fileExists(filepath.Join(dirPath, "modules.txt"))
}
type BaselineConfig struct {
PathsIgnore []string `json:"paths-ignore"`
}
func GetConfigBaselineAsJSON(rootDir string) ([]byte, error) {
vendorDirs := make([]string, 0)
if util.IsVendorDirExtractionEnabled() {
// The user wants vendor directories scanned; emit an empty report.
} else {
filepath.WalkDir(rootDir, func(dirPath string, d fs.DirEntry, err error) error {
if err != nil {
// Ignore any unreadable paths -- if this script can't see it, very likely
// it will not be extracted either.
return nil
}
if isGolangVendorDirectory(dirPath) {
// Note that CodeQL expects a forward-slash-separated path, even on Windows.
vendorDirs = append(vendorDirs, path.Join(filepath.ToSlash(dirPath), "**"))
return filepath.SkipDir
} else {
return nil
}
})
}
outputStruct := BaselineConfig{PathsIgnore: vendorDirs}
return json.Marshal(outputStruct)
}

View File

@@ -199,7 +199,7 @@ func ExtractWithFlags(buildFlags []string, patterns []string) error {
// If CODEQL_EXTRACTOR_GO_EXTRACT_VENDOR_DIRS is "true", we extract `vendor` directories;
// otherwise (the default) is to exclude them from extraction
includeVendor := os.Getenv("CODEQL_EXTRACTOR_GO_EXTRACT_VENDOR_DIRS") == "true"
includeVendor := util.IsVendorDirExtractionEnabled()
if !includeVendor {
excludedDirs = append(excludedDirs, "vendor")
}

View File

@@ -5,6 +5,7 @@ load("@rules_go//go:def.bzl", "go_library", "go_test")
go_library(
name = "util",
srcs = [
"extractvendordirs.go",
"semver.go",
"util.go",
],

View File

@@ -0,0 +1,9 @@
package util
import (
"os"
)
func IsVendorDirExtractionEnabled() bool {
return os.Getenv("CODEQL_EXTRACTOR_GO_EXTRACT_VENDOR_DIRS") == "true"
}

View File

@@ -0,0 +1 @@
package abc

View File

@@ -0,0 +1 @@
package abc

View File

@@ -0,0 +1 @@
package abc

View File

@@ -0,0 +1 @@
package abc

View File

@@ -0,0 +1,9 @@
import os.path
import json
def test(codeql, go):
codeql.database.init(source_root="src")
baseline_info_path = os.path.join("test-db", "baseline-info.json")
with open(baseline_info_path, "r") as f:
baseline_info = json.load(f)
assert set(baseline_info["languages"]["go"]["files"]) == set(["root.go", "c/vendor/cvendor.go"]), "Expected root.go and cvendor.go in baseline"

View File

@@ -0,0 +1,4 @@
---
category: fix
---
* Golang vendor directories not at the root of a repository are now correctly excluded from the baseline Go file count. This means code coverage information will be more accurate.

View File

@@ -213,16 +213,30 @@ predicate interpretModelForTest(QlBuiltins::ExtensionId madId, string model) {
)
}
bindingset[p]
private string cleanPackage(string p) {
exists(string noPrefix |
p = fixedVersionPrefix() + noPrefix
or
not p = fixedVersionPrefix() + any(string s) and
noPrefix = p
|
result = noPrefix.regexpReplaceAll(majorVersionSuffixRegex(), "")
)
}
private predicate relevantPackage(string package) {
sourceModel(package, _, _, _, _, _, _, _, _, _) or
sinkModel(package, _, _, _, _, _, _, _, _, _) or
summaryModel(package, _, _, _, _, _, _, _, _, _, _)
exists(string p | package = cleanPackage(p) |
sourceModel(p, _, _, _, _, _, _, _, _, _) or
sinkModel(p, _, _, _, _, _, _, _, _, _) or
summaryModel(p, _, _, _, _, _, _, _, _, _, _)
)
}
private predicate packageLink(string shortpkg, string longpkg) {
relevantPackage(shortpkg) and
relevantPackage(longpkg) and
longpkg.prefix(longpkg.indexOf(".")) = shortpkg
longpkg.prefix(longpkg.indexOf("/")) = shortpkg
}
private predicate canonicalPackage(string package) {
@@ -245,26 +259,28 @@ predicate modelCoverage(string package, int pkgs, string kind, string part, int
part = "source" and
n =
strictcount(string subpkg, string type, boolean subtypes, string name, string signature,
string ext, string output, string provenance |
string ext, string output, string provenance, string x |
canonicalPkgLink(package, subpkg) and
sourceModel(subpkg, type, subtypes, name, signature, ext, output, kind, provenance, _)
subpkg = cleanPackage(x) and
sourceModel(x, type, subtypes, name, signature, ext, output, kind, provenance, _)
)
or
part = "sink" and
n =
strictcount(string subpkg, string type, boolean subtypes, string name, string signature,
string ext, string input, string provenance |
string ext, string input, string provenance, string x |
canonicalPkgLink(package, subpkg) and
sinkModel(subpkg, type, subtypes, name, signature, ext, input, kind, provenance, _)
subpkg = cleanPackage(x) and
sinkModel(x, type, subtypes, name, signature, ext, input, kind, provenance, _)
)
or
part = "summary" and
n =
strictcount(string subpkg, string type, boolean subtypes, string name, string signature,
string ext, string input, string output, string provenance |
string ext, string input, string output, string provenance, string x |
canonicalPkgLink(package, subpkg) and
summaryModel(subpkg, type, subtypes, name, signature, ext, input, output, kind, provenance,
_)
subpkg = cleanPackage(x) and
summaryModel(x, type, subtypes, name, signature, ext, input, output, kind, provenance, _)
)
)
}

View File

@@ -220,26 +220,26 @@ open class LoggerBase(val logCounter: LogCounter) {
logStream.write(logMessage.toJsonLine())
}
fun trace(tw: TrapWriter, msg: String) {
fun trace(dtw: DiagnosticTrapWriter, msg: String) {
if (verbosity >= 4) {
val logMessage = LogMessage("TRACE", msg)
tw.writeComment(logMessage.toText())
dtw.writeComment(logMessage.toText())
logStream.write(logMessage.toJsonLine())
}
}
fun debug(tw: TrapWriter, msg: String) {
fun debug(dtw: DiagnosticTrapWriter, msg: String) {
if (verbosity >= 4) {
val logMessage = LogMessage("DEBUG", msg)
tw.writeComment(logMessage.toText())
dtw.writeComment(logMessage.toText())
logStream.write(logMessage.toJsonLine())
}
}
fun info(tw: TrapWriter, msg: String) {
fun info(dtw: DiagnosticTrapWriter, msg: String) {
if (verbosity >= 3) {
val logMessage = LogMessage("INFO", msg)
tw.writeComment(logMessage.toText())
dtw.writeComment(logMessage.toText())
logStream.write(logMessage.toJsonLine())
}
}
@@ -279,7 +279,7 @@ open class LoggerBase(val logCounter: LogCounter) {
}
}
open class Logger(val loggerBase: LoggerBase, open val dtw: DiagnosticTrapWriter) {
open class Logger(val loggerBase: LoggerBase, val dtw: DiagnosticTrapWriter) {
fun flush() {
dtw.flush()
loggerBase.flush()

View File

@@ -0,0 +1,28 @@
/**
* @name Capture Summary Models Partial Path
* @description Capture Summary Models Partial Path
* @kind path-problem
* @precision low
* @id java/utils/modelgenerator/summary-models-partial-path
* @severity info
* @tags modelgenerator
*/
import java
import semmle.code.java.dataflow.DataFlow
import utils.modelgenerator.internal.CaptureModels
import PartialFlow::PartialPathGraph
int explorationLimit() { result = 3 }
module PartialFlow = PropagateFlow::FlowExplorationFwd<explorationLimit/0>;
from
PartialFlow::PartialPathNode source, PartialFlow::PartialPathNode sink,
DataFlowSummaryTargetApi api, DataFlow::ParameterNode p
where
PartialFlow::partialFlow(source, sink, _) and
p = source.getNode() and
p.asParameter() = api.getAParameter()
select sink.getNode(), source, sink, "There is flow from a $@ to $@.", source.getNode(),
"parameter", sink.getNode(), "intermediate value"

View File

@@ -0,0 +1,25 @@
/**
* @name Capture Summary Models Path
* @description Capture Summary Models Path
* @kind path-problem
* @precision low
* @id java/utils/modelgenerator/summary-models-path
* @severity warning
* @tags modelgenerator
*/
import java
import semmle.code.java.dataflow.DataFlow
import utils.modelgenerator.internal.CaptureModels
import PropagateFlow::PathGraph
from
PropagateFlow::PathNode source, PropagateFlow::PathNode sink, DataFlowSummaryTargetApi api,
DataFlow::Node p, DataFlow::Node returnNodeExt
where
PropagateFlow::flowPath(source, sink) and
p = source.getNode() and
returnNodeExt = sink.getNode() and
exists(captureThroughFlow0(api, p, returnNodeExt))
select sink.getNode(), source, sink, "There is flow from $@ to the $@.", source.getNode(),
"parameter", sink.getNode(), "return value"

View File

@@ -0,0 +1 @@
The queries in this directory are purely used for model generator debugging purposes in VS Code.

View File

@@ -50,7 +50,7 @@ module Printing = ModelPrinting<ModelPrintingInput>;
/**
* Holds if `c` is a relevant content kind, where the underlying type is relevant.
*/
private predicate isRelevantTypeInContent(DataFlow::Content c) {
private predicate isRelevantTypeInContent(DataFlow::ContentSet c) {
isRelevantType(getUnderlyingContentType(c))
}
@@ -58,24 +58,22 @@ private predicate isRelevantTypeInContent(DataFlow::Content c) {
* Holds if data can flow from `node1` to `node2` either via a read or a write of an intermediate field `f`.
*/
private predicate isRelevantTaintStep(DataFlow::Node node1, DataFlow::Node node2) {
exists(DataFlow::Content f |
exists(DataFlow::ContentSet f |
DataFlowPrivate::readStep(node1, f, node2) and
// Partially restrict the content types used for intermediate steps.
(not exists(getUnderlyingContentType(f)) or isRelevantTypeInContent(f))
)
or
exists(DataFlow::Content f | DataFlowPrivate::storeStep(node1, f, node2) |
DataFlowPrivate::containerContent(f)
)
exists(DataFlow::ContentSet f | DataFlowPrivate::storeStep(node1, f, node2) | containerContent(f))
}
/**
* Holds if content `c` is either a field, a synthetic field or language specific
* content of a relevant type or a container like content.
*/
private predicate isRelevantContent(DataFlow::Content c) {
private predicate isRelevantContent(DataFlow::ContentSet c) {
isRelevantTypeInContent(c) or
DataFlowPrivate::containerContent(c)
containerContent(c)
}
/**
@@ -170,8 +168,8 @@ module PropagateFlowConfig implements DataFlow::StateConfigSig {
predicate isAdditionalFlowStep(
DataFlow::Node node1, FlowState state1, DataFlow::Node node2, FlowState state2
) {
exists(DataFlow::Content c |
DataFlowImplCommon::store(node1, c, node2, _, _) and
exists(DataFlow::ContentSet c |
DataFlowImplCommon::store(node1, c.getAStoreContent(), node2, _, _) and
isRelevantContent(c) and
(
state1 instanceof TaintRead and state2.(TaintStore).getStep() = 1
@@ -180,7 +178,7 @@ module PropagateFlowConfig implements DataFlow::StateConfigSig {
)
)
or
exists(DataFlow::Content c |
exists(DataFlow::ContentSet c |
DataFlowPrivate::readStep(node1, c, node2) and
isRelevantContent(c) and
state1.(TaintRead).getStep() + 1 = state2.(TaintRead).getStep()
@@ -196,14 +194,13 @@ module PropagateFlowConfig implements DataFlow::StateConfigSig {
}
}
private module PropagateFlow = TaintTracking::GlobalWithState<PropagateFlowConfig>;
module PropagateFlow = TaintTracking::GlobalWithState<PropagateFlowConfig>;
/**
* Gets the summary model(s) of `api`, if there is flow from parameters to return value or parameter.
*/
string captureThroughFlow(DataFlowSummaryTargetApi api) {
exists(DataFlow::ParameterNode p, ReturnNodeExt returnNodeExt, string input, string output |
PropagateFlow::flow(p, returnNodeExt) and
string captureThroughFlow0(
DataFlowSummaryTargetApi api, DataFlow::ParameterNode p, ReturnNodeExt returnNodeExt
) {
exists(string input, string output |
p.getEnclosingCallable() = api and
returnNodeExt.(DataFlow::Node).getEnclosingCallable() = api and
input = parameterNodeAsInput(p) and
output = returnNodeExt.getOutput() and
@@ -212,6 +209,16 @@ string captureThroughFlow(DataFlowSummaryTargetApi api) {
)
}
/**
* Gets the summary model(s) of `api`, if there is flow from parameters to return value or parameter.
*/
string captureThroughFlow(DataFlowSummaryTargetApi api) {
exists(DataFlow::ParameterNode p, ReturnNodeExt returnNodeExt |
PropagateFlow::flow(p, returnNodeExt) and
result = captureThroughFlow0(api, p, returnNodeExt)
)
}
/**
* A dataflow configuration used for finding new sources.
* The sources are the already known existing sources and the sinks are the API return nodes.

View File

@@ -303,3 +303,5 @@ predicate isRelevantSinkKind(string kind) {
*/
bindingset[kind]
predicate isRelevantSourceKind(string kind) { any() }
predicate containerContent = DataFlowPrivate::containerContent/1;

View File

@@ -36,19 +36,14 @@ edges
| apply.kt:6:28:6:41 | $this$apply : String | apply.kt:6:35:6:38 | this | provenance | |
| apply.kt:7:14:7:25 | taint(...) : String | apply.kt:7:14:7:40 | apply(...) | provenance | MaD:31 |
| list.kt:6:9:6:9 | l [post update] : List [<element>] : String | list.kt:7:14:7:14 | l | provenance | |
| list.kt:6:9:6:9 | l [post update] : List [<element>] : String | list.kt:8:14:8:14 | l : List | provenance | |
| list.kt:6:9:6:9 | l [post update] : List [<element>] : String | list.kt:8:14:8:14 | l : List [<element>] : String | provenance | |
| list.kt:6:9:6:9 | l [post update] : List [<element>] : String | list.kt:9:19:9:19 | l : List [<element>] : String | provenance | |
| list.kt:6:9:6:9 | l [post update] : List [<element>] : String | list.kt:10:18:10:18 | s | provenance | |
| list.kt:6:16:6:25 | taint(...) : String | list.kt:6:9:6:9 | l [post update] : List [<element>] : String | provenance | MaD:27 |
| list.kt:8:14:8:14 | l : List | list.kt:8:14:8:17 | get(...) | provenance | MaD:26 |
| list.kt:8:14:8:14 | l : List [<element>] : String | list.kt:8:14:8:17 | get(...) | provenance | MaD:26 |
| list.kt:9:19:9:19 | l : List [<element>] : String | list.kt:10:18:10:18 | s | provenance | |
| list.kt:13:17:13:40 | {...} : String[] [[]] : String | list.kt:14:14:14:14 | a | provenance | |
| list.kt:13:17:13:40 | {...} : String[] [[]] : String | list.kt:15:14:15:14 | a : String[] [[]] : String | provenance | |
| list.kt:13:17:13:40 | {...} : String[] [[]] : String | list.kt:15:14:15:17 | ...[...] | provenance | |
| list.kt:13:17:13:40 | {...} : String[] [[]] : String | list.kt:16:19:16:19 | a : String[] [[]] : String | provenance | |
| list.kt:13:17:13:40 | {...} : String[] [[]] : String | list.kt:17:18:17:18 | s | provenance | |
| list.kt:13:25:13:34 | taint(...) : String | list.kt:13:17:13:40 | {...} : String[] [[]] : String | provenance | |
| list.kt:15:14:15:14 | a : String[] [[]] : String | list.kt:15:14:15:17 | ...[...] | provenance | |
| list.kt:16:19:16:19 | a : String[] [[]] : String | list.kt:17:18:17:18 | s | provenance | |
@@ -134,7 +129,6 @@ nodes
| list.kt:6:9:6:9 | l [post update] : List [<element>] : String | semmle.label | l [post update] : List [<element>] : String |
| list.kt:6:16:6:25 | taint(...) : String | semmle.label | taint(...) : String |
| list.kt:7:14:7:14 | l | semmle.label | l |
| list.kt:8:14:8:14 | l : List | semmle.label | l : List |
| list.kt:8:14:8:14 | l : List [<element>] : String | semmle.label | l : List [<element>] : String |
| list.kt:8:14:8:17 | get(...) | semmle.label | get(...) |
| list.kt:9:19:9:19 | l : List [<element>] : String | semmle.label | l : List [<element>] : String |

View File

@@ -36,19 +36,14 @@ edges
| apply.kt:6:28:6:41 | $this$apply : String | apply.kt:6:35:6:38 | this | provenance | |
| apply.kt:7:14:7:25 | taint(...) : String | apply.kt:7:14:7:40 | apply(...) | provenance | MaD:31 |
| list.kt:6:9:6:9 | l [post update] : List [<element>] : String | list.kt:7:14:7:14 | l | provenance | |
| list.kt:6:9:6:9 | l [post update] : List [<element>] : String | list.kt:8:14:8:14 | l : List | provenance | |
| list.kt:6:9:6:9 | l [post update] : List [<element>] : String | list.kt:8:14:8:14 | l : List [<element>] : String | provenance | |
| list.kt:6:9:6:9 | l [post update] : List [<element>] : String | list.kt:9:19:9:19 | l : List [<element>] : String | provenance | |
| list.kt:6:9:6:9 | l [post update] : List [<element>] : String | list.kt:10:18:10:18 | s | provenance | |
| list.kt:6:16:6:25 | taint(...) : String | list.kt:6:9:6:9 | l [post update] : List [<element>] : String | provenance | MaD:27 |
| list.kt:8:14:8:14 | l : List | list.kt:8:14:8:17 | get(...) | provenance | MaD:26 |
| list.kt:8:14:8:14 | l : List [<element>] : String | list.kt:8:14:8:17 | get(...) | provenance | MaD:26 |
| list.kt:9:19:9:19 | l : List [<element>] : String | list.kt:10:18:10:18 | s | provenance | |
| list.kt:13:17:13:40 | {...} : String[] [[]] : String | list.kt:14:14:14:14 | a | provenance | |
| list.kt:13:17:13:40 | {...} : String[] [[]] : String | list.kt:15:14:15:14 | a : String[] [[]] : String | provenance | |
| list.kt:13:17:13:40 | {...} : String[] [[]] : String | list.kt:15:14:15:17 | ...[...] | provenance | |
| list.kt:13:17:13:40 | {...} : String[] [[]] : String | list.kt:16:19:16:19 | a : String[] [[]] : String | provenance | |
| list.kt:13:17:13:40 | {...} : String[] [[]] : String | list.kt:17:18:17:18 | s | provenance | |
| list.kt:13:25:13:34 | taint(...) : String | list.kt:13:17:13:40 | {...} : String[] [[]] : String | provenance | |
| list.kt:15:14:15:14 | a : String[] [[]] : String | list.kt:15:14:15:17 | ...[...] | provenance | |
| list.kt:16:19:16:19 | a : String[] [[]] : String | list.kt:17:18:17:18 | s | provenance | |
@@ -134,7 +129,6 @@ nodes
| list.kt:6:9:6:9 | l [post update] : List [<element>] : String | semmle.label | l [post update] : List [<element>] : String |
| list.kt:6:16:6:25 | taint(...) : String | semmle.label | taint(...) : String |
| list.kt:7:14:7:14 | l | semmle.label | l |
| list.kt:8:14:8:14 | l : List | semmle.label | l : List |
| list.kt:8:14:8:14 | l : List [<element>] : String | semmle.label | l : List [<element>] : String |
| list.kt:8:14:8:17 | get(...) | semmle.label | get(...) |
| list.kt:9:19:9:19 | l : List [<element>] : String | semmle.label | l : List [<element>] : String |

View File

@@ -6,8 +6,7 @@ edges
| FileService.java:20:31:20:43 | intent : Intent | FileService.java:21:28:21:33 | intent : Intent | provenance | |
| FileService.java:21:28:21:33 | intent : Intent | FileService.java:21:28:21:64 | getStringExtra(...) : String | provenance | MaD:2 |
| FileService.java:21:28:21:64 | getStringExtra(...) : String | FileService.java:25:42:25:50 | localPath : String | provenance | |
| FileService.java:25:13:25:51 | makeParamsToExecute(...) : Object[] | FileService.java:40:41:40:55 | params : Object[] | provenance | Config |
| FileService.java:25:13:25:51 | makeParamsToExecute(...) : Object[] [[]] : String | FileService.java:25:13:25:51 | makeParamsToExecute(...) : Object[] | provenance | |
| FileService.java:25:13:25:51 | makeParamsToExecute(...) : Object[] [[]] : String | FileService.java:40:41:40:55 | params : Object[] | provenance | Config |
| FileService.java:25:42:25:50 | localPath : String | FileService.java:25:13:25:51 | makeParamsToExecute(...) : Object[] [[]] : String | provenance | |
| FileService.java:25:42:25:50 | localPath : String | FileService.java:32:13:32:28 | sourceUri : String | provenance | |
| FileService.java:32:13:32:28 | sourceUri : String | FileService.java:35:17:35:25 | sourceUri : String | provenance | |
@@ -33,7 +32,6 @@ nodes
| FileService.java:20:31:20:43 | intent : Intent | semmle.label | intent : Intent |
| FileService.java:21:28:21:33 | intent : Intent | semmle.label | intent : Intent |
| FileService.java:21:28:21:64 | getStringExtra(...) : String | semmle.label | getStringExtra(...) : String |
| FileService.java:25:13:25:51 | makeParamsToExecute(...) : Object[] | semmle.label | makeParamsToExecute(...) : Object[] |
| FileService.java:25:13:25:51 | makeParamsToExecute(...) : Object[] [[]] : String | semmle.label | makeParamsToExecute(...) : Object[] [[]] : String |
| FileService.java:25:42:25:50 | localPath : String | semmle.label | localPath : String |
| FileService.java:32:13:32:28 | sourceUri : String | semmle.label | sourceUri : String |

View File

@@ -32,7 +32,6 @@ edges
| DotRegexSpring.java:71:11:71:42 | decode(...) : String | DotRegexSpring.java:71:29:71:32 | path : String | provenance | |
| DotRegexSpring.java:71:11:71:42 | decode(...) : String | DotRegexSpring.java:73:10:73:13 | path : String | provenance | |
| DotRegexSpring.java:71:29:71:32 | path : String | DotRegexSpring.java:71:11:71:42 | decode(...) : String | provenance | MaD:3 |
| DotRegexSpring.java:71:29:71:32 | path : String | DotRegexSpring.java:71:11:71:42 | decode(...) : String | provenance | MaD:3 |
models
| 1 | Source: javax.servlet.http; HttpServletRequest; false; getPathInfo; (); ; ReturnValue; uri-path; manual |
| 2 | Source: javax.servlet.http; HttpServletRequest; false; getRequestURI; (); ; ReturnValue; uri-path; manual |
@@ -61,11 +60,7 @@ nodes
| DotRegexSpring.java:69:28:69:38 | path : String | semmle.label | path : String |
| DotRegexSpring.java:71:11:71:42 | decode(...) : String | semmle.label | decode(...) : String |
| DotRegexSpring.java:71:29:71:32 | path : String | semmle.label | path : String |
| DotRegexSpring.java:71:29:71:32 | path : String | semmle.label | path : String |
| DotRegexSpring.java:73:10:73:13 | path : String | semmle.label | path : String |
| DotRegexSpring.java:73:10:73:13 | path : String | semmle.label | path : String |
subpaths
| DotRegexSpring.java:22:21:22:24 | path : String | DotRegexSpring.java:69:28:69:38 | path : String | DotRegexSpring.java:73:10:73:13 | path : String | DotRegexSpring.java:22:10:22:25 | decodePath(...) : String |
| DotRegexSpring.java:22:21:22:24 | path : String | DotRegexSpring.java:69:28:69:38 | path : String | DotRegexSpring.java:73:10:73:13 | path : String | DotRegexSpring.java:22:10:22:25 | decodePath(...) : String |
| DotRegexSpring.java:39:21:39:24 | path : String | DotRegexSpring.java:69:28:69:38 | path : String | DotRegexSpring.java:73:10:73:13 | path : String | DotRegexSpring.java:39:10:39:25 | decodePath(...) : String |
| DotRegexSpring.java:39:21:39:24 | path : String | DotRegexSpring.java:69:28:69:38 | path : String | DotRegexSpring.java:73:10:73:13 | path : String | DotRegexSpring.java:39:10:39:25 | decodePath(...) : String |

View File

@@ -116,16 +116,13 @@ edges
| B.java:107:31:111:5 | ...->... : new Consumer<String>(...) { ... } [String s] : String | B.java:107:31:111:5 | parameter this : new Consumer<String>(...) { ... } [String s] : String | provenance | heuristic-callback |
| B.java:107:31:111:5 | ...->... [post update] : new Consumer<String>(...) { ... } [List<String> out1, <element>] : String | B.java:107:31:111:5 | List<String> out1 : ArrayList [<element>] : String | provenance | |
| B.java:107:31:111:5 | ...->... [post update] : new Consumer<String>(...) { ... } [List<String> out2, <element>] : String | B.java:107:31:111:5 | List<String> out2 : ArrayList [<element>] : String | provenance | |
| B.java:107:31:111:5 | ...->... [post update] : new Consumer<String>(...) { ... } [List<String> out2, <element>] : String | B.java:107:31:111:5 | List<String> out2 : ArrayList [<element>] : String | provenance | |
| B.java:107:31:111:5 | List<String> out1 : ArrayList [<element>] : String | B.java:107:31:111:5 | this : new Consumer<List<String>>(...) { ... } [List<String> out1, <element>] : String | provenance | |
| B.java:107:31:111:5 | List<String> out2 : ArrayList [<element>] : String | B.java:107:31:111:5 | this : new Consumer<List<String>>(...) { ... } [List<String> out2, <element>] : String | provenance | |
| B.java:107:31:111:5 | List<String> out2 : ArrayList [<element>] : String | B.java:107:31:111:5 | this : new Consumer<List<String>>(...) { ... } [List<String> out2, <element>] : String | provenance | |
| B.java:107:31:111:5 | String s : String | B.java:107:31:111:5 | ...->... : new Consumer<String>(...) { ... } [String s] : String | provenance | |
| B.java:107:31:111:5 | parameter this : new Consumer<String>(...) { ... } [String s] : String | B.java:108:12:108:12 | this : new Consumer<String>(...) { ... } [String s] : String | provenance | |
| B.java:107:31:111:5 | parameter this : new Consumer<String>(...) { ... } [String s] : String | B.java:110:16:110:16 | this : new Consumer<String>(...) { ... } [String s] : String | provenance | |
| B.java:107:31:111:5 | this : new Consumer<List<String>>(...) { ... } [List<String> out1, <element>] : String | B.java:107:16:111:6 | parameter this [Return] : new Consumer<List<String>>(...) { ... } [List<String> out1, <element>] : String | provenance | |
| B.java:107:31:111:5 | this : new Consumer<List<String>>(...) { ... } [List<String> out2, <element>] : String | B.java:107:16:111:6 | parameter this [Return] : new Consumer<List<String>>(...) { ... } [List<String> out2, <element>] : String | provenance | |
| B.java:107:31:111:5 | this : new Consumer<List<String>>(...) { ... } [List<String> out2, <element>] : String | B.java:107:16:111:6 | parameter this [Return] : new Consumer<List<String>>(...) { ... } [List<String> out2, <element>] : String | provenance | |
| B.java:107:31:111:5 | this : new Consumer<List<String>>(...) { ... } [String s] : String | B.java:107:31:111:5 | String s : String | provenance | |
| B.java:108:12:108:12 | this : new Consumer<String>(...) { ... } [String s] : String | B.java:108:12:108:12 | s | provenance | |
| B.java:109:7:109:10 | out1 [post update] : ArrayList [<element>] : String | B.java:109:7:109:10 | this : new Consumer<String>(...) { ... } [List<String> out1, <element>] : String | provenance | |
@@ -363,23 +360,19 @@ nodes
| B.java:107:16:111:6 | parameter this : new Consumer<List<String>>(...) { ... } [String s] : String | semmle.label | parameter this : new Consumer<List<String>>(...) { ... } [String s] : String |
| B.java:107:16:111:6 | parameter this [Return] : new Consumer<List<String>>(...) { ... } [List<String> out1, <element>] : String | semmle.label | parameter this [Return] : new Consumer<List<String>>(...) { ... } [List<String> out1, <element>] : String |
| B.java:107:16:111:6 | parameter this [Return] : new Consumer<List<String>>(...) { ... } [List<String> out2, <element>] : String | semmle.label | parameter this [Return] : new Consumer<List<String>>(...) { ... } [List<String> out2, <element>] : String |
| B.java:107:16:111:6 | parameter this [Return] : new Consumer<List<String>>(...) { ... } [List<String> out2, <element>] : String | semmle.label | parameter this [Return] : new Consumer<List<String>>(...) { ... } [List<String> out2, <element>] : String |
| B.java:107:21:107:21 | l : ArrayList [<element>] : String | semmle.label | l : ArrayList [<element>] : String |
| B.java:107:31:107:31 | x : String | semmle.label | x : String |
| B.java:107:31:111:5 | ...->... : new Consumer<String>(...) { ... } [String s] : String | semmle.label | ...->... : new Consumer<String>(...) { ... } [String s] : String |
| B.java:107:31:111:5 | ...->... [post update] : new Consumer<String>(...) { ... } [List<String> out1, <element>] : String | semmle.label | ...->... [post update] : new Consumer<String>(...) { ... } [List<String> out1, <element>] : String |
| B.java:107:31:111:5 | ...->... [post update] : new Consumer<String>(...) { ... } [List<String> out2, <element>] : String | semmle.label | ...->... [post update] : new Consumer<String>(...) { ... } [List<String> out2, <element>] : String |
| B.java:107:31:111:5 | ...->... [post update] : new Consumer<String>(...) { ... } [List<String> out2, <element>] : String | semmle.label | ...->... [post update] : new Consumer<String>(...) { ... } [List<String> out2, <element>] : String |
| B.java:107:31:111:5 | List<String> out1 : ArrayList [<element>] : String | semmle.label | List<String> out1 : ArrayList [<element>] : String |
| B.java:107:31:111:5 | List<String> out2 : ArrayList [<element>] : String | semmle.label | List<String> out2 : ArrayList [<element>] : String |
| B.java:107:31:111:5 | List<String> out2 : ArrayList [<element>] : String | semmle.label | List<String> out2 : ArrayList [<element>] : String |
| B.java:107:31:111:5 | String s : String | semmle.label | String s : String |
| B.java:107:31:111:5 | parameter this : new Consumer<String>(...) { ... } [String s] : String | semmle.label | parameter this : new Consumer<String>(...) { ... } [String s] : String |
| B.java:107:31:111:5 | parameter this [Return] : new Consumer<String>(...) { ... } [List<String> out1, <element>] : String | semmle.label | parameter this [Return] : new Consumer<String>(...) { ... } [List<String> out1, <element>] : String |
| B.java:107:31:111:5 | parameter this [Return] : new Consumer<String>(...) { ... } [List<String> out2, <element>] : String | semmle.label | parameter this [Return] : new Consumer<String>(...) { ... } [List<String> out2, <element>] : String |
| B.java:107:31:111:5 | this : new Consumer<List<String>>(...) { ... } [List<String> out1, <element>] : String | semmle.label | this : new Consumer<List<String>>(...) { ... } [List<String> out1, <element>] : String |
| B.java:107:31:111:5 | this : new Consumer<List<String>>(...) { ... } [List<String> out2, <element>] : String | semmle.label | this : new Consumer<List<String>>(...) { ... } [List<String> out2, <element>] : String |
| B.java:107:31:111:5 | this : new Consumer<List<String>>(...) { ... } [List<String> out2, <element>] : String | semmle.label | this : new Consumer<List<String>>(...) { ... } [List<String> out2, <element>] : String |
| B.java:107:31:111:5 | this : new Consumer<List<String>>(...) { ... } [String s] : String | semmle.label | this : new Consumer<List<String>>(...) { ... } [String s] : String |
| B.java:108:12:108:12 | s | semmle.label | s |
| B.java:108:12:108:12 | this : new Consumer<String>(...) { ... } [String s] : String | semmle.label | this : new Consumer<String>(...) { ... } [String s] : String |
@@ -527,10 +520,8 @@ subpaths
| B.java:46:13:46:14 | m1 : HashMap [<map.value>] : String | B.java:38:23:38:45 | inp : HashMap [<map.value>] : String | B.java:38:48:38:70 | out [Return] : HashMap [<map.value>] : String | B.java:46:17:46:18 | m2 [post update] : HashMap [<map.value>] : String |
| B.java:107:5:107:6 | l2 : ArrayList [<element>, <element>] : String | B.java:107:16:107:16 | l : ArrayList [<element>] : String | B.java:107:16:111:6 | parameter this [Return] : new Consumer<List<String>>(...) { ... } [List<String> out1, <element>] : String | B.java:107:16:111:6 | ...->... [post update] : new Consumer<List<String>>(...) { ... } [List<String> out1, <element>] : String |
| B.java:107:16:111:6 | ...->... : new Consumer<List<String>>(...) { ... } [String s] : String | B.java:107:16:111:6 | parameter this : new Consumer<List<String>>(...) { ... } [String s] : String | B.java:107:16:111:6 | parameter this [Return] : new Consumer<List<String>>(...) { ... } [List<String> out2, <element>] : String | B.java:107:16:111:6 | ...->... [post update] : new Consumer<List<String>>(...) { ... } [List<String> out2, <element>] : String |
| B.java:107:16:111:6 | ...->... : new Consumer<List<String>>(...) { ... } [String s] : String | B.java:107:16:111:6 | parameter this : new Consumer<List<String>>(...) { ... } [String s] : String | B.java:107:16:111:6 | parameter this [Return] : new Consumer<List<String>>(...) { ... } [List<String> out2, <element>] : String | B.java:107:16:111:6 | ...->... [post update] : new Consumer<List<String>>(...) { ... } [List<String> out2, <element>] : String |
| B.java:107:21:107:21 | l : ArrayList [<element>] : String | B.java:107:31:107:31 | x : String | B.java:107:31:111:5 | parameter this [Return] : new Consumer<String>(...) { ... } [List<String> out1, <element>] : String | B.java:107:31:111:5 | ...->... [post update] : new Consumer<String>(...) { ... } [List<String> out1, <element>] : String |
| B.java:107:31:111:5 | ...->... : new Consumer<String>(...) { ... } [String s] : String | B.java:107:31:111:5 | parameter this : new Consumer<String>(...) { ... } [String s] : String | B.java:107:31:111:5 | parameter this [Return] : new Consumer<String>(...) { ... } [List<String> out2, <element>] : String | B.java:107:31:111:5 | ...->... [post update] : new Consumer<String>(...) { ... } [List<String> out2, <element>] : String |
| B.java:107:31:111:5 | ...->... : new Consumer<String>(...) { ... } [String s] : String | B.java:107:31:111:5 | parameter this : new Consumer<String>(...) { ... } [String s] : String | B.java:107:31:111:5 | parameter this [Return] : new Consumer<String>(...) { ... } [List<String> out2, <element>] : String | B.java:107:31:111:5 | ...->... [post update] : new Consumer<String>(...) { ... } [List<String> out2, <element>] : String |
| B.java:137:5:137:5 | r : new TwoRuns(...) { ... } [List<String> l1, <element>] : String | B.java:130:19:130:22 | parameter this : new TwoRuns(...) { ... } [List<String> l1, <element>] : String | B.java:130:19:130:22 | parameter this [Return] : new TwoRuns(...) { ... } [List<String> l2, <element>] : String | B.java:137:5:137:5 | r [post update] : new TwoRuns(...) { ... } [List<String> l2, <element>] : String |
| B.java:148:17:148:29 | new MyLocal(...) [pre constructor] : MyLocal [String s] : String | B.java:145:7:145:13 | parameter this : MyLocal [String s] : String | B.java:145:7:145:13 | parameter this [Return] : MyLocal [f] : String | B.java:148:17:148:29 | new MyLocal(...) : MyLocal [f] : String |
| B.java:149:10:149:10 | m : MyLocal [f] : String | B.java:146:14:146:17 | parameter this : MyLocal [f] : String | B.java:146:30:146:35 | this.f : String | B.java:149:10:149:17 | getF(...) |

View File

@@ -0,0 +1,27 @@
public class A {
String field;
static String source(String name) {
return name;
}
static void sink(Object o) {}
static String step(Object o) {
return "";
}
static Object getA() {
A a = new A();
a.field = source("source");
return a;
}
static void test() {
Object object = getA();
sink(step(object)); // $ hasTaintFlow=source
sink(object);
sink(((A)object).field); // $ hasTaintFlow=source
}
}

View File

@@ -0,0 +1,22 @@
import java
import TestUtilities.InlineFlowTest
module TestConfig implements DataFlow::ConfigSig {
predicate isSource(DataFlow::Node source) { DefaultFlowConfig::isSource(source) }
predicate isSink(DataFlow::Node sink) { DefaultFlowConfig::isSink(sink) }
predicate isAdditionalFlowStep(DataFlow::Node node1, DataFlow::Node node2) {
exists(MethodCall call |
call.getMethod().getName() = "step" and
node1.asExpr() = call.getArgument(0) and
node2.asExpr() = call
)
}
predicate allowImplicitRead(DataFlow::Node node, DataFlow::ContentSet content) {
isAdditionalFlowStep(node, _) and content instanceof DataFlow::FieldContent
}
}
import TaintFlowTest<TestConfig>

View File

@@ -1663,7 +1663,6 @@ edges
| Test.java:257:91:257:97 | element : String | Test.java:257:73:257:98 | of(...) : FluentIterable [<element>] : String | provenance | MaD:469 |
| Test.java:258:49:258:57 | element : String | Test.java:258:110:258:116 | element : String | provenance | |
| Test.java:258:104:258:104 | x [post update] : HashMultiSet [<element>] : String | Test.java:258:127:258:127 | x : HashMultiSet [<element>] : String | provenance | |
| Test.java:258:104:258:104 | x [post update] : HashMultiSet [<element>] : String | Test.java:258:127:258:127 | x : HashMultiSet [<element>] : String | provenance | |
| Test.java:258:110:258:116 | element : String | Test.java:258:104:258:104 | x [post update] : HashMultiSet [<element>] : String | provenance | MaD:2 |
| Test.java:258:110:258:116 | element : String | Test.java:258:104:258:104 | x [post update] : HashMultiSet [<element>] : String | provenance | MaD:673 |
| Test.java:259:49:259:57 | element : String | Test.java:259:90:259:96 | element : String | provenance | |
@@ -1683,17 +1682,13 @@ edges
| Test.java:261:77:261:83 | element : String | Test.java:261:61:261:93 | new MultiKey<T>(...) : MultiKey [<element>] : String | provenance | MaD:215 |
| Test.java:262:52:262:60 | element : String | Test.java:262:106:262:112 | element : String | provenance | |
| Test.java:262:83:262:113 | newMultiSetWithElement(...) : HashMultiSet [<element>] : String | Test.java:262:83:262:124 | entrySet(...) : Set [<element>, <element>] : String | provenance | MaD:674 |
| Test.java:262:83:262:113 | newMultiSetWithElement(...) : HashMultiSet [<element>] : String | Test.java:262:83:262:124 | entrySet(...) : Set [<element>, <element>] : String | provenance | MaD:674 |
| Test.java:262:83:262:124 | entrySet(...) : Set [<element>, <element>] : String | Test.java:230:19:230:32 | it : Set [<element>, <element>] : String | provenance | |
| Test.java:262:83:262:124 | entrySet(...) : Set [<element>, <element>] : String | Test.java:230:19:230:32 | it : Set [<element>, <element>] : String | provenance | |
| Test.java:262:83:262:124 | entrySet(...) : Set [<element>, <element>] : String | Test.java:262:72:262:125 | getElement(...) : Entry [<element>] : String | provenance | MaD:1 |
| Test.java:262:83:262:124 | entrySet(...) : Set [<element>, <element>] : String | Test.java:262:72:262:125 | getElement(...) : Entry [<element>] : String | provenance | MaD:1 |
| Test.java:262:106:262:112 | element : String | Test.java:262:83:262:113 | newMultiSetWithElement(...) : HashMultiSet [<element>] : String | provenance | MaD:2 |
| Test.java:262:106:262:112 | element : String | Test.java:262:83:262:113 | newMultiSetWithElement(...) : HashMultiSet [<element>] : String | provenance | MaD:673 |
| Test.java:262:106:262:112 | element : String | Test.java:263:41:263:49 | element : String | provenance | |
| Test.java:263:41:263:49 | element : String | Test.java:263:102:263:108 | element : String | provenance | |
| Test.java:263:96:263:96 | h [post update] : HashMultiSet [<element>] : String | Test.java:263:119:263:119 | h : HashMultiSet [<element>] : String | provenance | |
| Test.java:263:96:263:96 | h [post update] : HashMultiSet [<element>] : String | Test.java:263:119:263:119 | h : HashMultiSet [<element>] : String | provenance | |
| Test.java:263:102:263:108 | element : String | Test.java:263:96:263:96 | h [post update] : HashMultiSet [<element>] : String | provenance | MaD:2 |
| Test.java:263:102:263:108 | element : String | Test.java:263:96:263:96 | h [post update] : HashMultiSet [<element>] : String | provenance | MaD:673 |
| Test.java:264:80:264:88 | element : String | Test.java:264:177:264:183 | element : String | provenance | |
@@ -1708,8 +1703,6 @@ edges
| Test.java:267:39:267:47 | element : ListIterator [<element>] : String | Test.java:267:90:267:96 | element : ListIterator [<element>] : String | provenance | |
| Test.java:267:39:267:47 | element : String | Test.java:267:90:267:96 | element : String | provenance | |
| Test.java:267:84:267:84 | b [post update] : TreeBag [<element>, <element>] : String | Test.java:267:107:267:107 | b : TreeBag [<element>, <element>] : String | provenance | |
| Test.java:267:84:267:84 | b [post update] : TreeBag [<element>, <element>] : String | Test.java:267:107:267:107 | b : TreeBag [<element>, <element>] : String | provenance | |
| Test.java:267:84:267:84 | b [post update] : TreeBag [<element>] : String | Test.java:267:107:267:107 | b : TreeBag [<element>] : String | provenance | |
| Test.java:267:84:267:84 | b [post update] : TreeBag [<element>] : String | Test.java:267:107:267:107 | b : TreeBag [<element>] : String | provenance | |
| Test.java:267:90:267:96 | element : ListIterator [<element>] : String | Test.java:267:84:267:84 | b [post update] : TreeBag [<element>, <element>] : String | provenance | MaD:2 |
| Test.java:267:90:267:96 | element : ListIterator [<element>] : String | Test.java:267:84:267:84 | b [post update] : TreeBag [<element>, <element>] : String | provenance | MaD:395 |
@@ -1734,7 +1727,6 @@ edges
| Test.java:274:114:274:116 | key : String | Test.java:274:107:274:123 | of(...) : Map [<map.key>] : String | provenance | MaD:11 |
| Test.java:275:49:275:53 | key : String | Test.java:275:107:275:109 | key : String | provenance | |
| Test.java:275:101:275:101 | m [post update] : HashedMap [<map.key>] : String | Test.java:275:125:275:125 | m : HashedMap [<map.key>] : String | provenance | |
| Test.java:275:101:275:101 | m [post update] : HashedMap [<map.key>] : String | Test.java:275:125:275:125 | m : HashedMap [<map.key>] : String | provenance | |
| Test.java:275:107:275:109 | key : String | Test.java:275:101:275:101 | m [post update] : HashedMap [<map.key>] : String | provenance | MaD:14 |
| Test.java:275:107:275:109 | key : String | Test.java:275:101:275:101 | m [post update] : HashedMap [<map.key>] : String | provenance | MaD:705 |
| Test.java:276:49:276:53 | key : String | Test.java:276:96:276:98 | key : String | provenance | |
@@ -1748,8 +1740,6 @@ edges
| Test.java:277:122:277:124 | key : String | Test.java:277:115:277:131 | of(...) : Map [<map.key>] : String | provenance | MaD:11 |
| Test.java:279:47:279:51 | key : String | Test.java:279:113:279:115 | key : String | provenance | |
| Test.java:279:107:279:107 | m [post update] : MultiValueMap [<map.key>] : String | Test.java:279:131:279:131 | m : MultiValueMap [<map.key>] : String | provenance | |
| Test.java:279:107:279:107 | m [post update] : MultiValueMap [<map.key>] : String | Test.java:279:131:279:131 | m : MultiValueMap [<map.key>] : String | provenance | |
| Test.java:279:107:279:107 | m [post update] : MultiValueMap [<map.key>] : String | Test.java:279:131:279:131 | m : MultiValueMap [<map.key>] : String | provenance | |
| Test.java:279:113:279:115 | key : String | Test.java:279:107:279:107 | m [post update] : MultiValueMap [<map.key>] : String | provenance | MaD:14 |
| Test.java:279:113:279:115 | key : String | Test.java:279:107:279:107 | m [post update] : MultiValueMap [<map.key>] : String | provenance | MaD:661 |
| Test.java:279:113:279:115 | key : String | Test.java:279:107:279:107 | m [post update] : MultiValueMap [<map.key>] : String | provenance | MaD:705 |
@@ -1766,11 +1756,9 @@ edges
| Test.java:282:102:282:104 | key : String | Test.java:7043:22:7043:26 | key : String | provenance | |
| Test.java:283:53:283:57 | key : String | Test.java:283:111:283:113 | key : String | provenance | |
| Test.java:283:105:283:105 | m [post update] : LinkedMap [<map.key>] : String | Test.java:283:129:283:129 | m : LinkedMap [<map.key>] : String | provenance | |
| Test.java:283:105:283:105 | m [post update] : LinkedMap [<map.key>] : String | Test.java:283:129:283:129 | m : LinkedMap [<map.key>] : String | provenance | |
| Test.java:283:111:283:113 | key : String | Test.java:283:105:283:105 | m [post update] : LinkedMap [<map.key>] : String | provenance | MaD:14 |
| Test.java:283:111:283:113 | key : String | Test.java:283:105:283:105 | m [post update] : LinkedMap [<map.key>] : String | provenance | MaD:705 |
| Test.java:283:129:283:129 | m : LinkedMap [<map.key>] : String | Test.java:283:129:283:143 | mapIterator(...) : OrderedMapIterator [<element>] : String | provenance | MaD:487 |
| Test.java:283:129:283:129 | m : LinkedMap [<map.key>] : String | Test.java:283:129:283:143 | mapIterator(...) : OrderedMapIterator [<element>] : String | provenance | MaD:487 |
| Test.java:285:47:285:51 | key : String | Test.java:285:103:285:105 | key : String | provenance | |
| Test.java:285:97:285:97 | m [post update] : TreeMap [<map.key>] : String | Test.java:285:121:285:121 | m : TreeMap [<map.key>] : String | provenance | |
| Test.java:285:103:285:105 | key : String | Test.java:285:97:285:97 | m [post update] : TreeMap [<map.key>] : String | provenance | MaD:14 |
@@ -1778,12 +1766,10 @@ edges
| Test.java:286:113:286:115 | key : String | Test.java:286:62:286:116 | new TiedMapEntry<K,String>(...) : TiedMapEntry [<map.key>] : String | provenance | MaD:234 |
| Test.java:287:75:287:79 | key : String | Test.java:287:137:287:139 | key : String | provenance | |
| Test.java:287:131:287:131 | m [post update] : TreeBidiMap [<map.key>] : String | Test.java:287:155:287:155 | m : TreeBidiMap [<map.key>] : String | provenance | |
| Test.java:287:131:287:131 | m [post update] : TreeBidiMap [<map.key>] : String | Test.java:287:155:287:155 | m : TreeBidiMap [<map.key>] : String | provenance | |
| Test.java:287:137:287:139 | key : String | Test.java:287:131:287:131 | m [post update] : TreeBidiMap [<map.key>] : String | provenance | MaD:14 |
| Test.java:287:137:287:139 | key : String | Test.java:287:131:287:131 | m [post update] : TreeBidiMap [<map.key>] : String | provenance | MaD:705 |
| Test.java:288:49:288:58 | key : String | Test.java:288:116:288:118 | key : String | provenance | |
| Test.java:288:110:288:110 | m [post update] : PatriciaTrie [<map.key>] : String | Test.java:288:134:288:134 | m : PatriciaTrie [<map.key>] : String | provenance | |
| Test.java:288:110:288:110 | m [post update] : PatriciaTrie [<map.key>] : String | Test.java:288:134:288:134 | m : PatriciaTrie [<map.key>] : String | provenance | |
| Test.java:288:116:288:118 | key : String | Test.java:288:110:288:110 | m [post update] : PatriciaTrie [<map.key>] : String | provenance | MaD:14 |
| Test.java:288:116:288:118 | key : String | Test.java:288:110:288:110 | m [post update] : PatriciaTrie [<map.key>] : String | provenance | MaD:705 |
| Test.java:290:60:290:66 | value : String | Test.java:290:151:290:155 | value : String | provenance | |
@@ -1796,7 +1782,6 @@ edges
| Test.java:292:124:292:128 | value : String | Test.java:292:111:292:129 | of(...) : Map [<map.value>] : String | provenance | MaD:12 |
| Test.java:293:51:293:57 | value : String | Test.java:293:116:293:120 | value : String | provenance | |
| Test.java:293:105:293:105 | m [post update] : HashedMap [<map.value>] : String | Test.java:293:131:293:131 | m : HashedMap [<map.value>] : String | provenance | |
| Test.java:293:105:293:105 | m [post update] : HashedMap [<map.value>] : String | Test.java:293:131:293:131 | m : HashedMap [<map.value>] : String | provenance | |
| Test.java:293:116:293:120 | value : String | Test.java:293:105:293:105 | m [post update] : HashedMap [<map.value>] : String | provenance | MaD:15 |
| Test.java:293:116:293:120 | value : String | Test.java:293:105:293:105 | m [post update] : HashedMap [<map.value>] : String | provenance | MaD:706 |
| Test.java:294:58:294:64 | value : String | Test.java:294:145:294:149 | value : String | provenance | |
@@ -1817,7 +1802,6 @@ edges
| Test.java:298:49:298:55 | value : String | Test.java:298:122:298:126 | value : String | provenance | |
| Test.java:298:111:298:111 | m [post update] : MultiValueMap [<map.value>, <element>] : String | Test.java:298:137:298:137 | m : MultiValueMap [<map.value>, <element>] : String | provenance | |
| Test.java:298:111:298:111 | m [post update] : MultiValueMap [<map.value>] : String | Test.java:298:137:298:137 | m : MultiValueMap [<map.value>] : String | provenance | |
| Test.java:298:111:298:111 | m [post update] : MultiValueMap [<map.value>] : String | Test.java:298:137:298:137 | m : MultiValueMap [<map.value>] : String | provenance | |
| Test.java:298:122:298:126 | value : String | Test.java:298:111:298:111 | m [post update] : MultiValueMap [<map.value>, <element>] : String | provenance | MaD:662 |
| Test.java:298:122:298:126 | value : String | Test.java:298:111:298:111 | m [post update] : MultiValueMap [<map.value>] : String | provenance | MaD:15 |
| Test.java:298:122:298:126 | value : String | Test.java:298:111:298:111 | m [post update] : MultiValueMap [<map.value>] : String | provenance | MaD:706 |
@@ -1834,11 +1818,9 @@ edges
| Test.java:301:145:301:149 | value : String | Test.java:301:125:301:150 | newMAMEWithMapValue(...) : MyAbstractMapEntry [<map.value>] : String | provenance | MaD:196 |
| Test.java:302:54:302:60 | value : String | Test.java:302:119:302:123 | value : String | provenance | |
| Test.java:302:108:302:108 | m [post update] : LinkedMap [<map.value>] : String | Test.java:302:134:302:134 | m : LinkedMap [<map.value>] : String | provenance | |
| Test.java:302:108:302:108 | m [post update] : LinkedMap [<map.value>] : String | Test.java:302:134:302:134 | m : LinkedMap [<map.value>] : String | provenance | |
| Test.java:302:119:302:123 | value : String | Test.java:302:108:302:108 | m [post update] : LinkedMap [<map.value>] : String | provenance | MaD:15 |
| Test.java:302:119:302:123 | value : String | Test.java:302:108:302:108 | m [post update] : LinkedMap [<map.value>] : String | provenance | MaD:706 |
| Test.java:302:134:302:134 | m : LinkedMap [<map.value>] : String | Test.java:302:134:302:148 | mapIterator(...) : OrderedMapIterator [<map.value>] : String | provenance | MaD:488 |
| Test.java:302:134:302:134 | m : LinkedMap [<map.value>] : String | Test.java:302:134:302:148 | mapIterator(...) : OrderedMapIterator [<map.value>] : String | provenance | MaD:488 |
| Test.java:304:49:304:55 | value : Map | Test.java:304:112:304:116 | value : Map | provenance | |
| Test.java:304:49:304:55 | value : String | Test.java:304:112:304:116 | value : String | provenance | |
| Test.java:304:101:304:101 | m [post update] : TreeMap [<map.value>] : Map | Test.java:304:127:304:127 | m : TreeMap [<map.value>] : Map | provenance | |
@@ -1851,12 +1833,10 @@ edges
| Test.java:305:116:305:120 | value : String | Test.java:305:93:305:121 | newTreeMapWithMapValue(...) : TreeMap [<map.value>] : String | provenance | MaD:15 |
| Test.java:306:77:306:83 | value : String | Test.java:306:146:306:150 | value : String | provenance | |
| Test.java:306:135:306:135 | m [post update] : TreeBidiMap [<map.value>] : String | Test.java:306:161:306:161 | m : TreeBidiMap [<map.value>] : String | provenance | |
| Test.java:306:135:306:135 | m [post update] : TreeBidiMap [<map.value>] : String | Test.java:306:161:306:161 | m : TreeBidiMap [<map.value>] : String | provenance | |
| Test.java:306:146:306:150 | value : String | Test.java:306:135:306:135 | m [post update] : TreeBidiMap [<map.value>] : String | provenance | MaD:15 |
| Test.java:306:146:306:150 | value : String | Test.java:306:135:306:135 | m [post update] : TreeBidiMap [<map.value>] : String | provenance | MaD:706 |
| Test.java:307:50:307:56 | value : String | Test.java:307:114:307:118 | value : String | provenance | |
| Test.java:307:103:307:103 | m [post update] : PatriciaTrie [<map.value>] : String | Test.java:307:129:307:129 | m : PatriciaTrie [<map.value>] : String | provenance | |
| Test.java:307:103:307:103 | m [post update] : PatriciaTrie [<map.value>] : String | Test.java:307:129:307:129 | m : PatriciaTrie [<map.value>] : String | provenance | |
| Test.java:307:114:307:118 | value : String | Test.java:307:103:307:103 | m [post update] : PatriciaTrie [<map.value>] : String | provenance | MaD:15 |
| Test.java:307:114:307:118 | value : String | Test.java:307:103:307:103 | m [post update] : PatriciaTrie [<map.value>] : String | provenance | MaD:706 |
| Test.java:308:56:308:62 | value : String | Test.java:308:114:308:118 | value : String | provenance | |
@@ -10555,7 +10535,6 @@ nodes
| Test.java:239:18:239:57 | container : MyAbstractMapEntryDecorator [<map.key>] : String | semmle.label | container : MyAbstractMapEntryDecorator [<map.key>] : String |
| Test.java:239:69:239:77 | container : MyAbstractMapEntryDecorator [<map.key>] : String | semmle.label | container : MyAbstractMapEntryDecorator [<map.key>] : String |
| Test.java:239:69:239:86 | getKey(...) : String | semmle.label | getKey(...) : String |
| Test.java:239:69:239:86 | getKey(...) : String | semmle.label | getKey(...) : String |
| Test.java:240:18:240:46 | container : ArrayListValuedHashMap [<map.key>] : String | semmle.label | container : ArrayListValuedHashMap [<map.key>] : String |
| Test.java:240:18:240:46 | container : HashSetValuedHashMap [<map.key>] : String | semmle.label | container : HashSetValuedHashMap [<map.key>] : String |
| Test.java:240:18:240:46 | container : MultiValuedMap [<map.key>] : Object | semmle.label | container : MultiValuedMap [<map.key>] : Object |
@@ -10641,7 +10620,6 @@ nodes
| Test.java:245:20:245:59 | container : MyAbstractMapEntryDecorator [<map.value>] : String | semmle.label | container : MyAbstractMapEntryDecorator [<map.value>] : String |
| Test.java:245:71:245:79 | container : MyAbstractMapEntryDecorator [<map.value>] : String | semmle.label | container : MyAbstractMapEntryDecorator [<map.value>] : String |
| Test.java:245:71:245:90 | getValue(...) : String | semmle.label | getValue(...) : String |
| Test.java:245:71:245:90 | getValue(...) : String | semmle.label | getValue(...) : String |
| Test.java:246:20:246:47 | mapIterator : EntrySetToMapIteratorAdapter [<map.value>] : String | semmle.label | mapIterator : EntrySetToMapIteratorAdapter [<map.value>] : String |
| Test.java:246:20:246:47 | mapIterator : MapIterator [<map.value>] : Object | semmle.label | mapIterator : MapIterator [<map.value>] : Object |
| Test.java:246:20:246:47 | mapIterator : MapIterator [<map.value>] : String | semmle.label | mapIterator : MapIterator [<map.value>] : String |
@@ -10732,10 +10710,8 @@ nodes
| Test.java:257:91:257:97 | element : String | semmle.label | element : String |
| Test.java:258:49:258:57 | element : String | semmle.label | element : String |
| Test.java:258:104:258:104 | x [post update] : HashMultiSet [<element>] : String | semmle.label | x [post update] : HashMultiSet [<element>] : String |
| Test.java:258:104:258:104 | x [post update] : HashMultiSet [<element>] : String | semmle.label | x [post update] : HashMultiSet [<element>] : String |
| Test.java:258:110:258:116 | element : String | semmle.label | element : String |
| Test.java:258:127:258:127 | x : HashMultiSet [<element>] : String | semmle.label | x : HashMultiSet [<element>] : String |
| Test.java:258:127:258:127 | x : HashMultiSet [<element>] : String | semmle.label | x : HashMultiSet [<element>] : String |
| Test.java:259:49:259:57 | element : String | semmle.label | element : String |
| Test.java:259:69:259:97 | newVectorWithElement(...) : Vector [<element>] : String | semmle.label | newVectorWithElement(...) : Vector [<element>] : String |
| Test.java:259:69:259:112 | listIterator(...) : ListIterator [<element>] : String | semmle.label | listIterator(...) : ListIterator [<element>] : String |
@@ -10757,18 +10733,13 @@ nodes
| Test.java:261:77:261:83 | element : String | semmle.label | element : String |
| Test.java:262:52:262:60 | element : String | semmle.label | element : String |
| Test.java:262:72:262:125 | getElement(...) : Entry [<element>] : String | semmle.label | getElement(...) : Entry [<element>] : String |
| Test.java:262:72:262:125 | getElement(...) : Entry [<element>] : String | semmle.label | getElement(...) : Entry [<element>] : String |
| Test.java:262:83:262:113 | newMultiSetWithElement(...) : HashMultiSet [<element>] : String | semmle.label | newMultiSetWithElement(...) : HashMultiSet [<element>] : String |
| Test.java:262:83:262:113 | newMultiSetWithElement(...) : HashMultiSet [<element>] : String | semmle.label | newMultiSetWithElement(...) : HashMultiSet [<element>] : String |
| Test.java:262:83:262:124 | entrySet(...) : Set [<element>, <element>] : String | semmle.label | entrySet(...) : Set [<element>, <element>] : String |
| Test.java:262:83:262:124 | entrySet(...) : Set [<element>, <element>] : String | semmle.label | entrySet(...) : Set [<element>, <element>] : String |
| Test.java:262:106:262:112 | element : String | semmle.label | element : String |
| Test.java:263:41:263:49 | element : String | semmle.label | element : String |
| Test.java:263:96:263:96 | h [post update] : HashMultiSet [<element>] : String | semmle.label | h [post update] : HashMultiSet [<element>] : String |
| Test.java:263:96:263:96 | h [post update] : HashMultiSet [<element>] : String | semmle.label | h [post update] : HashMultiSet [<element>] : String |
| Test.java:263:102:263:108 | element : String | semmle.label | element : String |
| Test.java:263:119:263:119 | h : HashMultiSet [<element>] : String | semmle.label | h : HashMultiSet [<element>] : String |
| Test.java:263:119:263:119 | h : HashMultiSet [<element>] : String | semmle.label | h : HashMultiSet [<element>] : String |
| Test.java:264:80:264:88 | element : String | semmle.label | element : String |
| Test.java:264:171:264:171 | x [post update] : Builder [<element>] : String | semmle.label | x [post update] : Builder [<element>] : String |
| Test.java:264:177:264:183 | element : String | semmle.label | element : String |
@@ -10784,14 +10755,10 @@ nodes
| Test.java:267:39:267:47 | element : ListIterator [<element>] : String | semmle.label | element : ListIterator [<element>] : String |
| Test.java:267:39:267:47 | element : String | semmle.label | element : String |
| Test.java:267:84:267:84 | b [post update] : TreeBag [<element>, <element>] : String | semmle.label | b [post update] : TreeBag [<element>, <element>] : String |
| Test.java:267:84:267:84 | b [post update] : TreeBag [<element>, <element>] : String | semmle.label | b [post update] : TreeBag [<element>, <element>] : String |
| Test.java:267:84:267:84 | b [post update] : TreeBag [<element>] : String | semmle.label | b [post update] : TreeBag [<element>] : String |
| Test.java:267:84:267:84 | b [post update] : TreeBag [<element>] : String | semmle.label | b [post update] : TreeBag [<element>] : String |
| Test.java:267:90:267:96 | element : ListIterator [<element>] : String | semmle.label | element : ListIterator [<element>] : String |
| Test.java:267:90:267:96 | element : String | semmle.label | element : String |
| Test.java:267:107:267:107 | b : TreeBag [<element>, <element>] : String | semmle.label | b : TreeBag [<element>, <element>] : String |
| Test.java:267:107:267:107 | b : TreeBag [<element>, <element>] : String | semmle.label | b : TreeBag [<element>, <element>] : String |
| Test.java:267:107:267:107 | b : TreeBag [<element>] : String | semmle.label | b : TreeBag [<element>] : String |
| Test.java:267:107:267:107 | b : TreeBag [<element>] : String | semmle.label | b : TreeBag [<element>] : String |
| Test.java:268:39:268:47 | element : String | semmle.label | element : String |
| Test.java:268:84:268:84 | h [post update] : TreeSet [<element>] : String | semmle.label | h [post update] : TreeSet [<element>] : String |
@@ -10818,10 +10785,8 @@ nodes
| Test.java:274:114:274:116 | key : String | semmle.label | key : String |
| Test.java:275:49:275:53 | key : String | semmle.label | key : String |
| Test.java:275:101:275:101 | m [post update] : HashedMap [<map.key>] : String | semmle.label | m [post update] : HashedMap [<map.key>] : String |
| Test.java:275:101:275:101 | m [post update] : HashedMap [<map.key>] : String | semmle.label | m [post update] : HashedMap [<map.key>] : String |
| Test.java:275:107:275:109 | key : String | semmle.label | key : String |
| Test.java:275:125:275:125 | m : HashedMap [<map.key>] : String | semmle.label | m : HashedMap [<map.key>] : String |
| Test.java:275:125:275:125 | m : HashedMap [<map.key>] : String | semmle.label | m : HashedMap [<map.key>] : String |
| Test.java:276:49:276:53 | key : String | semmle.label | key : String |
| Test.java:276:65:276:106 | new LinkedMap<K,String>(...) : LinkedMap [<map.key>] : String | semmle.label | new LinkedMap<K,String>(...) : LinkedMap [<map.key>] : String |
| Test.java:276:89:276:105 | of(...) : Map [<map.key>] : String | semmle.label | of(...) : Map [<map.key>] : String |
@@ -10836,12 +10801,8 @@ nodes
| Test.java:277:122:277:124 | key : String | semmle.label | key : String |
| Test.java:279:47:279:51 | key : String | semmle.label | key : String |
| Test.java:279:107:279:107 | m [post update] : MultiValueMap [<map.key>] : String | semmle.label | m [post update] : MultiValueMap [<map.key>] : String |
| Test.java:279:107:279:107 | m [post update] : MultiValueMap [<map.key>] : String | semmle.label | m [post update] : MultiValueMap [<map.key>] : String |
| Test.java:279:107:279:107 | m [post update] : MultiValueMap [<map.key>] : String | semmle.label | m [post update] : MultiValueMap [<map.key>] : String |
| Test.java:279:113:279:115 | key : String | semmle.label | key : String |
| Test.java:279:131:279:131 | m : MultiValueMap [<map.key>] : String | semmle.label | m : MultiValueMap [<map.key>] : String |
| Test.java:279:131:279:131 | m : MultiValueMap [<map.key>] : String | semmle.label | m : MultiValueMap [<map.key>] : String |
| Test.java:279:131:279:131 | m : MultiValueMap [<map.key>] : String | semmle.label | m : MultiValueMap [<map.key>] : String |
| Test.java:280:53:280:57 | key : String | semmle.label | key : String |
| Test.java:280:69:280:110 | new MyAbstractMapEntry<K,String>(...) : MyAbstractMapEntry [<map.key>] : String | semmle.label | new MyAbstractMapEntry<K,String>(...) : MyAbstractMapEntry [<map.key>] : String |
| Test.java:280:102:280:104 | key : String | semmle.label | key : String |
@@ -10854,11 +10815,8 @@ nodes
| Test.java:282:102:282:104 | key : String | semmle.label | key : String |
| Test.java:283:53:283:57 | key : String | semmle.label | key : String |
| Test.java:283:105:283:105 | m [post update] : LinkedMap [<map.key>] : String | semmle.label | m [post update] : LinkedMap [<map.key>] : String |
| Test.java:283:105:283:105 | m [post update] : LinkedMap [<map.key>] : String | semmle.label | m [post update] : LinkedMap [<map.key>] : String |
| Test.java:283:111:283:113 | key : String | semmle.label | key : String |
| Test.java:283:129:283:129 | m : LinkedMap [<map.key>] : String | semmle.label | m : LinkedMap [<map.key>] : String |
| Test.java:283:129:283:129 | m : LinkedMap [<map.key>] : String | semmle.label | m : LinkedMap [<map.key>] : String |
| Test.java:283:129:283:143 | mapIterator(...) : OrderedMapIterator [<element>] : String | semmle.label | mapIterator(...) : OrderedMapIterator [<element>] : String |
| Test.java:283:129:283:143 | mapIterator(...) : OrderedMapIterator [<element>] : String | semmle.label | mapIterator(...) : OrderedMapIterator [<element>] : String |
| Test.java:285:47:285:51 | key : String | semmle.label | key : String |
| Test.java:285:97:285:97 | m [post update] : TreeMap [<map.key>] : String | semmle.label | m [post update] : TreeMap [<map.key>] : String |
@@ -10869,16 +10827,12 @@ nodes
| Test.java:286:113:286:115 | key : String | semmle.label | key : String |
| Test.java:287:75:287:79 | key : String | semmle.label | key : String |
| Test.java:287:131:287:131 | m [post update] : TreeBidiMap [<map.key>] : String | semmle.label | m [post update] : TreeBidiMap [<map.key>] : String |
| Test.java:287:131:287:131 | m [post update] : TreeBidiMap [<map.key>] : String | semmle.label | m [post update] : TreeBidiMap [<map.key>] : String |
| Test.java:287:137:287:139 | key : String | semmle.label | key : String |
| Test.java:287:155:287:155 | m : TreeBidiMap [<map.key>] : String | semmle.label | m : TreeBidiMap [<map.key>] : String |
| Test.java:287:155:287:155 | m : TreeBidiMap [<map.key>] : String | semmle.label | m : TreeBidiMap [<map.key>] : String |
| Test.java:288:49:288:58 | key : String | semmle.label | key : String |
| Test.java:288:110:288:110 | m [post update] : PatriciaTrie [<map.key>] : String | semmle.label | m [post update] : PatriciaTrie [<map.key>] : String |
| Test.java:288:110:288:110 | m [post update] : PatriciaTrie [<map.key>] : String | semmle.label | m [post update] : PatriciaTrie [<map.key>] : String |
| Test.java:288:116:288:118 | key : String | semmle.label | key : String |
| Test.java:288:134:288:134 | m : PatriciaTrie [<map.key>] : String | semmle.label | m : PatriciaTrie [<map.key>] : String |
| Test.java:288:134:288:134 | m : PatriciaTrie [<map.key>] : String | semmle.label | m : PatriciaTrie [<map.key>] : String |
| Test.java:290:60:290:66 | value : String | semmle.label | value : String |
| Test.java:290:140:290:140 | m [post update] : ArrayListValuedHashMap [<map.value>, <element>] : String | semmle.label | m [post update] : ArrayListValuedHashMap [<map.value>, <element>] : String |
| Test.java:290:151:290:155 | value : String | semmle.label | value : String |
@@ -10892,10 +10846,8 @@ nodes
| Test.java:292:124:292:128 | value : String | semmle.label | value : String |
| Test.java:293:51:293:57 | value : String | semmle.label | value : String |
| Test.java:293:105:293:105 | m [post update] : HashedMap [<map.value>] : String | semmle.label | m [post update] : HashedMap [<map.value>] : String |
| Test.java:293:105:293:105 | m [post update] : HashedMap [<map.value>] : String | semmle.label | m [post update] : HashedMap [<map.value>] : String |
| Test.java:293:116:293:120 | value : String | semmle.label | value : String |
| Test.java:293:131:293:131 | m : HashedMap [<map.value>] : String | semmle.label | m : HashedMap [<map.value>] : String |
| Test.java:293:131:293:131 | m : HashedMap [<map.value>] : String | semmle.label | m : HashedMap [<map.value>] : String |
| Test.java:294:58:294:64 | value : String | semmle.label | value : String |
| Test.java:294:134:294:134 | m [post update] : HashSetValuedHashMap [<map.value>, <element>] : String | semmle.label | m [post update] : HashSetValuedHashMap [<map.value>, <element>] : String |
| Test.java:294:145:294:149 | value : String | semmle.label | value : String |
@@ -10919,11 +10871,9 @@ nodes
| Test.java:298:49:298:55 | value : String | semmle.label | value : String |
| Test.java:298:111:298:111 | m [post update] : MultiValueMap [<map.value>, <element>] : String | semmle.label | m [post update] : MultiValueMap [<map.value>, <element>] : String |
| Test.java:298:111:298:111 | m [post update] : MultiValueMap [<map.value>] : String | semmle.label | m [post update] : MultiValueMap [<map.value>] : String |
| Test.java:298:111:298:111 | m [post update] : MultiValueMap [<map.value>] : String | semmle.label | m [post update] : MultiValueMap [<map.value>] : String |
| Test.java:298:122:298:126 | value : String | semmle.label | value : String |
| Test.java:298:137:298:137 | m : MultiValueMap [<map.value>, <element>] : String | semmle.label | m : MultiValueMap [<map.value>, <element>] : String |
| Test.java:298:137:298:137 | m : MultiValueMap [<map.value>] : String | semmle.label | m : MultiValueMap [<map.value>] : String |
| Test.java:298:137:298:137 | m : MultiValueMap [<map.value>] : String | semmle.label | m : MultiValueMap [<map.value>] : String |
| Test.java:299:55:299:61 | value : String | semmle.label | value : String |
| Test.java:299:73:299:116 | new MyAbstractKeyValue<String,V>(...) : MyAbstractKeyValue [<map.value>] : String | semmle.label | new MyAbstractKeyValue<String,V>(...) : MyAbstractKeyValue [<map.value>] : String |
| Test.java:299:111:299:115 | value : String | semmle.label | value : String |
@@ -10936,11 +10886,8 @@ nodes
| Test.java:301:145:301:149 | value : String | semmle.label | value : String |
| Test.java:302:54:302:60 | value : String | semmle.label | value : String |
| Test.java:302:108:302:108 | m [post update] : LinkedMap [<map.value>] : String | semmle.label | m [post update] : LinkedMap [<map.value>] : String |
| Test.java:302:108:302:108 | m [post update] : LinkedMap [<map.value>] : String | semmle.label | m [post update] : LinkedMap [<map.value>] : String |
| Test.java:302:119:302:123 | value : String | semmle.label | value : String |
| Test.java:302:134:302:134 | m : LinkedMap [<map.value>] : String | semmle.label | m : LinkedMap [<map.value>] : String |
| Test.java:302:134:302:134 | m : LinkedMap [<map.value>] : String | semmle.label | m : LinkedMap [<map.value>] : String |
| Test.java:302:134:302:148 | mapIterator(...) : OrderedMapIterator [<map.value>] : String | semmle.label | mapIterator(...) : OrderedMapIterator [<map.value>] : String |
| Test.java:302:134:302:148 | mapIterator(...) : OrderedMapIterator [<map.value>] : String | semmle.label | mapIterator(...) : OrderedMapIterator [<map.value>] : String |
| Test.java:304:49:304:55 | value : Map | semmle.label | value : Map |
| Test.java:304:49:304:55 | value : String | semmle.label | value : String |
@@ -10956,16 +10903,12 @@ nodes
| Test.java:305:116:305:120 | value : String | semmle.label | value : String |
| Test.java:306:77:306:83 | value : String | semmle.label | value : String |
| Test.java:306:135:306:135 | m [post update] : TreeBidiMap [<map.value>] : String | semmle.label | m [post update] : TreeBidiMap [<map.value>] : String |
| Test.java:306:135:306:135 | m [post update] : TreeBidiMap [<map.value>] : String | semmle.label | m [post update] : TreeBidiMap [<map.value>] : String |
| Test.java:306:146:306:150 | value : String | semmle.label | value : String |
| Test.java:306:161:306:161 | m : TreeBidiMap [<map.value>] : String | semmle.label | m : TreeBidiMap [<map.value>] : String |
| Test.java:306:161:306:161 | m : TreeBidiMap [<map.value>] : String | semmle.label | m : TreeBidiMap [<map.value>] : String |
| Test.java:307:50:307:56 | value : String | semmle.label | value : String |
| Test.java:307:103:307:103 | m [post update] : PatriciaTrie [<map.value>] : String | semmle.label | m [post update] : PatriciaTrie [<map.value>] : String |
| Test.java:307:103:307:103 | m [post update] : PatriciaTrie [<map.value>] : String | semmle.label | m [post update] : PatriciaTrie [<map.value>] : String |
| Test.java:307:114:307:118 | value : String | semmle.label | value : String |
| Test.java:307:129:307:129 | m : PatriciaTrie [<map.value>] : String | semmle.label | m : PatriciaTrie [<map.value>] : String |
| Test.java:307:129:307:129 | m : PatriciaTrie [<map.value>] : String | semmle.label | m : PatriciaTrie [<map.value>] : String |
| Test.java:308:56:308:62 | value : String | semmle.label | value : String |
| Test.java:308:74:308:119 | new UnmodifiableMapEntry<String,V>(...) : UnmodifiableMapEntry [<map.value>] : String | semmle.label | new UnmodifiableMapEntry<String,V>(...) : UnmodifiableMapEntry [<map.value>] : String |
| Test.java:308:114:308:118 | value : String | semmle.label | value : String |
@@ -17799,10 +17742,6 @@ subpaths
| Test.java:256:115:256:121 | element : String | Test.java:269:37:269:45 | element : String | Test.java:269:103:269:103 | v : Vector [<element>] : String | Test.java:256:94:256:122 | newVectorWithElement(...) : Vector [<element>] : String |
| Test.java:259:90:259:96 | element : String | Test.java:269:37:269:45 | element : String | Test.java:269:103:269:103 | v : Vector [<element>] : String | Test.java:259:69:259:97 | newVectorWithElement(...) : Vector [<element>] : String |
| Test.java:262:83:262:124 | entrySet(...) : Set [<element>, <element>] : String | Test.java:230:19:230:32 | it : Set [<element>, <element>] : String | Test.java:230:44:230:63 | next(...) : Object [<element>] : String | Test.java:262:72:262:125 | getElement(...) : Entry [<element>] : String |
| Test.java:262:83:262:124 | entrySet(...) : Set [<element>, <element>] : String | Test.java:230:19:230:32 | it : Set [<element>, <element>] : String | Test.java:230:44:230:63 | next(...) : Object [<element>] : String | Test.java:262:72:262:125 | getElement(...) : Entry [<element>] : String |
| Test.java:262:106:262:112 | element : String | Test.java:263:41:263:49 | element : String | Test.java:263:119:263:119 | h : HashMultiSet [<element>] : String | Test.java:262:83:262:113 | newMultiSetWithElement(...) : HashMultiSet [<element>] : String |
| Test.java:262:106:262:112 | element : String | Test.java:263:41:263:49 | element : String | Test.java:263:119:263:119 | h : HashMultiSet [<element>] : String | Test.java:262:83:262:113 | newMultiSetWithElement(...) : HashMultiSet [<element>] : String |
| Test.java:262:106:262:112 | element : String | Test.java:263:41:263:49 | element : String | Test.java:263:119:263:119 | h : HashMultiSet [<element>] : String | Test.java:262:83:262:113 | newMultiSetWithElement(...) : HashMultiSet [<element>] : String |
| Test.java:262:106:262:112 | element : String | Test.java:263:41:263:49 | element : String | Test.java:263:119:263:119 | h : HashMultiSet [<element>] : String | Test.java:262:83:262:113 | newMultiSetWithElement(...) : HashMultiSet [<element>] : String |
| Test.java:280:102:280:104 | key : String | Test.java:7057:22:7057:32 | key : String | Test.java:7057:3:7057:20 | parameter this [Return] : MyAbstractMapEntry [<map.key>] : String | Test.java:280:69:280:110 | new MyAbstractMapEntry<K,String>(...) : MyAbstractMapEntry [<map.key>] : String |
| Test.java:281:121:281:142 | newMAMEWithMapKey(...) : MyAbstractMapEntry [<map.key>] : String | Test.java:7067:31:7067:57 | entry : MyAbstractMapEntry [<map.key>] : String | Test.java:7067:3:7067:29 | parameter this [Return] : MyAbstractMapEntryDecorator [<map.key>] : String | Test.java:281:79:281:143 | new MyAbstractMapEntryDecorator<K,String>(...) : MyAbstractMapEntryDecorator [<map.key>] : String |
@@ -17843,11 +17782,9 @@ subpaths
| Test.java:444:52:444:67 | (...)... : String | Test.java:280:53:280:57 | key : String | Test.java:280:69:280:110 | new MyAbstractMapEntry<K,String>(...) : MyAbstractMapEntry [<map.key>] : String | Test.java:444:34:444:68 | newMAMEWithMapKey(...) : MyAbstractMapEntry [<map.key>] : String |
| Test.java:445:42:445:43 | in : MyAbstractMapEntry [<map.key>] : String | Test.java:7067:31:7067:57 | entry : MyAbstractMapEntry [<map.key>] : String | Test.java:7067:3:7067:29 | parameter this [Return] : MyAbstractMapEntryDecorator [<map.key>] : String | Test.java:445:10:445:44 | new MyAbstractMapEntryDecorator<>(...) : MyAbstractMapEntryDecorator [<map.key>] : String |
| Test.java:446:19:446:21 | out : MyAbstractMapEntryDecorator [<map.key>] : String | Test.java:239:18:239:57 | container : MyAbstractMapEntryDecorator [<map.key>] : String | Test.java:239:69:239:86 | getKey(...) : String | Test.java:446:9:446:22 | getMapKey(...) |
| Test.java:446:19:446:21 | out : MyAbstractMapEntryDecorator [<map.key>] : String | Test.java:239:18:239:57 | container : MyAbstractMapEntryDecorator [<map.key>] : String | Test.java:239:69:239:86 | getKey(...) : String | Test.java:446:9:446:22 | getMapKey(...) |
| Test.java:451:54:451:69 | (...)... : String | Test.java:300:55:300:61 | value : String | Test.java:300:73:300:116 | new MyAbstractMapEntry<String,V>(...) : MyAbstractMapEntry [<map.value>] : String | Test.java:451:34:451:70 | newMAMEWithMapValue(...) : MyAbstractMapEntry [<map.value>] : String |
| Test.java:452:42:452:43 | in : MyAbstractMapEntry [<map.value>] : String | Test.java:7067:31:7067:57 | entry : MyAbstractMapEntry [<map.value>] : String | Test.java:7067:3:7067:29 | parameter this [Return] : MyAbstractMapEntryDecorator [<map.value>] : String | Test.java:452:10:452:44 | new MyAbstractMapEntryDecorator<>(...) : MyAbstractMapEntryDecorator [<map.value>] : String |
| Test.java:453:21:453:23 | out : MyAbstractMapEntryDecorator [<map.value>] : String | Test.java:245:20:245:59 | container : MyAbstractMapEntryDecorator [<map.value>] : String | Test.java:245:71:245:90 | getValue(...) : String | Test.java:453:9:453:24 | getMapValue(...) |
| Test.java:453:21:453:23 | out : MyAbstractMapEntryDecorator [<map.value>] : String | Test.java:245:20:245:59 | container : MyAbstractMapEntryDecorator [<map.value>] : String | Test.java:245:71:245:90 | getValue(...) : String | Test.java:453:9:453:24 | getMapValue(...) |
| Test.java:458:56:458:71 | (...)... : String | Test.java:281:63:281:67 | key : String | Test.java:281:79:281:143 | new MyAbstractMapEntryDecorator<K,String>(...) : MyAbstractMapEntryDecorator [<map.key>] : String | Test.java:458:37:458:72 | newMAMEDWithMapKey(...) : MyAbstractMapEntryDecorator [<map.key>] : String |
| Test.java:459:10:459:11 | in : MyAbstractMapEntryDecorator [<map.key>] : String | Test.java:7071:19:7071:31 | parameter this : MyAbstractMapEntryDecorator [<map.key>] : String | Test.java:7072:11:7072:29 | getMapEntry(...) : Entry [<map.key>] : String | Test.java:459:10:459:27 | myGetMapEntry(...) : Entry [<map.key>] : String |
| Test.java:460:28:460:30 | out : Entry [<map.key>] : String | Test.java:238:27:238:50 | container : Entry [<map.key>] : String | Test.java:238:62:238:79 | getKey(...) : String | Test.java:460:9:460:31 | getMapKeyFromEntry(...) |
@@ -18041,45 +17978,31 @@ subpaths
| Test.java:1212:20:1212:22 | out : Bag [<element>] : Object | Test.java:230:19:230:32 | it : Bag [<element>] : Object | Test.java:230:44:230:63 | next(...) : Object | Test.java:1212:9:1212:23 | getElement(...) |
| Test.java:1219:20:1219:22 | out : Bag [<element>] : Object | Test.java:230:19:230:32 | it : Bag [<element>] : Object | Test.java:230:44:230:63 | next(...) : Object | Test.java:1219:9:1219:23 | getElement(...) |
| Test.java:1224:35:1224:50 | (...)... : String | Test.java:267:39:267:47 | element : String | Test.java:267:107:267:107 | b : TreeBag [<element>] : String | Test.java:1224:13:1224:51 | newTreeBagWithElement(...) : TreeBag [<element>] : String |
| Test.java:1224:35:1224:50 | (...)... : String | Test.java:267:39:267:47 | element : String | Test.java:267:107:267:107 | b : TreeBag [<element>] : String | Test.java:1224:13:1224:51 | newTreeBagWithElement(...) : TreeBag [<element>] : String |
| Test.java:1226:20:1226:22 | out : Set [<element>] : String | Test.java:230:19:230:32 | it : Set [<element>] : String | Test.java:230:44:230:63 | next(...) : String | Test.java:1226:9:1226:23 | getElement(...) |
| Test.java:1231:35:1231:50 | (...)... : String | Test.java:267:39:267:47 | element : String | Test.java:267:107:267:107 | b : TreeBag [<element>] : String | Test.java:1231:13:1231:51 | newTreeBagWithElement(...) : TreeBag [<element>] : String |
| Test.java:1231:35:1231:50 | (...)... : String | Test.java:267:39:267:47 | element : String | Test.java:267:107:267:107 | b : TreeBag [<element>] : String | Test.java:1231:13:1231:51 | newTreeBagWithElement(...) : TreeBag [<element>] : String |
| Test.java:1233:20:1233:22 | out : Bag [<element>] : String | Test.java:230:19:230:32 | it : Bag [<element>] : String | Test.java:230:44:230:63 | next(...) : String | Test.java:1233:9:1233:23 | getElement(...) |
| Test.java:1238:35:1238:50 | (...)... : String | Test.java:267:39:267:47 | element : String | Test.java:267:107:267:107 | b : TreeBag [<element>] : String | Test.java:1238:13:1238:51 | newTreeBagWithElement(...) : TreeBag [<element>] : String |
| Test.java:1238:35:1238:50 | (...)... : String | Test.java:267:39:267:47 | element : String | Test.java:267:107:267:107 | b : TreeBag [<element>] : String | Test.java:1238:13:1238:51 | newTreeBagWithElement(...) : TreeBag [<element>] : String |
| Test.java:1240:20:1240:22 | out : Bag [<element>] : String | Test.java:230:19:230:32 | it : Bag [<element>] : String | Test.java:230:44:230:63 | next(...) : String | Test.java:1240:9:1240:23 | getElement(...) |
| Test.java:1245:41:1245:56 | (...)... : String | Test.java:267:39:267:47 | element : String | Test.java:267:107:267:107 | b : TreeBag [<element>] : String | Test.java:1245:19:1245:57 | newTreeBagWithElement(...) : TreeBag [<element>] : String |
| Test.java:1245:41:1245:56 | (...)... : String | Test.java:267:39:267:47 | element : String | Test.java:267:107:267:107 | b : TreeBag [<element>] : String | Test.java:1245:19:1245:57 | newTreeBagWithElement(...) : TreeBag [<element>] : String |
| Test.java:1247:20:1247:22 | out : SortedBag [<element>] : String | Test.java:230:19:230:32 | it : SortedBag [<element>] : String | Test.java:230:44:230:63 | next(...) : String | Test.java:1247:9:1247:23 | getElement(...) |
| Test.java:1252:35:1252:50 | (...)... : String | Test.java:267:39:267:47 | element : String | Test.java:267:107:267:107 | b : TreeBag [<element>] : String | Test.java:1252:13:1252:51 | newTreeBagWithElement(...) : TreeBag [<element>] : String |
| Test.java:1252:35:1252:50 | (...)... : String | Test.java:267:39:267:47 | element : String | Test.java:267:107:267:107 | b : TreeBag [<element>] : String | Test.java:1252:13:1252:51 | newTreeBagWithElement(...) : TreeBag [<element>] : String |
| Test.java:1254:20:1254:22 | out : Bag [<element>] : String | Test.java:230:19:230:32 | it : Bag [<element>] : String | Test.java:230:44:230:63 | next(...) : String | Test.java:1254:9:1254:23 | getElement(...) |
| Test.java:1259:41:1259:56 | (...)... : String | Test.java:267:39:267:47 | element : String | Test.java:267:107:267:107 | b : TreeBag [<element>] : String | Test.java:1259:19:1259:57 | newTreeBagWithElement(...) : TreeBag [<element>] : String |
| Test.java:1259:41:1259:56 | (...)... : String | Test.java:267:39:267:47 | element : String | Test.java:267:107:267:107 | b : TreeBag [<element>] : String | Test.java:1259:19:1259:57 | newTreeBagWithElement(...) : TreeBag [<element>] : String |
| Test.java:1261:20:1261:22 | out : SortedBag [<element>] : String | Test.java:230:19:230:32 | it : SortedBag [<element>] : String | Test.java:230:44:230:63 | next(...) : String | Test.java:1261:9:1261:23 | getElement(...) |
| Test.java:1266:35:1266:50 | (...)... : String | Test.java:267:39:267:47 | element : String | Test.java:267:107:267:107 | b : TreeBag [<element>] : String | Test.java:1266:13:1266:51 | newTreeBagWithElement(...) : TreeBag [<element>] : String |
| Test.java:1266:35:1266:50 | (...)... : String | Test.java:267:39:267:47 | element : String | Test.java:267:107:267:107 | b : TreeBag [<element>] : String | Test.java:1266:13:1266:51 | newTreeBagWithElement(...) : TreeBag [<element>] : String |
| Test.java:1268:20:1268:22 | out : Bag [<element>] : String | Test.java:230:19:230:32 | it : Bag [<element>] : String | Test.java:230:44:230:63 | next(...) : String | Test.java:1268:9:1268:23 | getElement(...) |
| Test.java:1273:41:1273:56 | (...)... : String | Test.java:267:39:267:47 | element : String | Test.java:267:107:267:107 | b : TreeBag [<element>] : String | Test.java:1273:19:1273:57 | newTreeBagWithElement(...) : TreeBag [<element>] : String |
| Test.java:1273:41:1273:56 | (...)... : String | Test.java:267:39:267:47 | element : String | Test.java:267:107:267:107 | b : TreeBag [<element>] : String | Test.java:1273:19:1273:57 | newTreeBagWithElement(...) : TreeBag [<element>] : String |
| Test.java:1275:20:1275:22 | out : SortedBag [<element>] : String | Test.java:230:19:230:32 | it : SortedBag [<element>] : String | Test.java:230:44:230:63 | next(...) : String | Test.java:1275:9:1275:23 | getElement(...) |
| Test.java:1280:35:1280:50 | (...)... : String | Test.java:267:39:267:47 | element : String | Test.java:267:107:267:107 | b : TreeBag [<element>] : String | Test.java:1280:13:1280:51 | newTreeBagWithElement(...) : TreeBag [<element>] : String |
| Test.java:1280:35:1280:50 | (...)... : String | Test.java:267:39:267:47 | element : String | Test.java:267:107:267:107 | b : TreeBag [<element>] : String | Test.java:1280:13:1280:51 | newTreeBagWithElement(...) : TreeBag [<element>] : String |
| Test.java:1282:20:1282:22 | out : Bag [<element>] : String | Test.java:230:19:230:32 | it : Bag [<element>] : String | Test.java:230:44:230:63 | next(...) : String | Test.java:1282:9:1282:23 | getElement(...) |
| Test.java:1287:41:1287:56 | (...)... : String | Test.java:267:39:267:47 | element : String | Test.java:267:107:267:107 | b : TreeBag [<element>] : String | Test.java:1287:19:1287:57 | newTreeBagWithElement(...) : TreeBag [<element>] : String |
| Test.java:1287:41:1287:56 | (...)... : String | Test.java:267:39:267:47 | element : String | Test.java:267:107:267:107 | b : TreeBag [<element>] : String | Test.java:1287:19:1287:57 | newTreeBagWithElement(...) : TreeBag [<element>] : String |
| Test.java:1289:20:1289:22 | out : SortedBag [<element>] : String | Test.java:230:19:230:32 | it : SortedBag [<element>] : String | Test.java:230:44:230:63 | next(...) : String | Test.java:1289:9:1289:23 | getElement(...) |
| Test.java:1294:42:1294:57 | (...)... : String | Test.java:287:75:287:79 | key : String | Test.java:287:155:287:155 | m : TreeBidiMap [<map.key>] : String | Test.java:1294:17:1294:58 | newTreeBidiMapWithMapKey(...) : TreeBidiMap [<map.key>] : String |
| Test.java:1294:42:1294:57 | (...)... : String | Test.java:287:75:287:79 | key : String | Test.java:287:155:287:155 | m : TreeBidiMap [<map.key>] : String | Test.java:1294:17:1294:58 | newTreeBidiMapWithMapKey(...) : TreeBidiMap [<map.key>] : String |
| Test.java:1301:42:1301:57 | (...)... : String | Test.java:287:75:287:79 | key : String | Test.java:287:155:287:155 | m : TreeBidiMap [<map.key>] : String | Test.java:1301:17:1301:58 | newTreeBidiMapWithMapKey(...) : TreeBidiMap [<map.key>] : String |
| Test.java:1301:42:1301:57 | (...)... : String | Test.java:287:75:287:79 | key : String | Test.java:287:155:287:155 | m : TreeBidiMap [<map.key>] : String | Test.java:1301:17:1301:58 | newTreeBidiMapWithMapKey(...) : TreeBidiMap [<map.key>] : String |
| Test.java:1303:21:1303:23 | out : BidiMap [<map.value>] : String | Test.java:232:20:232:31 | map : BidiMap [<map.value>] : String | Test.java:232:43:232:55 | get(...) : String | Test.java:1303:9:1303:24 | getMapValue(...) |
| Test.java:1308:44:1308:59 | (...)... : String | Test.java:306:77:306:83 | value : String | Test.java:306:161:306:161 | m : TreeBidiMap [<map.value>] : String | Test.java:1308:17:1308:60 | newTreeBidiMapWithMapValue(...) : TreeBidiMap [<map.value>] : String |
| Test.java:1308:44:1308:59 | (...)... : String | Test.java:306:77:306:83 | value : String | Test.java:306:161:306:161 | m : TreeBidiMap [<map.value>] : String | Test.java:1308:17:1308:60 | newTreeBidiMapWithMapValue(...) : TreeBidiMap [<map.value>] : String |
| Test.java:1310:19:1310:21 | out : BidiMap [<map.key>] : String | Test.java:228:18:228:29 | map : BidiMap [<map.key>] : String | Test.java:228:41:228:70 | next(...) : String | Test.java:1310:9:1310:22 | getMapKey(...) |
| Test.java:1315:42:1315:57 | (...)... : String | Test.java:287:75:287:79 | key : String | Test.java:287:155:287:155 | m : TreeBidiMap [<map.key>] : String | Test.java:1315:17:1315:58 | newTreeBidiMapWithMapKey(...) : TreeBidiMap [<map.key>] : String |
| Test.java:1315:42:1315:57 | (...)... : String | Test.java:287:75:287:79 | key : String | Test.java:287:155:287:155 | m : TreeBidiMap [<map.key>] : String | Test.java:1315:17:1315:58 | newTreeBidiMapWithMapKey(...) : TreeBidiMap [<map.key>] : String |
| Test.java:1322:47:1322:62 | (...)... : String | Test.java:256:47:256:55 | element : String | Test.java:256:67:256:134 | new IteratorEnumeration<T>(...) : IteratorEnumeration [<element>] : String | Test.java:1322:21:1322:63 | newEnumerationWithElement(...) : IteratorEnumeration [<element>] : String |
| Test.java:1324:20:1324:22 | out : Collection [<element>] : String | Test.java:230:19:230:32 | it : Collection [<element>] : String | Test.java:230:44:230:63 | next(...) : String | Test.java:1324:9:1324:23 | getElement(...) |
| Test.java:1329:39:1329:54 | (...)... : String | Test.java:269:37:269:45 | element : String | Test.java:269:103:269:103 | v : Vector [<element>] : String | Test.java:1329:18:1329:55 | newVectorWithElement(...) : Vector [<element>] : String |
@@ -18230,87 +18153,58 @@ subpaths
| Test.java:1908:39:1908:54 | (...)... : String | Test.java:269:37:269:45 | element : String | Test.java:269:103:269:103 | v : Vector [<element>] : String | Test.java:1908:18:1908:55 | newVectorWithElement(...) : Vector [<element>] : String |
| Test.java:1911:20:1911:22 | out : FluentIterable [<element>] : String | Test.java:230:19:230:32 | it : FluentIterable [<element>] : String | Test.java:230:44:230:63 | next(...) : String | Test.java:1911:9:1911:23 | getElement(...) |
| Test.java:1916:40:1916:55 | (...)... : String | Test.java:279:47:279:51 | key : String | Test.java:279:131:279:131 | m : MultiValueMap [<map.key>] : String | Test.java:1916:23:1916:56 | newMVMWithMapKey(...) : MultiValueMap [<map.key>] : String |
| Test.java:1916:40:1916:55 | (...)... : String | Test.java:279:47:279:51 | key : String | Test.java:279:131:279:131 | m : MultiValueMap [<map.key>] : String | Test.java:1916:23:1916:56 | newMVMWithMapKey(...) : MultiValueMap [<map.key>] : String |
| Test.java:1916:40:1916:55 | (...)... : String | Test.java:279:47:279:51 | key : String | Test.java:279:131:279:131 | m : MultiValueMap [<map.key>] : String | Test.java:1916:23:1916:56 | newMVMWithMapKey(...) : MultiValueMap [<map.key>] : String |
| Test.java:1918:28:1918:42 | getElement(...) : Entry [<map.key>] : String | Test.java:238:27:238:50 | container : Entry [<map.key>] : String | Test.java:238:62:238:79 | getKey(...) : String | Test.java:1918:9:1918:43 | getMapKeyFromEntry(...) |
| Test.java:1918:39:1918:41 | out : Set [<element>, <map.key>] : String | Test.java:230:19:230:32 | it : Set [<element>, <map.key>] : String | Test.java:230:44:230:63 | next(...) : Object [<map.key>] : String | Test.java:1918:28:1918:42 | getElement(...) : Entry [<map.key>] : String |
| Test.java:1923:39:1923:54 | (...)... : String | Test.java:288:49:288:58 | key : String | Test.java:288:134:288:134 | m : PatriciaTrie [<map.key>] : String | Test.java:1923:13:1923:55 | newPatriciaTrieWithMapKey(...) : PatriciaTrie [<map.key>] : String |
| Test.java:1923:39:1923:54 | (...)... : String | Test.java:288:49:288:58 | key : String | Test.java:288:134:288:134 | m : PatriciaTrie [<map.key>] : String | Test.java:1923:13:1923:55 | newPatriciaTrieWithMapKey(...) : PatriciaTrie [<map.key>] : String |
| Test.java:1925:28:1925:42 | getElement(...) : Entry [<map.key>] : String | Test.java:238:27:238:50 | container : Entry [<map.key>] : String | Test.java:238:62:238:79 | getKey(...) : String | Test.java:1925:9:1925:43 | getMapKeyFromEntry(...) |
| Test.java:1925:39:1925:41 | out : Set [<element>, <map.key>] : String | Test.java:230:19:230:32 | it : Set [<element>, <map.key>] : String | Test.java:230:44:230:63 | next(...) : Object [<map.key>] : String | Test.java:1925:28:1925:42 | getElement(...) : Entry [<map.key>] : String |
| Test.java:1930:47:1930:62 | (...)... : String | Test.java:279:47:279:51 | key : String | Test.java:279:131:279:131 | m : MultiValueMap [<map.key>] : String | Test.java:1930:30:1930:63 | newMVMWithMapKey(...) : MultiValueMap [<map.key>] : String |
| Test.java:1930:47:1930:62 | (...)... : String | Test.java:279:47:279:51 | key : String | Test.java:279:131:279:131 | m : MultiValueMap [<map.key>] : String | Test.java:1930:30:1930:63 | newMVMWithMapKey(...) : MultiValueMap [<map.key>] : String |
| Test.java:1930:47:1930:62 | (...)... : String | Test.java:279:47:279:51 | key : String | Test.java:279:131:279:131 | m : MultiValueMap [<map.key>] : String | Test.java:1930:30:1930:63 | newMVMWithMapKey(...) : MultiValueMap [<map.key>] : String |
| Test.java:1932:28:1932:42 | getElement(...) : Entry [<map.key>] : String | Test.java:238:27:238:50 | container : Entry [<map.key>] : String | Test.java:238:62:238:79 | getKey(...) : String | Test.java:1932:9:1932:43 | getMapKeyFromEntry(...) |
| Test.java:1932:39:1932:41 | out : Set [<element>, <map.key>] : String | Test.java:230:19:230:32 | it : Set [<element>, <map.key>] : String | Test.java:230:44:230:63 | next(...) : Object [<map.key>] : String | Test.java:1932:28:1932:42 | getElement(...) : Entry [<map.key>] : String |
| Test.java:1937:42:1937:57 | (...)... : String | Test.java:298:49:298:55 | value : String | Test.java:298:137:298:137 | m : MultiValueMap [<map.value>] : String | Test.java:1937:23:1937:58 | newMVMWithMapValue(...) : MultiValueMap [<map.value>] : String |
| Test.java:1937:42:1937:57 | (...)... : String | Test.java:298:49:298:55 | value : String | Test.java:298:137:298:137 | m : MultiValueMap [<map.value>] : String | Test.java:1937:23:1937:58 | newMVMWithMapValue(...) : MultiValueMap [<map.value>] : String |
| Test.java:1939:30:1939:44 | getElement(...) : Entry [<map.value>] : String | Test.java:244:29:244:52 | container : Entry [<map.value>] : String | Test.java:244:64:244:83 | getValue(...) : String | Test.java:1939:9:1939:45 | getMapValueFromEntry(...) |
| Test.java:1939:41:1939:43 | out : Set [<element>, <map.value>] : String | Test.java:230:19:230:32 | it : Set [<element>, <map.value>] : String | Test.java:230:44:230:63 | next(...) : Object [<map.value>] : String | Test.java:1939:30:1939:44 | getElement(...) : Entry [<map.value>] : String |
| Test.java:1944:41:1944:56 | (...)... : String | Test.java:307:50:307:56 | value : String | Test.java:307:129:307:129 | m : PatriciaTrie [<map.value>] : String | Test.java:1944:13:1944:57 | newPatriciaTrieWithMapValue(...) : PatriciaTrie [<map.value>] : String |
| Test.java:1944:41:1944:56 | (...)... : String | Test.java:307:50:307:56 | value : String | Test.java:307:129:307:129 | m : PatriciaTrie [<map.value>] : String | Test.java:1944:13:1944:57 | newPatriciaTrieWithMapValue(...) : PatriciaTrie [<map.value>] : String |
| Test.java:1946:30:1946:44 | getElement(...) : Entry [<map.value>] : String | Test.java:244:29:244:52 | container : Entry [<map.value>] : String | Test.java:244:64:244:83 | getValue(...) : String | Test.java:1946:9:1946:45 | getMapValueFromEntry(...) |
| Test.java:1946:41:1946:43 | out : Set [<element>, <map.value>] : String | Test.java:230:19:230:32 | it : Set [<element>, <map.value>] : String | Test.java:230:44:230:63 | next(...) : Object [<map.value>] : String | Test.java:1946:30:1946:44 | getElement(...) : Entry [<map.value>] : String |
| Test.java:1951:49:1951:64 | (...)... : String | Test.java:298:49:298:55 | value : String | Test.java:298:137:298:137 | m : MultiValueMap [<map.value>] : String | Test.java:1951:30:1951:65 | newMVMWithMapValue(...) : MultiValueMap [<map.value>] : String |
| Test.java:1951:49:1951:64 | (...)... : String | Test.java:298:49:298:55 | value : String | Test.java:298:137:298:137 | m : MultiValueMap [<map.value>] : String | Test.java:1951:30:1951:65 | newMVMWithMapValue(...) : MultiValueMap [<map.value>] : String |
| Test.java:1953:30:1953:44 | getElement(...) : Entry [<map.value>] : String | Test.java:244:29:244:52 | container : Entry [<map.value>] : String | Test.java:244:64:244:83 | getValue(...) : String | Test.java:1953:9:1953:45 | getMapValueFromEntry(...) |
| Test.java:1953:41:1953:43 | out : Set [<element>, <map.value>] : String | Test.java:230:19:230:32 | it : Set [<element>, <map.value>] : String | Test.java:230:44:230:63 | next(...) : Object [<map.value>] : String | Test.java:1953:30:1953:44 | getElement(...) : Entry [<map.value>] : String |
| Test.java:1958:37:1958:52 | (...)... : String | Test.java:298:49:298:55 | value : String | Test.java:298:137:298:137 | m : MultiValueMap [<map.value>] : String | Test.java:1958:18:1958:53 | newMVMWithMapValue(...) : MultiValueMap [<map.value>] : String |
| Test.java:1958:37:1958:52 | (...)... : String | Test.java:298:49:298:55 | value : String | Test.java:298:137:298:137 | m : MultiValueMap [<map.value>] : String | Test.java:1958:18:1958:53 | newMVMWithMapValue(...) : MultiValueMap [<map.value>] : String |
| Test.java:1965:41:1965:56 | (...)... : String | Test.java:307:50:307:56 | value : String | Test.java:307:129:307:129 | m : PatriciaTrie [<map.value>] : String | Test.java:1965:13:1965:57 | newPatriciaTrieWithMapValue(...) : PatriciaTrie [<map.value>] : String |
| Test.java:1965:41:1965:56 | (...)... : String | Test.java:307:50:307:56 | value : String | Test.java:307:129:307:129 | m : PatriciaTrie [<map.value>] : String | Test.java:1965:13:1965:57 | newPatriciaTrieWithMapValue(...) : PatriciaTrie [<map.value>] : String |
| Test.java:1972:49:1972:64 | (...)... : String | Test.java:298:49:298:55 | value : String | Test.java:298:137:298:137 | m : MultiValueMap [<map.value>] : String | Test.java:1972:30:1972:65 | newMVMWithMapValue(...) : MultiValueMap [<map.value>] : String |
| Test.java:1972:49:1972:64 | (...)... : String | Test.java:298:49:298:55 | value : String | Test.java:298:137:298:137 | m : MultiValueMap [<map.value>] : String | Test.java:1972:30:1972:65 | newMVMWithMapValue(...) : MultiValueMap [<map.value>] : String |
| Test.java:1979:39:1979:54 | (...)... : String | Test.java:288:49:288:58 | key : String | Test.java:288:134:288:134 | m : PatriciaTrie [<map.key>] : String | Test.java:1979:13:1979:55 | newPatriciaTrieWithMapKey(...) : PatriciaTrie [<map.key>] : String |
| Test.java:1979:39:1979:54 | (...)... : String | Test.java:288:49:288:58 | key : String | Test.java:288:134:288:134 | m : PatriciaTrie [<map.key>] : String | Test.java:1979:13:1979:55 | newPatriciaTrieWithMapKey(...) : PatriciaTrie [<map.key>] : String |
| Test.java:1981:20:1981:22 | out : Set [<element>] : String | Test.java:230:19:230:32 | it : Set [<element>] : String | Test.java:230:44:230:63 | next(...) : String | Test.java:1981:9:1981:23 | getElement(...) |
| Test.java:1986:47:1986:62 | (...)... : String | Test.java:279:47:279:51 | key : String | Test.java:279:131:279:131 | m : MultiValueMap [<map.key>] : String | Test.java:1986:30:1986:63 | newMVMWithMapKey(...) : MultiValueMap [<map.key>] : String |
| Test.java:1986:47:1986:62 | (...)... : String | Test.java:279:47:279:51 | key : String | Test.java:279:131:279:131 | m : MultiValueMap [<map.key>] : String | Test.java:1986:30:1986:63 | newMVMWithMapKey(...) : MultiValueMap [<map.key>] : String |
| Test.java:1986:47:1986:62 | (...)... : String | Test.java:279:47:279:51 | key : String | Test.java:279:131:279:131 | m : MultiValueMap [<map.key>] : String | Test.java:1986:30:1986:63 | newMVMWithMapKey(...) : MultiValueMap [<map.key>] : String |
| Test.java:1988:20:1988:22 | out : Set [<element>] : String | Test.java:230:19:230:32 | it : Set [<element>] : String | Test.java:230:44:230:63 | next(...) : String | Test.java:1988:9:1988:23 | getElement(...) |
| Test.java:1993:37:1993:52 | (...)... : String | Test.java:298:49:298:55 | value : String | Test.java:298:137:298:137 | m : MultiValueMap [<map.value>] : String | Test.java:1993:18:1993:53 | newMVMWithMapValue(...) : MultiValueMap [<map.value>] : String |
| Test.java:1993:37:1993:52 | (...)... : String | Test.java:298:49:298:55 | value : String | Test.java:298:137:298:137 | m : MultiValueMap [<map.value>] : String | Test.java:1993:18:1993:53 | newMVMWithMapValue(...) : MultiValueMap [<map.value>] : String |
| Test.java:2000:41:2000:56 | (...)... : String | Test.java:307:50:307:56 | value : String | Test.java:307:129:307:129 | m : PatriciaTrie [<map.value>] : String | Test.java:2000:13:2000:57 | newPatriciaTrieWithMapValue(...) : PatriciaTrie [<map.value>] : String |
| Test.java:2000:41:2000:56 | (...)... : String | Test.java:307:50:307:56 | value : String | Test.java:307:129:307:129 | m : PatriciaTrie [<map.value>] : String | Test.java:2000:13:2000:57 | newPatriciaTrieWithMapValue(...) : PatriciaTrie [<map.value>] : String |
| Test.java:2007:49:2007:64 | (...)... : String | Test.java:298:49:298:55 | value : String | Test.java:298:137:298:137 | m : MultiValueMap [<map.value>] : String | Test.java:2007:30:2007:65 | newMVMWithMapValue(...) : MultiValueMap [<map.value>] : String |
| Test.java:2007:49:2007:64 | (...)... : String | Test.java:298:49:298:55 | value : String | Test.java:298:137:298:137 | m : MultiValueMap [<map.value>] : String | Test.java:2007:30:2007:65 | newMVMWithMapValue(...) : MultiValueMap [<map.value>] : String |
| Test.java:2014:44:2014:59 | (...)... : String | Test.java:306:77:306:83 | value : String | Test.java:306:161:306:161 | m : TreeBidiMap [<map.value>] : String | Test.java:2014:17:2014:60 | newTreeBidiMapWithMapValue(...) : TreeBidiMap [<map.value>] : String |
| Test.java:2014:44:2014:59 | (...)... : String | Test.java:306:77:306:83 | value : String | Test.java:306:161:306:161 | m : TreeBidiMap [<map.value>] : String | Test.java:2014:17:2014:60 | newTreeBidiMapWithMapValue(...) : TreeBidiMap [<map.value>] : String |
| Test.java:2016:20:2016:22 | out : Set [<element>] : String | Test.java:230:19:230:32 | it : Set [<element>] : String | Test.java:230:44:230:63 | next(...) : String | Test.java:2016:9:2016:23 | getElement(...) |
| Test.java:2021:42:2021:57 | (...)... : String | Test.java:298:49:298:55 | value : String | Test.java:298:137:298:137 | m : MultiValueMap [<map.value>, <element>] : String | Test.java:2021:23:2021:58 | newMVMWithMapValue(...) : MultiValueMap [<map.value>, <element>] : String |
| Test.java:2021:42:2021:57 | (...)... : String | Test.java:298:49:298:55 | value : String | Test.java:298:137:298:137 | m : MultiValueMap [<map.value>] : String | Test.java:2021:23:2021:58 | newMVMWithMapValue(...) : MultiValueMap [<map.value>] : String |
| Test.java:2021:42:2021:57 | (...)... : String | Test.java:298:49:298:55 | value : String | Test.java:298:137:298:137 | m : MultiValueMap [<map.value>] : String | Test.java:2021:23:2021:58 | newMVMWithMapValue(...) : MultiValueMap [<map.value>] : String |
| Test.java:2023:20:2023:22 | out : Collection [<element>] : Object | Test.java:230:19:230:32 | it : Collection [<element>] : Object | Test.java:230:44:230:63 | next(...) : Object | Test.java:2023:9:2023:23 | getElement(...) |
| Test.java:2023:20:2023:22 | out : Collection [<element>] : String | Test.java:230:19:230:32 | it : Collection [<element>] : String | Test.java:230:44:230:63 | next(...) : String | Test.java:2023:9:2023:23 | getElement(...) |
| Test.java:2028:37:2028:52 | (...)... : String | Test.java:298:49:298:55 | value : String | Test.java:298:137:298:137 | m : MultiValueMap [<map.value>, <element>] : String | Test.java:2028:18:2028:53 | newMVMWithMapValue(...) : MultiValueMap [<map.value>, <element>] : String |
| Test.java:2028:37:2028:52 | (...)... : String | Test.java:298:49:298:55 | value : String | Test.java:298:137:298:137 | m : MultiValueMap [<map.value>] : String | Test.java:2028:18:2028:53 | newMVMWithMapValue(...) : MultiValueMap [<map.value>] : String |
| Test.java:2028:37:2028:52 | (...)... : String | Test.java:298:49:298:55 | value : String | Test.java:298:137:298:137 | m : MultiValueMap [<map.value>] : String | Test.java:2028:18:2028:53 | newMVMWithMapValue(...) : MultiValueMap [<map.value>] : String |
| Test.java:2030:20:2030:22 | out : Collection [<element>] : Object | Test.java:230:19:230:32 | it : Collection [<element>] : Object | Test.java:230:44:230:63 | next(...) : Object | Test.java:2030:9:2030:23 | getElement(...) |
| Test.java:2030:20:2030:22 | out : Collection [<element>] : String | Test.java:230:19:230:32 | it : Collection [<element>] : String | Test.java:230:44:230:63 | next(...) : String | Test.java:2030:9:2030:23 | getElement(...) |
| Test.java:2035:41:2035:56 | (...)... : String | Test.java:307:50:307:56 | value : String | Test.java:307:129:307:129 | m : PatriciaTrie [<map.value>] : String | Test.java:2035:13:2035:57 | newPatriciaTrieWithMapValue(...) : PatriciaTrie [<map.value>] : String |
| Test.java:2035:41:2035:56 | (...)... : String | Test.java:307:50:307:56 | value : String | Test.java:307:129:307:129 | m : PatriciaTrie [<map.value>] : String | Test.java:2035:13:2035:57 | newPatriciaTrieWithMapValue(...) : PatriciaTrie [<map.value>] : String |
| Test.java:2037:20:2037:22 | out : Collection [<element>] : String | Test.java:230:19:230:32 | it : Collection [<element>] : String | Test.java:230:44:230:63 | next(...) : String | Test.java:2037:9:2037:23 | getElement(...) |
| Test.java:2042:49:2042:64 | (...)... : String | Test.java:298:49:298:55 | value : String | Test.java:298:137:298:137 | m : MultiValueMap [<map.value>] : String | Test.java:2042:30:2042:65 | newMVMWithMapValue(...) : MultiValueMap [<map.value>] : String |
| Test.java:2042:49:2042:64 | (...)... : String | Test.java:298:49:298:55 | value : String | Test.java:298:137:298:137 | m : MultiValueMap [<map.value>] : String | Test.java:2042:30:2042:65 | newMVMWithMapValue(...) : MultiValueMap [<map.value>] : String |
| Test.java:2044:20:2044:22 | out : Collection [<element>] : String | Test.java:230:19:230:32 | it : Collection [<element>] : String | Test.java:230:44:230:63 | next(...) : String | Test.java:2044:9:2044:23 | getElement(...) |
| Test.java:2049:45:2049:60 | (...)... : String | Test.java:287:75:287:79 | key : String | Test.java:287:155:287:155 | m : TreeBidiMap [<map.key>] : String | Test.java:2049:20:2049:61 | newTreeBidiMapWithMapKey(...) : TreeBidiMap [<map.key>] : String |
| Test.java:2049:45:2049:60 | (...)... : String | Test.java:287:75:287:79 | key : String | Test.java:287:155:287:155 | m : TreeBidiMap [<map.key>] : String | Test.java:2049:20:2049:61 | newTreeBidiMapWithMapKey(...) : TreeBidiMap [<map.key>] : String |
| Test.java:2051:20:2051:22 | out : OrderedMapIterator [<element>] : String | Test.java:231:19:231:32 | it : OrderedMapIterator [<element>] : String | Test.java:231:44:231:52 | next(...) : String | Test.java:2051:9:2051:23 | getElement(...) |
| Test.java:2056:44:2056:59 | (...)... : String | Test.java:275:49:275:53 | key : String | Test.java:275:125:275:125 | m : HashedMap [<map.key>] : String | Test.java:2056:21:2056:60 | newHashedMapWithMapKey(...) : HashedMap [<map.key>] : String |
| Test.java:2056:44:2056:59 | (...)... : String | Test.java:275:49:275:53 | key : String | Test.java:275:125:275:125 | m : HashedMap [<map.key>] : String | Test.java:2056:21:2056:60 | newHashedMapWithMapKey(...) : HashedMap [<map.key>] : String |
| Test.java:2058:20:2058:22 | out : MapIterator [<element>] : String | Test.java:231:19:231:32 | it : MapIterator [<element>] : String | Test.java:231:44:231:52 | next(...) : String | Test.java:2058:9:2058:23 | getElement(...) |
| Test.java:2063:46:2063:61 | (...)... : String | Test.java:279:47:279:51 | key : String | Test.java:279:131:279:131 | m : MultiValueMap [<map.key>] : String | Test.java:2063:29:2063:62 | newMVMWithMapKey(...) : MultiValueMap [<map.key>] : String |
| Test.java:2063:46:2063:61 | (...)... : String | Test.java:279:47:279:51 | key : String | Test.java:279:131:279:131 | m : MultiValueMap [<map.key>] : String | Test.java:2063:29:2063:62 | newMVMWithMapKey(...) : MultiValueMap [<map.key>] : String |
| Test.java:2063:46:2063:61 | (...)... : String | Test.java:279:47:279:51 | key : String | Test.java:279:131:279:131 | m : MultiValueMap [<map.key>] : String | Test.java:2063:29:2063:62 | newMVMWithMapKey(...) : MultiValueMap [<map.key>] : String |
| Test.java:2065:20:2065:22 | out : MapIterator [<element>] : String | Test.java:231:19:231:32 | it : MapIterator [<element>] : String | Test.java:231:44:231:52 | next(...) : String | Test.java:2065:9:2065:23 | getElement(...) |
| Test.java:2070:47:2070:62 | (...)... : String | Test.java:306:77:306:83 | value : String | Test.java:306:161:306:161 | m : TreeBidiMap [<map.value>] : String | Test.java:2070:20:2070:63 | newTreeBidiMapWithMapValue(...) : TreeBidiMap [<map.value>] : String |
| Test.java:2070:47:2070:62 | (...)... : String | Test.java:306:77:306:83 | value : String | Test.java:306:161:306:161 | m : TreeBidiMap [<map.value>] : String | Test.java:2070:20:2070:63 | newTreeBidiMapWithMapValue(...) : TreeBidiMap [<map.value>] : String |
| Test.java:2072:21:2072:23 | out : OrderedMapIterator [<map.value>] : String | Test.java:246:20:246:47 | mapIterator : OrderedMapIterator [<map.value>] : String | Test.java:246:59:246:80 | getValue(...) : String | Test.java:2072:9:2072:24 | getMapValue(...) |
| Test.java:2077:46:2077:61 | (...)... : String | Test.java:293:51:293:57 | value : String | Test.java:293:131:293:131 | m : HashedMap [<map.value>] : String | Test.java:2077:21:2077:62 | newHashedMapWithMapValue(...) : HashedMap [<map.value>] : String |
| Test.java:2077:46:2077:61 | (...)... : String | Test.java:293:51:293:57 | value : String | Test.java:293:131:293:131 | m : HashedMap [<map.value>] : String | Test.java:2077:21:2077:62 | newHashedMapWithMapValue(...) : HashedMap [<map.value>] : String |
| Test.java:2079:21:2079:23 | out : MapIterator [<map.value>] : String | Test.java:246:20:246:47 | mapIterator : MapIterator [<map.value>] : String | Test.java:246:59:246:80 | getValue(...) : String | Test.java:2079:9:2079:24 | getMapValue(...) |
| Test.java:2084:48:2084:63 | (...)... : String | Test.java:298:49:298:55 | value : String | Test.java:298:137:298:137 | m : MultiValueMap [<map.value>] : String | Test.java:2084:29:2084:64 | newMVMWithMapValue(...) : MultiValueMap [<map.value>] : String |
| Test.java:2084:48:2084:63 | (...)... : String | Test.java:298:49:298:55 | value : String | Test.java:298:137:298:137 | m : MultiValueMap [<map.value>] : String | Test.java:2084:29:2084:64 | newMVMWithMapValue(...) : MultiValueMap [<map.value>] : String |
| Test.java:2086:21:2086:23 | out : MapIterator [<map.value>] : String | Test.java:246:20:246:47 | mapIterator : MapIterator [<map.value>] : String | Test.java:246:59:246:80 | getValue(...) : String | Test.java:2086:9:2086:24 | getMapValue(...) |
| Test.java:2091:39:2091:54 | (...)... : String | Test.java:269:37:269:45 | element : String | Test.java:269:103:269:103 | v : Vector [<element>] : String | Test.java:2091:18:2091:55 | newVectorWithElement(...) : Vector [<element>] : String |
| Test.java:2093:20:2093:22 | out : Iterable [<element>] : String | Test.java:230:19:230:32 | it : Iterable [<element>] : String | Test.java:230:44:230:63 | next(...) : String | Test.java:2093:9:2093:23 | getElement(...) |
@@ -18473,10 +18367,8 @@ subpaths
| Test.java:2721:49:2721:64 | (...)... : String | Test.java:259:49:259:57 | element : String | Test.java:259:69:259:112 | listIterator(...) : ListIterator [<element>] : String | Test.java:2721:22:2721:65 | newListIteratorWithElement(...) : ListIterator [<element>] : String |
| Test.java:2723:20:2723:22 | out : ListIterator [<element>] : String | Test.java:231:19:231:32 | it : ListIterator [<element>] : String | Test.java:231:44:231:52 | next(...) : String | Test.java:2723:9:2723:23 | getElement(...) |
| Test.java:2728:39:2728:54 | (...)... : String | Test.java:283:53:283:57 | key : String | Test.java:283:129:283:143 | mapIterator(...) : OrderedMapIterator [<element>] : String | Test.java:2728:21:2728:55 | newOMIWithElement(...) : OrderedMapIterator [<element>] : String |
| Test.java:2728:39:2728:54 | (...)... : String | Test.java:283:53:283:57 | key : String | Test.java:283:129:283:143 | mapIterator(...) : OrderedMapIterator [<element>] : String | Test.java:2728:21:2728:55 | newOMIWithElement(...) : OrderedMapIterator [<element>] : String |
| Test.java:2730:20:2730:22 | out : MapIterator [<element>] : String | Test.java:231:19:231:32 | it : MapIterator [<element>] : String | Test.java:231:44:231:52 | next(...) : String | Test.java:2730:9:2730:23 | getElement(...) |
| Test.java:2735:40:2735:55 | (...)... : String | Test.java:302:54:302:60 | value : String | Test.java:302:134:302:148 | mapIterator(...) : OrderedMapIterator [<map.value>] : String | Test.java:2735:21:2735:56 | newOMIWithMapValue(...) : OrderedMapIterator [<map.value>] : String |
| Test.java:2735:40:2735:55 | (...)... : String | Test.java:302:54:302:60 | value : String | Test.java:302:134:302:148 | mapIterator(...) : OrderedMapIterator [<map.value>] : String | Test.java:2735:21:2735:56 | newOMIWithMapValue(...) : OrderedMapIterator [<map.value>] : String |
| Test.java:2737:21:2737:23 | out : MapIterator [<map.value>] : String | Test.java:246:20:246:47 | mapIterator : MapIterator [<map.value>] : String | Test.java:246:59:246:80 | getValue(...) : String | Test.java:2737:9:2737:24 | getMapValue(...) |
| Test.java:2742:45:2742:60 | (...)... : String | Test.java:259:49:259:57 | element : String | Test.java:259:69:259:112 | listIterator(...) : ListIterator [<element>] : String | Test.java:2742:18:2742:61 | newListIteratorWithElement(...) : ListIterator [<element>] : String |
| Test.java:2744:20:2744:22 | out : ZippingIterator [<element>] : String | Test.java:231:19:231:32 | it : ZippingIterator [<element>] : String | Test.java:231:44:231:52 | next(...) : String | Test.java:2744:9:2744:23 | getElement(...) |
@@ -18538,15 +18430,11 @@ subpaths
| Test.java:2973:35:2973:50 | (...)... : String | Test.java:269:37:269:45 | element : String | Test.java:269:103:269:103 | v : Vector [<element>] : String | Test.java:2973:14:2973:51 | newVectorWithElement(...) : Vector [<element>] : String |
| Test.java:2975:20:2975:22 | out : List [<element>] : String | Test.java:230:19:230:32 | it : List [<element>] : String | Test.java:230:44:230:63 | next(...) : String | Test.java:2975:9:2975:23 | getElement(...) |
| Test.java:2980:39:2980:54 | (...)... : String | Test.java:283:53:283:57 | key : String | Test.java:283:129:283:143 | mapIterator(...) : OrderedMapIterator [<element>] : String | Test.java:2980:21:2980:55 | newOMIWithElement(...) : OrderedMapIterator [<element>] : String |
| Test.java:2980:39:2980:54 | (...)... : String | Test.java:283:53:283:57 | key : String | Test.java:283:129:283:143 | mapIterator(...) : OrderedMapIterator [<element>] : String | Test.java:2980:21:2980:55 | newOMIWithElement(...) : OrderedMapIterator [<element>] : String |
| Test.java:2987:40:2987:55 | (...)... : String | Test.java:302:54:302:60 | value : String | Test.java:302:134:302:148 | mapIterator(...) : OrderedMapIterator [<map.value>] : String | Test.java:2987:21:2987:56 | newOMIWithMapValue(...) : OrderedMapIterator [<map.value>] : String |
| Test.java:2987:40:2987:55 | (...)... : String | Test.java:302:54:302:60 | value : String | Test.java:302:134:302:148 | mapIterator(...) : OrderedMapIterator [<map.value>] : String | Test.java:2987:21:2987:56 | newOMIWithMapValue(...) : OrderedMapIterator [<map.value>] : String |
| Test.java:2996:21:2996:23 | out : MapIterator [<map.value>] : Object | Test.java:246:20:246:47 | mapIterator : MapIterator [<map.value>] : Object | Test.java:246:59:246:80 | getValue(...) : Object | Test.java:2996:9:2996:24 | getMapValue(...) |
| Test.java:3001:40:3001:55 | (...)... : String | Test.java:302:54:302:60 | value : String | Test.java:302:134:302:148 | mapIterator(...) : OrderedMapIterator [<map.value>] : String | Test.java:3001:21:3001:56 | newOMIWithMapValue(...) : OrderedMapIterator [<map.value>] : String |
| Test.java:3001:40:3001:55 | (...)... : String | Test.java:302:54:302:60 | value : String | Test.java:302:134:302:148 | mapIterator(...) : OrderedMapIterator [<map.value>] : String | Test.java:3001:21:3001:56 | newOMIWithMapValue(...) : OrderedMapIterator [<map.value>] : String |
| Test.java:3008:37:3008:52 | (...)... : String | Test.java:298:49:298:55 | value : String | Test.java:298:137:298:137 | m : MultiValueMap [<map.value>, <element>] : String | Test.java:3008:18:3008:53 | newMVMWithMapValue(...) : MultiValueMap [<map.value>, <element>] : String |
| Test.java:3008:37:3008:52 | (...)... : String | Test.java:298:49:298:55 | value : String | Test.java:298:137:298:137 | m : MultiValueMap [<map.value>] : String | Test.java:3008:18:3008:53 | newMVMWithMapValue(...) : MultiValueMap [<map.value>] : String |
| Test.java:3008:37:3008:52 | (...)... : String | Test.java:298:49:298:55 | value : String | Test.java:298:137:298:137 | m : MultiValueMap [<map.value>] : String | Test.java:3008:18:3008:53 | newMVMWithMapValue(...) : MultiValueMap [<map.value>] : String |
| Test.java:3010:20:3010:22 | out : Collection [<element>] : Object | Test.java:230:19:230:32 | it : Collection [<element>] : Object | Test.java:230:44:230:63 | next(...) : Object | Test.java:3010:9:3010:23 | getElement(...) |
| Test.java:3010:20:3010:22 | out : Collection [<element>] : String | Test.java:230:19:230:32 | it : Collection [<element>] : String | Test.java:230:44:230:63 | next(...) : String | Test.java:3010:9:3010:23 | getElement(...) |
| Test.java:3017:19:3017:21 | out : MultiValueMap [<map.key>] : Object | Test.java:228:18:228:29 | map : MultiValueMap [<map.key>] : Object | Test.java:228:41:228:70 | next(...) : Object | Test.java:3017:9:3017:22 | getMapKey(...) |
@@ -18561,12 +18449,10 @@ subpaths
| Test.java:3038:44:3038:46 | out : MultiMap [<map.value>] : Object | Test.java:232:20:232:31 | map : MultiMap [<map.value>] : Object | Test.java:232:43:232:55 | get(...) : Object | Test.java:3038:32:3038:47 | getMapValue(...) : Object |
| Test.java:3043:42:3043:57 | (...)... : String | Test.java:298:49:298:55 | value : String | Test.java:298:137:298:137 | m : MultiValueMap [<map.value>, <element>] : String | Test.java:3043:23:3043:58 | newMVMWithMapValue(...) : MultiValueMap [<map.value>, <element>] : String |
| Test.java:3043:42:3043:57 | (...)... : String | Test.java:298:49:298:55 | value : String | Test.java:298:137:298:137 | m : MultiValueMap [<map.value>] : String | Test.java:3043:23:3043:58 | newMVMWithMapValue(...) : MultiValueMap [<map.value>] : String |
| Test.java:3043:42:3043:57 | (...)... : String | Test.java:298:49:298:55 | value : String | Test.java:298:137:298:137 | m : MultiValueMap [<map.value>] : String | Test.java:3043:23:3043:58 | newMVMWithMapValue(...) : MultiValueMap [<map.value>] : String |
| Test.java:3045:20:3045:22 | out : Collection [<element>] : Object | Test.java:230:19:230:32 | it : Collection [<element>] : Object | Test.java:230:44:230:63 | next(...) : Object | Test.java:3045:9:3045:23 | getElement(...) |
| Test.java:3045:20:3045:22 | out : Collection [<element>] : String | Test.java:230:19:230:32 | it : Collection [<element>] : String | Test.java:230:44:230:63 | next(...) : String | Test.java:3045:9:3045:23 | getElement(...) |
| Test.java:3050:37:3050:52 | (...)... : String | Test.java:298:49:298:55 | value : String | Test.java:298:137:298:137 | m : MultiValueMap [<map.value>, <element>] : String | Test.java:3050:18:3050:53 | newMVMWithMapValue(...) : MultiValueMap [<map.value>, <element>] : String |
| Test.java:3050:37:3050:52 | (...)... : String | Test.java:298:49:298:55 | value : String | Test.java:298:137:298:137 | m : MultiValueMap [<map.value>] : String | Test.java:3050:18:3050:53 | newMVMWithMapValue(...) : MultiValueMap [<map.value>] : String |
| Test.java:3050:37:3050:52 | (...)... : String | Test.java:298:49:298:55 | value : String | Test.java:298:137:298:137 | m : MultiValueMap [<map.value>] : String | Test.java:3050:18:3050:53 | newMVMWithMapValue(...) : MultiValueMap [<map.value>] : String |
| Test.java:3052:20:3052:22 | out : Collection [<element>] : Object | Test.java:230:19:230:32 | it : Collection [<element>] : Object | Test.java:230:44:230:63 | next(...) : Object | Test.java:3052:9:3052:23 | getElement(...) |
| Test.java:3052:20:3052:22 | out : Collection [<element>] : String | Test.java:230:19:230:32 | it : Collection [<element>] : String | Test.java:230:44:230:63 | next(...) : String | Test.java:3052:9:3052:23 | getElement(...) |
| Test.java:3064:43:3064:58 | (...)... : String | Test.java:272:58:272:62 | key : String | Test.java:272:160:272:160 | m : ArrayListValuedHashMap [<map.key>] : String | Test.java:3064:24:3064:59 | newALVHMWithMapKey(...) : ArrayListValuedHashMap [<map.key>] : String |
@@ -18594,24 +18480,18 @@ subpaths
| Test.java:3129:20:3129:35 | getMapValue(...) : Collection [<element>] : String | Test.java:230:19:230:32 | it : Collection [<element>] : String | Test.java:230:44:230:63 | next(...) : String | Test.java:3129:9:3129:36 | getElement(...) |
| Test.java:3129:32:3129:34 | out : MultiValuedMap [<map.value>, <element>] : String | Test.java:247:32:247:60 | container : MultiValuedMap [<map.value>, <element>] : String | Test.java:247:72:247:90 | get(...) : Collection [<element>] : String | Test.java:3129:20:3129:35 | getMapValue(...) : Collection [<element>] : String |
| Test.java:3134:52:3134:67 | (...)... : String | Test.java:262:52:262:60 | element : String | Test.java:262:72:262:125 | getElement(...) : Entry [<element>] : String | Test.java:3134:24:3134:68 | newMultiSetEntryWithElement(...) : Entry [<element>] : String |
| Test.java:3134:52:3134:67 | (...)... : String | Test.java:262:52:262:60 | element : String | Test.java:262:72:262:125 | getElement(...) : Entry [<element>] : String | Test.java:3134:24:3134:68 | newMultiSetEntryWithElement(...) : Entry [<element>] : String |
| Test.java:3143:20:3143:22 | out : MultiSet [<element>] : Object | Test.java:230:19:230:32 | it : MultiSet [<element>] : Object | Test.java:230:44:230:63 | next(...) : Object | Test.java:3143:9:3143:23 | getElement(...) |
| Test.java:3150:20:3150:22 | out : MultiSet [<element>] : Object | Test.java:230:19:230:32 | it : MultiSet [<element>] : Object | Test.java:230:44:230:63 | next(...) : Object | Test.java:3150:9:3150:23 | getElement(...) |
| Test.java:3155:41:3155:56 | (...)... : String | Test.java:263:41:263:49 | element : String | Test.java:263:119:263:119 | h : HashMultiSet [<element>] : String | Test.java:3155:18:3155:57 | newMultiSetWithElement(...) : HashMultiSet [<element>] : String |
| Test.java:3155:41:3155:56 | (...)... : String | Test.java:263:41:263:49 | element : String | Test.java:263:119:263:119 | h : HashMultiSet [<element>] : String | Test.java:3155:18:3155:57 | newMultiSetWithElement(...) : HashMultiSet [<element>] : String |
| Test.java:3157:20:3157:34 | getElement(...) : Entry [<element>] : String | Test.java:235:19:235:45 | container : Entry [<element>] : String | Test.java:235:57:235:78 | getElement(...) : String | Test.java:3157:9:3157:35 | getElement(...) |
| Test.java:3157:31:3157:33 | out : Set [<element>, <element>] : String | Test.java:230:19:230:32 | it : Set [<element>, <element>] : String | Test.java:230:44:230:63 | next(...) : Object [<element>] : String | Test.java:3157:20:3157:34 | getElement(...) : Entry [<element>] : String |
| Test.java:3162:41:3162:56 | (...)... : String | Test.java:263:41:263:49 | element : String | Test.java:263:119:263:119 | h : HashMultiSet [<element>] : String | Test.java:3162:18:3162:57 | newMultiSetWithElement(...) : HashMultiSet [<element>] : String |
| Test.java:3162:41:3162:56 | (...)... : String | Test.java:263:41:263:49 | element : String | Test.java:263:119:263:119 | h : HashMultiSet [<element>] : String | Test.java:3162:18:3162:57 | newMultiSetWithElement(...) : HashMultiSet [<element>] : String |
| Test.java:3164:20:3164:22 | out : Set [<element>] : String | Test.java:230:19:230:32 | it : Set [<element>] : String | Test.java:230:44:230:63 | next(...) : String | Test.java:3164:9:3164:23 | getElement(...) |
| Test.java:3169:41:3169:56 | (...)... : String | Test.java:263:41:263:49 | element : String | Test.java:263:119:263:119 | h : HashMultiSet [<element>] : String | Test.java:3169:18:3169:57 | newMultiSetWithElement(...) : HashMultiSet [<element>] : String |
| Test.java:3169:41:3169:56 | (...)... : String | Test.java:263:41:263:49 | element : String | Test.java:263:119:263:119 | h : HashMultiSet [<element>] : String | Test.java:3169:18:3169:57 | newMultiSetWithElement(...) : HashMultiSet [<element>] : String |
| Test.java:3171:20:3171:22 | out : MultiSet [<element>] : String | Test.java:230:19:230:32 | it : MultiSet [<element>] : String | Test.java:230:44:230:63 | next(...) : String | Test.java:3171:9:3171:23 | getElement(...) |
| Test.java:3176:41:3176:56 | (...)... : String | Test.java:263:41:263:49 | element : String | Test.java:263:119:263:119 | h : HashMultiSet [<element>] : String | Test.java:3176:18:3176:57 | newMultiSetWithElement(...) : HashMultiSet [<element>] : String |
| Test.java:3176:41:3176:56 | (...)... : String | Test.java:263:41:263:49 | element : String | Test.java:263:119:263:119 | h : HashMultiSet [<element>] : String | Test.java:3176:18:3176:57 | newMultiSetWithElement(...) : HashMultiSet [<element>] : String |
| Test.java:3178:20:3178:22 | out : MultiSet [<element>] : String | Test.java:230:19:230:32 | it : MultiSet [<element>] : String | Test.java:230:44:230:63 | next(...) : String | Test.java:3178:9:3178:23 | getElement(...) |
| Test.java:3183:41:3183:56 | (...)... : String | Test.java:263:41:263:49 | element : String | Test.java:263:119:263:119 | h : HashMultiSet [<element>] : String | Test.java:3183:18:3183:57 | newMultiSetWithElement(...) : HashMultiSet [<element>] : String |
| Test.java:3183:41:3183:56 | (...)... : String | Test.java:263:41:263:49 | element : String | Test.java:263:119:263:119 | h : HashMultiSet [<element>] : String | Test.java:3183:18:3183:57 | newMultiSetWithElement(...) : HashMultiSet [<element>] : String |
| Test.java:3185:20:3185:22 | out : MultiSet [<element>] : String | Test.java:230:19:230:32 | it : MultiSet [<element>] : String | Test.java:230:44:230:63 | next(...) : String | Test.java:3185:9:3185:23 | getElement(...) |
| Test.java:3190:45:3190:60 | (...)... : String | Test.java:290:60:290:66 | value : String | Test.java:290:166:290:166 | m : ArrayListValuedHashMap [<map.value>, <element>] : String | Test.java:3190:24:3190:61 | newALVHMWithMapValue(...) : ArrayListValuedHashMap [<map.value>, <element>] : String |
| Test.java:3192:20:3192:47 | (...)... : Collection [<element>] : String | Test.java:230:19:230:32 | it : Collection [<element>] : String | Test.java:230:44:230:63 | next(...) : String | Test.java:3192:9:3192:48 | getElement(...) |
@@ -18658,16 +18538,10 @@ subpaths
| Test.java:3330:45:3330:60 | (...)... : String | Test.java:290:60:290:66 | value : String | Test.java:290:166:290:166 | m : ArrayListValuedHashMap [<map.value>, <element>] : String | Test.java:3330:24:3330:61 | newALVHMWithMapValue(...) : ArrayListValuedHashMap [<map.value>, <element>] : String |
| Test.java:3332:20:3332:22 | out : Collection [<element>] : String | Test.java:230:19:230:32 | it : Collection [<element>] : String | Test.java:230:44:230:63 | next(...) : String | Test.java:3332:9:3332:23 | getElement(...) |
| Test.java:3337:46:3337:61 | (...)... : String | Test.java:283:53:283:57 | key : String | Test.java:283:129:283:143 | mapIterator(...) : OrderedMapIterator [<element>] : String | Test.java:3337:28:3337:62 | newOMIWithElement(...) : OrderedMapIterator [<element>] : String |
| Test.java:3337:46:3337:61 | (...)... : String | Test.java:283:53:283:57 | key : String | Test.java:283:129:283:143 | mapIterator(...) : OrderedMapIterator [<element>] : String | Test.java:3337:28:3337:62 | newOMIWithElement(...) : OrderedMapIterator [<element>] : String |
| Test.java:3344:43:3344:58 | (...)... : String | Test.java:283:53:283:57 | key : String | Test.java:283:129:283:143 | mapIterator(...) : OrderedMapIterator [<element>] : String | Test.java:3344:25:3344:59 | newOMIWithElement(...) : OrderedMapIterator [<element>] : String |
| Test.java:3344:43:3344:58 | (...)... : String | Test.java:283:53:283:57 | key : String | Test.java:283:129:283:143 | mapIterator(...) : OrderedMapIterator [<element>] : String | Test.java:3344:25:3344:59 | newOMIWithElement(...) : OrderedMapIterator [<element>] : String |
| Test.java:3351:45:3351:60 | (...)... : String | Test.java:287:75:287:79 | key : String | Test.java:287:155:287:155 | m : TreeBidiMap [<map.key>] : String | Test.java:3351:20:3351:61 | newTreeBidiMapWithMapKey(...) : TreeBidiMap [<map.key>] : String |
| Test.java:3351:45:3351:60 | (...)... : String | Test.java:287:75:287:79 | key : String | Test.java:287:155:287:155 | m : TreeBidiMap [<map.key>] : String | Test.java:3351:20:3351:61 | newTreeBidiMapWithMapKey(...) : TreeBidiMap [<map.key>] : String |
| Test.java:3358:45:3358:60 | (...)... : String | Test.java:287:75:287:79 | key : String | Test.java:287:155:287:155 | m : TreeBidiMap [<map.key>] : String | Test.java:3358:20:3358:61 | newTreeBidiMapWithMapKey(...) : TreeBidiMap [<map.key>] : String |
| Test.java:3358:45:3358:60 | (...)... : String | Test.java:287:75:287:79 | key : String | Test.java:287:155:287:155 | m : TreeBidiMap [<map.key>] : String | Test.java:3358:20:3358:61 | newTreeBidiMapWithMapKey(...) : TreeBidiMap [<map.key>] : String |
| Test.java:3365:45:3365:60 | (...)... : String | Test.java:287:75:287:79 | key : String | Test.java:287:155:287:155 | m : TreeBidiMap [<map.key>] : String | Test.java:3365:20:3365:61 | newTreeBidiMapWithMapKey(...) : TreeBidiMap [<map.key>] : String |
| Test.java:3365:45:3365:60 | (...)... : String | Test.java:287:75:287:79 | key : String | Test.java:287:155:287:155 | m : TreeBidiMap [<map.key>] : String | Test.java:3365:20:3365:61 | newTreeBidiMapWithMapKey(...) : TreeBidiMap [<map.key>] : String |
| Test.java:3372:45:3372:60 | (...)... : String | Test.java:287:75:287:79 | key : String | Test.java:287:155:287:155 | m : TreeBidiMap [<map.key>] : String | Test.java:3372:20:3372:61 | newTreeBidiMapWithMapKey(...) : TreeBidiMap [<map.key>] : String |
| Test.java:3372:45:3372:60 | (...)... : String | Test.java:287:75:287:79 | key : String | Test.java:287:155:287:155 | m : TreeBidiMap [<map.key>] : String | Test.java:3372:20:3372:61 | newTreeBidiMapWithMapKey(...) : TreeBidiMap [<map.key>] : String |
| Test.java:3381:26:3381:28 | out : Put [<map.key>] : Object | Test.java:242:27:242:44 | container : Put [<map.key>] : Object | Test.java:242:56:242:85 | getMapKey(...) : Object | Test.java:3381:9:3381:29 | getMapKeyFromPut(...) |
| Test.java:3388:19:3388:21 | out : MultiValueMap [<map.key>] : Object | Test.java:228:18:228:29 | map : MultiValueMap [<map.key>] : Object | Test.java:228:41:228:70 | next(...) : Object | Test.java:3388:9:3388:22 | getMapKey(...) |
@@ -18680,14 +18554,9 @@ subpaths
| Test.java:3437:21:3437:23 | out : BidiMap [<map.value>] : Object | Test.java:232:20:232:31 | map : BidiMap [<map.value>] : Object | Test.java:232:43:232:55 | get(...) : Object | Test.java:3437:9:3437:24 | getMapValue(...) |
| Test.java:3444:21:3444:23 | out : AbstractMapDecorator [<map.value>] : Object | Test.java:232:20:232:31 | map : AbstractMapDecorator [<map.value>] : Object | Test.java:232:43:232:55 | get(...) : Object | Test.java:3444:9:3444:24 | getMapValue(...) |
| Test.java:3449:38:3449:53 | (...)... : String | Test.java:293:51:293:57 | value : String | Test.java:293:131:293:131 | m : HashedMap [<map.value>] : String | Test.java:3449:13:3449:54 | newHashedMapWithMapValue(...) : HashedMap [<map.value>] : String |
| Test.java:3449:38:3449:53 | (...)... : String | Test.java:293:51:293:57 | value : String | Test.java:293:131:293:131 | m : HashedMap [<map.value>] : String | Test.java:3449:13:3449:54 | newHashedMapWithMapValue(...) : HashedMap [<map.value>] : String |
| Test.java:3456:42:3456:57 | (...)... : String | Test.java:298:49:298:55 | value : String | Test.java:298:137:298:137 | m : MultiValueMap [<map.value>] : String | Test.java:3456:23:3456:58 | newMVMWithMapValue(...) : MultiValueMap [<map.value>] : String |
| Test.java:3456:42:3456:57 | (...)... : String | Test.java:298:49:298:55 | value : String | Test.java:298:137:298:137 | m : MultiValueMap [<map.value>] : String | Test.java:3456:23:3456:58 | newMVMWithMapValue(...) : MultiValueMap [<map.value>] : String |
| Test.java:3463:37:3463:52 | (...)... : String | Test.java:298:49:298:55 | value : String | Test.java:298:137:298:137 | m : MultiValueMap [<map.value>] : String | Test.java:3463:18:3463:53 | newMVMWithMapValue(...) : MultiValueMap [<map.value>] : String |
| Test.java:3463:37:3463:52 | (...)... : String | Test.java:298:49:298:55 | value : String | Test.java:298:137:298:137 | m : MultiValueMap [<map.value>] : String | Test.java:3463:18:3463:53 | newMVMWithMapValue(...) : MultiValueMap [<map.value>] : String |
| Test.java:3470:44:3470:59 | (...)... : String | Test.java:306:77:306:83 | value : String | Test.java:306:161:306:161 | m : TreeBidiMap [<map.value>] : String | Test.java:3470:17:3470:60 | newTreeBidiMapWithMapValue(...) : TreeBidiMap [<map.value>] : String |
| Test.java:3470:44:3470:59 | (...)... : String | Test.java:306:77:306:83 | value : String | Test.java:306:161:306:161 | m : TreeBidiMap [<map.value>] : String | Test.java:3470:17:3470:60 | newTreeBidiMapWithMapValue(...) : TreeBidiMap [<map.value>] : String |
| Test.java:3477:49:3477:64 | (...)... : String | Test.java:298:49:298:55 | value : String | Test.java:298:137:298:137 | m : MultiValueMap [<map.value>] : String | Test.java:3477:30:3477:65 | newMVMWithMapValue(...) : MultiValueMap [<map.value>] : String |
| Test.java:3477:49:3477:64 | (...)... : String | Test.java:298:49:298:55 | value : String | Test.java:298:137:298:137 | m : MultiValueMap [<map.value>] : String | Test.java:3477:30:3477:65 | newMVMWithMapValue(...) : MultiValueMap [<map.value>] : String |
| Test.java:3484:34:3484:49 | (...)... : String | Test.java:285:47:285:51 | key : String | Test.java:285:121:285:121 | m : TreeMap [<map.key>] : String | Test.java:3484:13:3484:50 | newTreeMapWithMapKey(...) : TreeMap [<map.key>] : String |
| Test.java:3486:26:3486:28 | out : Put [<map.key>] : String | Test.java:242:27:242:44 | container : Put [<map.key>] : String | Test.java:242:56:242:85 | getMapKey(...) : String | Test.java:3486:9:3486:29 | getMapKeyFromPut(...) |
@@ -18757,35 +18626,24 @@ subpaths
| Test.java:3722:41:3722:56 | (...)... : String | Test.java:268:39:268:47 | element : String | Test.java:268:107:268:107 | h : TreeSet [<element>] : String | Test.java:3722:19:3722:57 | newTreeSetWithElement(...) : TreeSet [<element>] : String |
| Test.java:3724:20:3724:22 | out : SortedSet [<element>] : String | Test.java:230:19:230:32 | it : SortedSet [<element>] : String | Test.java:230:44:230:63 | next(...) : String | Test.java:3724:9:3724:23 | getElement(...) |
| Test.java:3729:41:3729:56 | (...)... : String | Test.java:267:39:267:47 | element : String | Test.java:267:107:267:107 | b : TreeBag [<element>] : String | Test.java:3729:19:3729:57 | newTreeBagWithElement(...) : TreeBag [<element>] : String |
| Test.java:3729:41:3729:56 | (...)... : String | Test.java:267:39:267:47 | element : String | Test.java:267:107:267:107 | b : TreeBag [<element>] : String | Test.java:3729:19:3729:57 | newTreeBagWithElement(...) : TreeBag [<element>] : String |
| Test.java:3736:41:3736:56 | (...)... : String | Test.java:267:39:267:47 | element : String | Test.java:267:107:267:107 | b : TreeBag [<element>] : String | Test.java:3736:19:3736:57 | newTreeBagWithElement(...) : TreeBag [<element>] : String |
| Test.java:3736:41:3736:56 | (...)... : String | Test.java:267:39:267:47 | element : String | Test.java:267:107:267:107 | b : TreeBag [<element>] : String | Test.java:3736:19:3736:57 | newTreeBagWithElement(...) : TreeBag [<element>] : String |
| Test.java:3743:36:3743:51 | (...)... : String | Test.java:275:49:275:53 | key : String | Test.java:275:125:275:125 | m : HashedMap [<map.key>] : String | Test.java:3743:13:3743:52 | newHashedMapWithMapKey(...) : HashedMap [<map.key>] : String |
| Test.java:3743:36:3743:51 | (...)... : String | Test.java:275:49:275:53 | key : String | Test.java:275:125:275:125 | m : HashedMap [<map.key>] : String | Test.java:3743:13:3743:52 | newHashedMapWithMapKey(...) : HashedMap [<map.key>] : String |
| Test.java:3745:19:3745:21 | out : IterableMap [<map.key>] : String | Test.java:228:18:228:29 | map : IterableMap [<map.key>] : String | Test.java:228:41:228:70 | next(...) : String | Test.java:3745:9:3745:22 | getMapKey(...) |
| Test.java:3750:38:3750:53 | (...)... : String | Test.java:293:51:293:57 | value : String | Test.java:293:131:293:131 | m : HashedMap [<map.value>] : String | Test.java:3750:13:3750:54 | newHashedMapWithMapValue(...) : HashedMap [<map.value>] : String |
| Test.java:3750:38:3750:53 | (...)... : String | Test.java:293:51:293:57 | value : String | Test.java:293:131:293:131 | m : HashedMap [<map.value>] : String | Test.java:3750:13:3750:54 | newHashedMapWithMapValue(...) : HashedMap [<map.value>] : String |
| Test.java:3752:21:3752:23 | out : IterableMap [<map.value>] : String | Test.java:232:20:232:31 | map : IterableMap [<map.value>] : String | Test.java:232:43:232:55 | get(...) : String | Test.java:3752:9:3752:24 | getMapValue(...) |
| Test.java:3757:36:3757:51 | (...)... : String | Test.java:275:49:275:53 | key : String | Test.java:275:125:275:125 | m : HashedMap [<map.key>] : String | Test.java:3757:13:3757:52 | newHashedMapWithMapKey(...) : HashedMap [<map.key>] : String |
| Test.java:3757:36:3757:51 | (...)... : String | Test.java:275:49:275:53 | key : String | Test.java:275:125:275:125 | m : HashedMap [<map.key>] : String | Test.java:3757:13:3757:52 | newHashedMapWithMapKey(...) : HashedMap [<map.key>] : String |
| Test.java:3759:19:3759:21 | out : Map [<map.key>] : String | Test.java:228:18:228:29 | map : Map [<map.key>] : String | Test.java:228:41:228:70 | next(...) : String | Test.java:3759:9:3759:22 | getMapKey(...) |
| Test.java:3764:38:3764:53 | (...)... : String | Test.java:293:51:293:57 | value : String | Test.java:293:131:293:131 | m : HashedMap [<map.value>] : String | Test.java:3764:13:3764:54 | newHashedMapWithMapValue(...) : HashedMap [<map.value>] : String |
| Test.java:3764:38:3764:53 | (...)... : String | Test.java:293:51:293:57 | value : String | Test.java:293:131:293:131 | m : HashedMap [<map.value>] : String | Test.java:3764:13:3764:54 | newHashedMapWithMapValue(...) : HashedMap [<map.value>] : String |
| Test.java:3766:21:3766:23 | out : Map [<map.value>] : String | Test.java:232:20:232:31 | map : Map [<map.value>] : String | Test.java:232:43:232:55 | get(...) : String | Test.java:3766:9:3766:24 | getMapValue(...) |
| Test.java:3771:40:3771:55 | (...)... : String | Test.java:288:49:288:58 | key : String | Test.java:288:134:288:134 | m : PatriciaTrie [<map.key>] : String | Test.java:3771:14:3771:56 | newPatriciaTrieWithMapKey(...) : PatriciaTrie [<map.key>] : String |
| Test.java:3771:40:3771:55 | (...)... : String | Test.java:288:49:288:58 | key : String | Test.java:288:134:288:134 | m : PatriciaTrie [<map.key>] : String | Test.java:3771:14:3771:56 | newPatriciaTrieWithMapKey(...) : PatriciaTrie [<map.key>] : String |
| Test.java:3773:19:3773:21 | out : SortedMap [<map.key>] : String | Test.java:228:18:228:29 | map : SortedMap [<map.key>] : String | Test.java:228:41:228:70 | next(...) : String | Test.java:3773:9:3773:22 | getMapKey(...) |
| Test.java:3778:42:3778:57 | (...)... : String | Test.java:307:50:307:56 | value : String | Test.java:307:129:307:129 | m : PatriciaTrie [<map.value>] : String | Test.java:3778:14:3778:58 | newPatriciaTrieWithMapValue(...) : PatriciaTrie [<map.value>] : String |
| Test.java:3778:42:3778:57 | (...)... : String | Test.java:307:50:307:56 | value : String | Test.java:307:129:307:129 | m : PatriciaTrie [<map.value>] : String | Test.java:3778:14:3778:58 | newPatriciaTrieWithMapValue(...) : PatriciaTrie [<map.value>] : String |
| Test.java:3780:21:3780:23 | out : SortedMap [<map.value>] : String | Test.java:232:20:232:31 | map : SortedMap [<map.value>] : String | Test.java:232:43:232:55 | get(...) : String | Test.java:3780:9:3780:24 | getMapValue(...) |
| Test.java:3785:40:3785:55 | (...)... : String | Test.java:288:49:288:58 | key : String | Test.java:288:134:288:134 | m : PatriciaTrie [<map.key>] : String | Test.java:3785:14:3785:56 | newPatriciaTrieWithMapKey(...) : PatriciaTrie [<map.key>] : String |
| Test.java:3785:40:3785:55 | (...)... : String | Test.java:288:49:288:58 | key : String | Test.java:288:134:288:134 | m : PatriciaTrie [<map.key>] : String | Test.java:3785:14:3785:56 | newPatriciaTrieWithMapKey(...) : PatriciaTrie [<map.key>] : String |
| Test.java:3787:19:3787:21 | out : Trie [<map.key>] : String | Test.java:228:18:228:29 | map : Trie [<map.key>] : String | Test.java:228:41:228:70 | next(...) : String | Test.java:3787:9:3787:22 | getMapKey(...) |
| Test.java:3792:42:3792:57 | (...)... : String | Test.java:307:50:307:56 | value : String | Test.java:307:129:307:129 | m : PatriciaTrie [<map.value>] : String | Test.java:3792:14:3792:58 | newPatriciaTrieWithMapValue(...) : PatriciaTrie [<map.value>] : String |
| Test.java:3792:42:3792:57 | (...)... : String | Test.java:307:50:307:56 | value : String | Test.java:307:129:307:129 | m : PatriciaTrie [<map.value>] : String | Test.java:3792:14:3792:58 | newPatriciaTrieWithMapValue(...) : PatriciaTrie [<map.value>] : String |
| Test.java:3794:21:3794:23 | out : Trie [<map.value>] : String | Test.java:232:20:232:31 | map : Trie [<map.value>] : String | Test.java:232:43:232:55 | get(...) : String | Test.java:3794:9:3794:24 | getMapValue(...) |
| Test.java:3799:35:3799:50 | (...)... : String | Test.java:267:39:267:47 | element : String | Test.java:267:107:267:107 | b : TreeBag [<element>] : String | Test.java:3799:13:3799:51 | newTreeBagWithElement(...) : TreeBag [<element>] : String |
| Test.java:3799:35:3799:50 | (...)... : String | Test.java:267:39:267:47 | element : String | Test.java:267:107:267:107 | b : TreeBag [<element>] : String | Test.java:3799:13:3799:51 | newTreeBagWithElement(...) : TreeBag [<element>] : String |
| Test.java:3800:37:3800:38 | in : TreeBag [<element>] : String | Test.java:7104:33:7104:48 | bag : TreeBag [<element>] : String | Test.java:7104:10:7104:31 | parameter this [Return] : MyAbstractBagDecorator [<element>] : String | Test.java:3800:10:3800:39 | new MyAbstractBagDecorator<>(...) : MyAbstractBagDecorator [<element>] : String |
| Test.java:3801:20:3801:22 | out : MyAbstractBagDecorator [<element>] : String | Test.java:230:19:230:32 | it : MyAbstractBagDecorator [<element>] : String | Test.java:230:44:230:63 | next(...) : String | Test.java:3801:9:3801:23 | getElement(...) |
| Test.java:3807:31:3807:32 | in : Map [<map.key>] : String | Test.java:7110:27:7110:58 | map : Map [<map.key>] : String | Test.java:7110:10:7110:25 | parameter this [Return] : MyAbstractMapBag [<element>] : String | Test.java:3807:10:3807:33 | new MyAbstractMapBag<>(...) : MyAbstractMapBag [<element>] : String |
@@ -18794,50 +18652,35 @@ subpaths
| Test.java:3814:10:3814:11 | in : MyAbstractMapBag [<element>] : String | Test.java:7113:33:7113:40 | parameter this : MyAbstractMapBag [<element>] : String | Test.java:7114:11:7114:24 | getMap(...) : Map [<map.key>] : String | Test.java:3814:10:3814:22 | myGetMap(...) : Map [<map.key>] : String |
| Test.java:3815:19:3815:21 | out : Map [<map.key>] : String | Test.java:228:18:228:29 | map : Map [<map.key>] : String | Test.java:228:41:228:70 | next(...) : String | Test.java:3815:9:3815:22 | getMapKey(...) |
| Test.java:3820:41:3820:56 | (...)... : String | Test.java:267:39:267:47 | element : String | Test.java:267:107:267:107 | b : TreeBag [<element>] : String | Test.java:3820:19:3820:57 | newTreeBagWithElement(...) : TreeBag [<element>] : String |
| Test.java:3820:41:3820:56 | (...)... : String | Test.java:267:39:267:47 | element : String | Test.java:267:107:267:107 | b : TreeBag [<element>] : String | Test.java:3820:19:3820:57 | newTreeBagWithElement(...) : TreeBag [<element>] : String |
| Test.java:3821:43:3821:44 | in : TreeBag [<element>] : String | Test.java:7119:39:7119:60 | bag : TreeBag [<element>] : String | Test.java:7119:10:7119:37 | parameter this [Return] : MyAbstractSortedBagDecorator [<element>] : String | Test.java:3821:10:3821:45 | new MyAbstractSortedBagDecorator<>(...) : MyAbstractSortedBagDecorator [<element>] : String |
| Test.java:3822:20:3822:22 | out : MyAbstractSortedBagDecorator [<element>] : String | Test.java:230:19:230:32 | it : MyAbstractSortedBagDecorator [<element>] : String | Test.java:230:44:230:63 | next(...) : String | Test.java:3822:9:3822:23 | getElement(...) |
| Test.java:3827:35:3827:50 | (...)... : String | Test.java:267:39:267:47 | element : String | Test.java:267:107:267:107 | b : TreeBag [<element>] : String | Test.java:3827:13:3827:51 | newTreeBagWithElement(...) : TreeBag [<element>] : String |
| Test.java:3827:35:3827:50 | (...)... : String | Test.java:267:39:267:47 | element : String | Test.java:267:107:267:107 | b : TreeBag [<element>] : String | Test.java:3827:13:3827:51 | newTreeBagWithElement(...) : TreeBag [<element>] : String |
| Test.java:3829:20:3829:22 | out : CollectionBag [<element>] : String | Test.java:230:19:230:32 | it : CollectionBag [<element>] : String | Test.java:230:44:230:63 | next(...) : String | Test.java:3829:9:3829:23 | getElement(...) |
| Test.java:3834:35:3834:50 | (...)... : String | Test.java:267:39:267:47 | element : String | Test.java:267:107:267:107 | b : TreeBag [<element>] : String | Test.java:3834:13:3834:51 | newTreeBagWithElement(...) : TreeBag [<element>] : String |
| Test.java:3834:35:3834:50 | (...)... : String | Test.java:267:39:267:47 | element : String | Test.java:267:107:267:107 | b : TreeBag [<element>] : String | Test.java:3834:13:3834:51 | newTreeBagWithElement(...) : TreeBag [<element>] : String |
| Test.java:3836:20:3836:22 | out : Bag [<element>] : String | Test.java:230:19:230:32 | it : Bag [<element>] : String | Test.java:230:44:230:63 | next(...) : String | Test.java:3836:9:3836:23 | getElement(...) |
| Test.java:3841:41:3841:56 | (...)... : String | Test.java:267:39:267:47 | element : String | Test.java:267:107:267:107 | b : TreeBag [<element>] : String | Test.java:3841:19:3841:57 | newTreeBagWithElement(...) : TreeBag [<element>] : String |
| Test.java:3841:41:3841:56 | (...)... : String | Test.java:267:39:267:47 | element : String | Test.java:267:107:267:107 | b : TreeBag [<element>] : String | Test.java:3841:19:3841:57 | newTreeBagWithElement(...) : TreeBag [<element>] : String |
| Test.java:3843:20:3843:22 | out : CollectionSortedBag [<element>] : String | Test.java:230:19:230:32 | it : CollectionSortedBag [<element>] : String | Test.java:230:44:230:63 | next(...) : String | Test.java:3843:9:3843:23 | getElement(...) |
| Test.java:3848:41:3848:56 | (...)... : String | Test.java:267:39:267:47 | element : String | Test.java:267:107:267:107 | b : TreeBag [<element>] : String | Test.java:3848:19:3848:57 | newTreeBagWithElement(...) : TreeBag [<element>] : String |
| Test.java:3848:41:3848:56 | (...)... : String | Test.java:267:39:267:47 | element : String | Test.java:267:107:267:107 | b : TreeBag [<element>] : String | Test.java:3848:19:3848:57 | newTreeBagWithElement(...) : TreeBag [<element>] : String |
| Test.java:3850:20:3850:22 | out : SortedBag [<element>] : String | Test.java:230:19:230:32 | it : SortedBag [<element>] : String | Test.java:230:44:230:63 | next(...) : String | Test.java:3850:9:3850:23 | getElement(...) |
| Test.java:3855:42:3855:57 | (...)... : String | Test.java:267:39:267:47 | element : String | Test.java:267:107:267:107 | b : TreeBag [<element>] : String | Test.java:3855:20:3855:58 | newTreeBagWithElement(...) : TreeBag [<element>] : String |
| Test.java:3855:42:3855:57 | (...)... : String | Test.java:267:39:267:47 | element : String | Test.java:267:107:267:107 | b : TreeBag [<element>] : String | Test.java:3855:20:3855:58 | newTreeBagWithElement(...) : TreeBag [<element>] : String |
| Test.java:3857:20:3857:22 | out : HashBag [<element>] : String | Test.java:230:19:230:32 | it : HashBag [<element>] : String | Test.java:230:44:230:63 | next(...) : String | Test.java:3857:9:3857:23 | getElement(...) |
| Test.java:3862:35:3862:50 | (...)... : String | Test.java:267:39:267:47 | element : String | Test.java:267:107:267:107 | b : TreeBag [<element>] : String | Test.java:3862:13:3862:51 | newTreeBagWithElement(...) : TreeBag [<element>] : String |
| Test.java:3862:35:3862:50 | (...)... : String | Test.java:267:39:267:47 | element : String | Test.java:267:107:267:107 | b : TreeBag [<element>] : String | Test.java:3862:13:3862:51 | newTreeBagWithElement(...) : TreeBag [<element>] : String |
| Test.java:3864:20:3864:22 | out : PredicatedBag [<element>] : String | Test.java:230:19:230:32 | it : PredicatedBag [<element>] : String | Test.java:230:44:230:63 | next(...) : String | Test.java:3864:9:3864:23 | getElement(...) |
| Test.java:3869:41:3869:56 | (...)... : String | Test.java:267:39:267:47 | element : String | Test.java:267:107:267:107 | b : TreeBag [<element>] : String | Test.java:3869:19:3869:57 | newTreeBagWithElement(...) : TreeBag [<element>] : String |
| Test.java:3869:41:3869:56 | (...)... : String | Test.java:267:39:267:47 | element : String | Test.java:267:107:267:107 | b : TreeBag [<element>] : String | Test.java:3869:19:3869:57 | newTreeBagWithElement(...) : TreeBag [<element>] : String |
| Test.java:3871:20:3871:22 | out : PredicatedSortedBag [<element>] : String | Test.java:230:19:230:32 | it : PredicatedSortedBag [<element>] : String | Test.java:230:44:230:63 | next(...) : String | Test.java:3871:9:3871:23 | getElement(...) |
| Test.java:3876:35:3876:50 | (...)... : String | Test.java:267:39:267:47 | element : String | Test.java:267:107:267:107 | b : TreeBag [<element>] : String | Test.java:3876:13:3876:51 | newTreeBagWithElement(...) : TreeBag [<element>] : String |
| Test.java:3876:35:3876:50 | (...)... : String | Test.java:267:39:267:47 | element : String | Test.java:267:107:267:107 | b : TreeBag [<element>] : String | Test.java:3876:13:3876:51 | newTreeBagWithElement(...) : TreeBag [<element>] : String |
| Test.java:3878:20:3878:22 | out : SynchronizedBag [<element>] : String | Test.java:230:19:230:32 | it : SynchronizedBag [<element>] : String | Test.java:230:44:230:63 | next(...) : String | Test.java:3878:9:3878:23 | getElement(...) |
| Test.java:3883:41:3883:56 | (...)... : String | Test.java:267:39:267:47 | element : String | Test.java:267:107:267:107 | b : TreeBag [<element>] : String | Test.java:3883:19:3883:57 | newTreeBagWithElement(...) : TreeBag [<element>] : String |
| Test.java:3883:41:3883:56 | (...)... : String | Test.java:267:39:267:47 | element : String | Test.java:267:107:267:107 | b : TreeBag [<element>] : String | Test.java:3883:19:3883:57 | newTreeBagWithElement(...) : TreeBag [<element>] : String |
| Test.java:3885:20:3885:22 | out : SynchronizedSortedBag [<element>] : String | Test.java:230:19:230:32 | it : SynchronizedSortedBag [<element>] : String | Test.java:230:44:230:63 | next(...) : String | Test.java:3885:9:3885:23 | getElement(...) |
| Test.java:3890:35:3890:50 | (...)... : String | Test.java:267:39:267:47 | element : String | Test.java:267:107:267:107 | b : TreeBag [<element>] : String | Test.java:3890:13:3890:51 | newTreeBagWithElement(...) : TreeBag [<element>] : String |
| Test.java:3890:35:3890:50 | (...)... : String | Test.java:267:39:267:47 | element : String | Test.java:267:107:267:107 | b : TreeBag [<element>] : String | Test.java:3890:13:3890:51 | newTreeBagWithElement(...) : TreeBag [<element>] : String |
| Test.java:3892:20:3892:22 | out : Bag [<element>] : String | Test.java:230:19:230:32 | it : Bag [<element>] : String | Test.java:230:44:230:63 | next(...) : String | Test.java:3892:9:3892:23 | getElement(...) |
| Test.java:3897:41:3897:56 | (...)... : String | Test.java:267:39:267:47 | element : String | Test.java:267:107:267:107 | b : TreeBag [<element>] : String | Test.java:3897:19:3897:57 | newTreeBagWithElement(...) : TreeBag [<element>] : String |
| Test.java:3897:41:3897:56 | (...)... : String | Test.java:267:39:267:47 | element : String | Test.java:267:107:267:107 | b : TreeBag [<element>] : String | Test.java:3897:19:3897:57 | newTreeBagWithElement(...) : TreeBag [<element>] : String |
| Test.java:3899:20:3899:22 | out : TransformedSortedBag [<element>] : String | Test.java:230:19:230:32 | it : TransformedSortedBag [<element>] : String | Test.java:230:44:230:63 | next(...) : String | Test.java:3899:9:3899:23 | getElement(...) |
| Test.java:3904:42:3904:57 | (...)... : String | Test.java:267:39:267:47 | element : String | Test.java:267:107:267:107 | b : TreeBag [<element>] : String | Test.java:3904:20:3904:58 | newTreeBagWithElement(...) : TreeBag [<element>] : String |
| Test.java:3904:42:3904:57 | (...)... : String | Test.java:267:39:267:47 | element : String | Test.java:267:107:267:107 | b : TreeBag [<element>] : String | Test.java:3904:20:3904:58 | newTreeBagWithElement(...) : TreeBag [<element>] : String |
| Test.java:3906:20:3906:22 | out : TreeBag [<element>] : String | Test.java:230:19:230:32 | it : TreeBag [<element>] : String | Test.java:230:44:230:63 | next(...) : String | Test.java:3906:9:3906:23 | getElement(...) |
| Test.java:3911:35:3911:50 | (...)... : String | Test.java:267:39:267:47 | element : String | Test.java:267:107:267:107 | b : TreeBag [<element>] : String | Test.java:3911:13:3911:51 | newTreeBagWithElement(...) : TreeBag [<element>] : String |
| Test.java:3911:35:3911:50 | (...)... : String | Test.java:267:39:267:47 | element : String | Test.java:267:107:267:107 | b : TreeBag [<element>] : String | Test.java:3911:13:3911:51 | newTreeBagWithElement(...) : TreeBag [<element>] : String |
| Test.java:3913:20:3913:22 | out : Bag [<element>] : String | Test.java:230:19:230:32 | it : Bag [<element>] : String | Test.java:230:44:230:63 | next(...) : String | Test.java:3913:9:3913:23 | getElement(...) |
| Test.java:3918:41:3918:56 | (...)... : String | Test.java:267:39:267:47 | element : String | Test.java:267:107:267:107 | b : TreeBag [<element>] : String | Test.java:3918:19:3918:57 | newTreeBagWithElement(...) : TreeBag [<element>] : String |
| Test.java:3918:41:3918:56 | (...)... : String | Test.java:267:39:267:47 | element : String | Test.java:267:107:267:107 | b : TreeBag [<element>] : String | Test.java:3918:19:3918:57 | newTreeBagWithElement(...) : TreeBag [<element>] : String |
| Test.java:3920:20:3920:22 | out : SortedBag [<element>] : String | Test.java:230:19:230:32 | it : SortedBag [<element>] : String | Test.java:230:44:230:63 | next(...) : String | Test.java:3920:9:3920:23 | getElement(...) |
| Test.java:3925:46:3925:61 | (...)... : String | Test.java:274:61:274:65 | key : String | Test.java:274:77:274:124 | new DualTreeBidiMap<K,String>(...) : DualTreeBidiMap [<map.key>] : String | Test.java:3925:17:3925:62 | newDualTreeBidiMapWithMapKey(...) : DualTreeBidiMap [<map.key>] : String |
| Test.java:3926:41:3926:42 | in : DualTreeBidiMap [<map.key>] : String | Test.java:7125:37:7125:59 | map : DualTreeBidiMap [<map.key>] : String | Test.java:7125:10:7125:35 | parameter this [Return] : MyAbstractBidiMapDecorator [<map.key>] : String | Test.java:3926:10:3926:43 | new MyAbstractBidiMapDecorator<>(...) : MyAbstractBidiMapDecorator [<map.key>] : String |
@@ -18908,72 +18751,52 @@ subpaths
| Test.java:4142:54:4142:69 | (...)... : String | Test.java:292:63:292:69 | value : String | Test.java:292:81:292:130 | new DualTreeBidiMap<String,V>(...) : DualTreeBidiMap [<map.value>] : String | Test.java:4142:23:4142:70 | newDualTreeBidiMapWithMapValue(...) : DualTreeBidiMap [<map.value>] : String |
| Test.java:4144:21:4144:23 | out : SortedBidiMap [<map.value>] : String | Test.java:232:20:232:31 | map : SortedBidiMap [<map.value>] : String | Test.java:232:43:232:55 | get(...) : String | Test.java:4144:9:4144:24 | getMapValue(...) |
| Test.java:4149:42:4149:57 | (...)... : String | Test.java:267:39:267:47 | element : String | Test.java:267:107:267:107 | b : TreeBag [<element>] : String | Test.java:4149:20:4149:58 | newTreeBagWithElement(...) : TreeBag [<element>] : String |
| Test.java:4149:42:4149:57 | (...)... : String | Test.java:267:39:267:47 | element : String | Test.java:267:107:267:107 | b : TreeBag [<element>] : String | Test.java:4149:20:4149:58 | newTreeBagWithElement(...) : TreeBag [<element>] : String |
| Test.java:4150:44:4150:45 | in : TreeBag [<element>] : String | Test.java:7149:40:7149:63 | coll : TreeBag [<element>] : String | Test.java:7149:10:7149:38 | parameter this [Return] : MyAbstractCollectionDecorator [<element>] : String | Test.java:4150:10:4150:46 | new MyAbstractCollectionDecorator<>(...) : MyAbstractCollectionDecorator [<element>] : String |
| Test.java:4151:20:4151:22 | out : MyAbstractCollectionDecorator [<element>] : String | Test.java:230:19:230:32 | it : MyAbstractCollectionDecorator [<element>] : String | Test.java:230:44:230:63 | next(...) : String | Test.java:4151:9:4151:23 | getElement(...) |
| Test.java:4156:73:4156:111 | newTreeBagWithElement(...) : TreeBag [<element>] : String | Test.java:7149:40:7149:63 | coll : TreeBag [<element>] : String | Test.java:7149:10:7149:38 | parameter this [Return] : MyAbstractCollectionDecorator [<element>] : String | Test.java:4156:39:4156:112 | new MyAbstractCollectionDecorator<>(...) : MyAbstractCollectionDecorator [<element>] : String |
| Test.java:4156:95:4156:110 | (...)... : String | Test.java:267:39:267:47 | element : String | Test.java:267:107:267:107 | b : TreeBag [<element>] : String | Test.java:4156:73:4156:111 | newTreeBagWithElement(...) : TreeBag [<element>] : String |
| Test.java:4156:95:4156:110 | (...)... : String | Test.java:267:39:267:47 | element : String | Test.java:267:107:267:107 | b : TreeBag [<element>] : String | Test.java:4156:73:4156:111 | newTreeBagWithElement(...) : TreeBag [<element>] : String |
| Test.java:4157:10:4157:11 | in : MyAbstractCollectionDecorator [<element>] : String | Test.java:7152:24:7152:34 | parameter this : MyAbstractCollectionDecorator [<element>] : String | Test.java:7153:11:7153:27 | decorated(...) : Collection [<element>] : String | Test.java:4157:10:4157:25 | myDecorated(...) : Collection [<element>] : String |
| Test.java:4158:20:4158:22 | out : Collection [<element>] : String | Test.java:230:19:230:32 | it : Collection [<element>] : String | Test.java:230:44:230:63 | next(...) : String | Test.java:4158:9:4158:23 | getElement(...) |
| Test.java:4163:42:4163:57 | (...)... : String | Test.java:267:39:267:47 | element : String | Test.java:267:107:267:107 | b : TreeBag [<element>] : String | Test.java:4163:20:4163:58 | newTreeBagWithElement(...) : TreeBag [<element>] : String |
| Test.java:4163:42:4163:57 | (...)... : String | Test.java:267:39:267:47 | element : String | Test.java:267:107:267:107 | b : TreeBag [<element>] : String | Test.java:4163:20:4163:58 | newTreeBagWithElement(...) : TreeBag [<element>] : String |
| Test.java:4164:24:4164:25 | in : TreeBag [<element>] : String | Test.java:7155:31:7155:54 | coll : TreeBag [<element>] : String | Test.java:7155:15:7155:29 | parameter this [Return] : MyAbstractCollectionDecorator [<element>] : String | Test.java:4164:4:4164:6 | out [post update] : MyAbstractCollectionDecorator [<element>] : String |
| Test.java:4165:20:4165:22 | out : MyAbstractCollectionDecorator [<element>] : String | Test.java:230:19:230:32 | it : MyAbstractCollectionDecorator [<element>] : String | Test.java:230:44:230:63 | next(...) : String | Test.java:4165:9:4165:23 | getElement(...) |
| Test.java:4173:20:4173:22 | out : CompositeCollection [<element>] : Object | Test.java:230:19:230:32 | it : CompositeCollection [<element>] : Object | Test.java:230:44:230:63 | next(...) : Object | Test.java:4173:9:4173:23 | getElement(...) |
| Test.java:4181:20:4181:34 | getElement(...) : Collection [<element>] : Object | Test.java:230:19:230:32 | it : Collection [<element>] : Object | Test.java:230:44:230:63 | next(...) : Object | Test.java:4181:9:4181:35 | getElement(...) |
| Test.java:4181:31:4181:33 | out : List [<element>, <element>] : Object | Test.java:230:19:230:32 | it : List [<element>, <element>] : Object | Test.java:230:44:230:63 | next(...) : Object [<element>] : Object | Test.java:4181:20:4181:34 | getElement(...) : Collection [<element>] : Object |
| Test.java:4186:42:4186:57 | (...)... : String | Test.java:267:39:267:47 | element : String | Test.java:267:107:267:107 | b : TreeBag [<element>] : String | Test.java:4186:20:4186:58 | newTreeBagWithElement(...) : TreeBag [<element>] : String |
| Test.java:4186:42:4186:57 | (...)... : String | Test.java:267:39:267:47 | element : String | Test.java:267:107:267:107 | b : TreeBag [<element>] : String | Test.java:4186:20:4186:58 | newTreeBagWithElement(...) : TreeBag [<element>] : String |
| Test.java:4189:20:4189:22 | out : CompositeCollection [<element>] : String | Test.java:230:19:230:32 | it : CompositeCollection [<element>] : String | Test.java:230:44:230:63 | next(...) : String | Test.java:4189:9:4189:23 | getElement(...) |
| Test.java:4194:42:4194:57 | (...)... : String | Test.java:267:39:267:47 | element : String | Test.java:267:107:267:107 | b : TreeBag [<element>] : String | Test.java:4194:20:4194:58 | newTreeBagWithElement(...) : TreeBag [<element>] : String |
| Test.java:4194:42:4194:57 | (...)... : String | Test.java:267:39:267:47 | element : String | Test.java:267:107:267:107 | b : TreeBag [<element>] : String | Test.java:4194:20:4194:58 | newTreeBagWithElement(...) : TreeBag [<element>] : String |
| Test.java:4197:20:4197:34 | getElement(...) : Collection [<element>] : String | Test.java:230:19:230:32 | it : Collection [<element>] : String | Test.java:230:44:230:63 | next(...) : String | Test.java:4197:9:4197:35 | getElement(...) |
| Test.java:4197:31:4197:33 | out : List [<element>, <element>] : String | Test.java:230:19:230:32 | it : List [<element>, <element>] : String | Test.java:230:44:230:63 | next(...) : Object [<element>] : String | Test.java:4197:20:4197:34 | getElement(...) : Collection [<element>] : String |
| Test.java:4202:42:4202:57 | (...)... : String | Test.java:267:39:267:47 | element : String | Test.java:267:107:267:107 | b : TreeBag [<element>] : String | Test.java:4202:20:4202:58 | newTreeBagWithElement(...) : TreeBag [<element>] : String |
| Test.java:4202:42:4202:57 | (...)... : String | Test.java:267:39:267:47 | element : String | Test.java:267:107:267:107 | b : TreeBag [<element>] : String | Test.java:4202:20:4202:58 | newTreeBagWithElement(...) : TreeBag [<element>] : String |
| Test.java:4204:20:4204:22 | out : CompositeCollection [<element>] : String | Test.java:230:19:230:32 | it : CompositeCollection [<element>] : String | Test.java:230:44:230:63 | next(...) : String | Test.java:4204:9:4204:23 | getElement(...) |
| Test.java:4209:42:4209:57 | (...)... : String | Test.java:267:39:267:47 | element : String | Test.java:267:107:267:107 | b : TreeBag [<element>] : String | Test.java:4209:20:4209:58 | newTreeBagWithElement(...) : TreeBag [<element>] : String |
| Test.java:4209:42:4209:57 | (...)... : String | Test.java:267:39:267:47 | element : String | Test.java:267:107:267:107 | b : TreeBag [<element>] : String | Test.java:4209:20:4209:58 | newTreeBagWithElement(...) : TreeBag [<element>] : String |
| Test.java:4211:20:4211:22 | out : CompositeCollection [<element>] : String | Test.java:230:19:230:32 | it : CompositeCollection [<element>] : String | Test.java:230:44:230:63 | next(...) : String | Test.java:4211:9:4211:23 | getElement(...) |
| Test.java:4216:42:4216:57 | (...)... : String | Test.java:267:39:267:47 | element : String | Test.java:267:107:267:107 | b : TreeBag [<element>] : String | Test.java:4216:20:4216:58 | newTreeBagWithElement(...) : TreeBag [<element>] : String |
| Test.java:4216:42:4216:57 | (...)... : String | Test.java:267:39:267:47 | element : String | Test.java:267:107:267:107 | b : TreeBag [<element>] : String | Test.java:4216:20:4216:58 | newTreeBagWithElement(...) : TreeBag [<element>] : String |
| Test.java:4218:20:4218:22 | out : CompositeCollection [<element>] : String | Test.java:230:19:230:32 | it : CompositeCollection [<element>] : String | Test.java:230:44:230:63 | next(...) : String | Test.java:4218:9:4218:23 | getElement(...) |
| Test.java:4223:61:4223:76 | (...)... : String | Test.java:267:39:267:47 | element : String | Test.java:267:107:267:107 | b : TreeBag [<element>] : String | Test.java:4223:39:4223:77 | newTreeBagWithElement(...) : TreeBag [<element>] : String |
| Test.java:4223:61:4223:76 | (...)... : String | Test.java:267:39:267:47 | element : String | Test.java:267:107:267:107 | b : TreeBag [<element>] : String | Test.java:4223:39:4223:77 | newTreeBagWithElement(...) : TreeBag [<element>] : String |
| Test.java:4225:20:4225:22 | out : CompositeCollection [<element>] : String | Test.java:230:19:230:32 | it : CompositeCollection [<element>] : String | Test.java:230:44:230:63 | next(...) : String | Test.java:4225:9:4225:23 | getElement(...) |
| Test.java:4230:42:4230:57 | (...)... : String | Test.java:267:39:267:47 | element : String | Test.java:267:107:267:107 | b : TreeBag [<element>] : String | Test.java:4230:20:4230:58 | newTreeBagWithElement(...) : TreeBag [<element>] : String |
| Test.java:4230:42:4230:57 | (...)... : String | Test.java:267:39:267:47 | element : String | Test.java:267:107:267:107 | b : TreeBag [<element>] : String | Test.java:4230:20:4230:58 | newTreeBagWithElement(...) : TreeBag [<element>] : String |
| Test.java:4232:20:4232:22 | out : CompositeCollection [<element>] : String | Test.java:230:19:230:32 | it : CompositeCollection [<element>] : String | Test.java:230:44:230:63 | next(...) : String | Test.java:4232:9:4232:23 | getElement(...) |
| Test.java:4237:42:4237:57 | (...)... : String | Test.java:267:39:267:47 | element : String | Test.java:267:107:267:107 | b : TreeBag [<element>] : String | Test.java:4237:20:4237:58 | newTreeBagWithElement(...) : TreeBag [<element>] : String |
| Test.java:4237:42:4237:57 | (...)... : String | Test.java:267:39:267:47 | element : String | Test.java:267:107:267:107 | b : TreeBag [<element>] : String | Test.java:4237:20:4237:58 | newTreeBagWithElement(...) : TreeBag [<element>] : String |
| Test.java:4239:20:4239:22 | out : CompositeCollection [<element>] : String | Test.java:230:19:230:32 | it : CompositeCollection [<element>] : String | Test.java:230:44:230:63 | next(...) : String | Test.java:4239:9:4239:23 | getElement(...) |
| Test.java:4244:42:4244:57 | (...)... : String | Test.java:267:39:267:47 | element : String | Test.java:267:107:267:107 | b : TreeBag [<element>] : String | Test.java:4244:20:4244:58 | newTreeBagWithElement(...) : TreeBag [<element>] : String |
| Test.java:4244:42:4244:57 | (...)... : String | Test.java:267:39:267:47 | element : String | Test.java:267:107:267:107 | b : TreeBag [<element>] : String | Test.java:4244:20:4244:58 | newTreeBagWithElement(...) : TreeBag [<element>] : String |
| Test.java:4246:20:4246:22 | out : CompositeCollection [<element>] : String | Test.java:230:19:230:32 | it : CompositeCollection [<element>] : String | Test.java:230:44:230:63 | next(...) : String | Test.java:4246:9:4246:23 | getElement(...) |
| Test.java:4251:61:4251:76 | (...)... : String | Test.java:267:39:267:47 | element : String | Test.java:267:107:267:107 | b : TreeBag [<element>] : String | Test.java:4251:39:4251:77 | newTreeBagWithElement(...) : TreeBag [<element>] : String |
| Test.java:4251:61:4251:76 | (...)... : String | Test.java:267:39:267:47 | element : String | Test.java:267:107:267:107 | b : TreeBag [<element>] : String | Test.java:4251:39:4251:77 | newTreeBagWithElement(...) : TreeBag [<element>] : String |
| Test.java:4253:20:4253:22 | out : CompositeCollection [<element>] : String | Test.java:230:19:230:32 | it : CompositeCollection [<element>] : String | Test.java:230:44:230:63 | next(...) : String | Test.java:4253:9:4253:23 | getElement(...) |
| Test.java:4258:75:4258:90 | (...)... : String | Test.java:267:39:267:47 | element : String | Test.java:267:107:267:107 | b : TreeBag [<element>] : String | Test.java:4258:53:4258:91 | newTreeBagWithElement(...) : TreeBag [<element>] : String |
| Test.java:4258:75:4258:90 | (...)... : String | Test.java:267:39:267:47 | element : String | Test.java:267:107:267:107 | b : TreeBag [<element>] : String | Test.java:4258:53:4258:91 | newTreeBagWithElement(...) : TreeBag [<element>] : String |
| Test.java:4260:20:4260:34 | getElement(...) : Collection [<element>] : String | Test.java:230:19:230:32 | it : Collection [<element>] : String | Test.java:230:44:230:63 | next(...) : String | Test.java:4260:9:4260:35 | getElement(...) |
| Test.java:4260:31:4260:33 | out : List [<element>, <element>] : String | Test.java:230:19:230:32 | it : List [<element>, <element>] : String | Test.java:230:44:230:63 | next(...) : Object [<element>] : String | Test.java:4260:20:4260:34 | getElement(...) : Collection [<element>] : String |
| Test.java:4265:75:4265:90 | (...)... : String | Test.java:267:39:267:47 | element : String | Test.java:267:107:267:107 | b : TreeBag [<element>] : String | Test.java:4265:53:4265:91 | newTreeBagWithElement(...) : TreeBag [<element>] : String |
| Test.java:4265:75:4265:90 | (...)... : String | Test.java:267:39:267:47 | element : String | Test.java:267:107:267:107 | b : TreeBag [<element>] : String | Test.java:4265:53:4265:91 | newTreeBagWithElement(...) : TreeBag [<element>] : String |
| Test.java:4267:20:4267:22 | out : Collection [<element>] : String | Test.java:230:19:230:32 | it : Collection [<element>] : String | Test.java:230:44:230:63 | next(...) : String | Test.java:4267:9:4267:23 | getElement(...) |
| Test.java:4272:42:4272:57 | (...)... : String | Test.java:267:39:267:47 | element : String | Test.java:267:107:267:107 | b : TreeBag [<element>] : String | Test.java:4272:20:4272:58 | newTreeBagWithElement(...) : TreeBag [<element>] : String |
| Test.java:4272:42:4272:57 | (...)... : String | Test.java:267:39:267:47 | element : String | Test.java:267:107:267:107 | b : TreeBag [<element>] : String | Test.java:4272:20:4272:58 | newTreeBagWithElement(...) : TreeBag [<element>] : String |
| Test.java:4274:20:4274:22 | out : IndexedCollection [<element>] : String | Test.java:230:19:230:32 | it : IndexedCollection [<element>] : String | Test.java:230:44:230:63 | next(...) : String | Test.java:4274:9:4274:23 | getElement(...) |
| Test.java:4279:71:4279:86 | (...)... : String | Test.java:267:39:267:47 | element : String | Test.java:267:107:267:107 | b : TreeBag [<element>] : String | Test.java:4279:49:4279:87 | newTreeBagWithElement(...) : TreeBag [<element>] : String |
| Test.java:4279:71:4279:86 | (...)... : String | Test.java:267:39:267:47 | element : String | Test.java:267:107:267:107 | b : TreeBag [<element>] : String | Test.java:4279:49:4279:87 | newTreeBagWithElement(...) : TreeBag [<element>] : String |
| Test.java:4286:42:4286:57 | (...)... : String | Test.java:267:39:267:47 | element : String | Test.java:267:107:267:107 | b : TreeBag [<element>] : String | Test.java:4286:20:4286:58 | newTreeBagWithElement(...) : TreeBag [<element>] : String |
| Test.java:4286:42:4286:57 | (...)... : String | Test.java:267:39:267:47 | element : String | Test.java:267:107:267:107 | b : TreeBag [<element>] : String | Test.java:4286:20:4286:58 | newTreeBagWithElement(...) : TreeBag [<element>] : String |
| Test.java:4288:20:4288:22 | out : IndexedCollection [<element>] : String | Test.java:230:19:230:32 | it : IndexedCollection [<element>] : String | Test.java:230:44:230:63 | next(...) : String | Test.java:4288:9:4288:23 | getElement(...) |
| Test.java:4293:42:4293:57 | (...)... : String | Test.java:267:39:267:47 | element : String | Test.java:267:107:267:107 | b : TreeBag [<element>] : String | Test.java:4293:20:4293:58 | newTreeBagWithElement(...) : TreeBag [<element>] : String |
| Test.java:4293:42:4293:57 | (...)... : String | Test.java:267:39:267:47 | element : String | Test.java:267:107:267:107 | b : TreeBag [<element>] : String | Test.java:4293:20:4293:58 | newTreeBagWithElement(...) : TreeBag [<element>] : String |
| Test.java:4295:20:4295:22 | out : IndexedCollection [<element>] : String | Test.java:230:19:230:32 | it : IndexedCollection [<element>] : String | Test.java:230:44:230:63 | next(...) : String | Test.java:4295:9:4295:23 | getElement(...) |
| Test.java:4300:71:4300:86 | (...)... : String | Test.java:267:39:267:47 | element : String | Test.java:267:107:267:107 | b : TreeBag [<element>] : String | Test.java:4300:49:4300:87 | newTreeBagWithElement(...) : TreeBag [<element>] : String |
| Test.java:4300:71:4300:86 | (...)... : String | Test.java:267:39:267:47 | element : String | Test.java:267:107:267:107 | b : TreeBag [<element>] : String | Test.java:4300:49:4300:87 | newTreeBagWithElement(...) : TreeBag [<element>] : String |
| Test.java:4302:20:4302:22 | out : Collection [<element>] : String | Test.java:230:19:230:32 | it : Collection [<element>] : String | Test.java:230:44:230:63 | next(...) : String | Test.java:4302:9:4302:23 | getElement(...) |
| Test.java:4309:20:4309:45 | createPredicatedList(...) : List [<element>] : String | Test.java:230:19:230:32 | it : List [<element>] : String | Test.java:230:44:230:63 | next(...) : String | Test.java:4309:9:4309:46 | getElement(...) |
| Test.java:4316:20:4316:45 | createPredicatedList(...) : List [<element>] : String | Test.java:230:19:230:32 | it : List [<element>] : String | Test.java:230:44:230:63 | next(...) : String | Test.java:4316:9:4316:46 | getElement(...) |
@@ -18982,7 +18805,6 @@ subpaths
| Test.java:4328:80:4328:95 | (...)... : String | Test.java:264:80:264:88 | element : String | Test.java:264:194:264:194 | x : Builder [<element>] : String | Test.java:4328:38:4328:96 | newPredicatedCollectionBuilderWithElement(...) : Builder [<element>] : String |
| Test.java:4330:20:4330:22 | out : Bag [<element>] : String | Test.java:230:19:230:32 | it : Bag [<element>] : String | Test.java:230:44:230:63 | next(...) : String | Test.java:4330:9:4330:23 | getElement(...) |
| Test.java:4335:35:4335:50 | (...)... : String | Test.java:267:39:267:47 | element : String | Test.java:267:107:267:107 | b : TreeBag [<element>] : String | Test.java:4335:13:4335:51 | newTreeBagWithElement(...) : TreeBag [<element>] : String |
| Test.java:4335:35:4335:50 | (...)... : String | Test.java:267:39:267:47 | element : String | Test.java:267:107:267:107 | b : TreeBag [<element>] : String | Test.java:4335:13:4335:51 | newTreeBagWithElement(...) : TreeBag [<element>] : String |
| Test.java:4338:20:4338:22 | out : Bag [<element>] : String | Test.java:230:19:230:32 | it : Bag [<element>] : String | Test.java:230:44:230:63 | next(...) : String | Test.java:4338:9:4338:23 | getElement(...) |
| Test.java:4343:80:4343:95 | (...)... : String | Test.java:264:80:264:88 | element : String | Test.java:264:194:264:194 | x : Builder [<element>] : String | Test.java:4343:38:4343:96 | newPredicatedCollectionBuilderWithElement(...) : Builder [<element>] : String |
| Test.java:4345:20:4345:22 | out : List [<element>] : String | Test.java:230:19:230:32 | it : List [<element>] : String | Test.java:230:44:230:63 | next(...) : String | Test.java:4345:9:4345:23 | getElement(...) |
@@ -18994,7 +18816,6 @@ subpaths
| Test.java:4372:80:4372:95 | (...)... : String | Test.java:264:80:264:88 | element : String | Test.java:264:194:264:194 | x : Builder [<element>] : String | Test.java:4372:38:4372:96 | newPredicatedCollectionBuilderWithElement(...) : Builder [<element>] : String |
| Test.java:4374:20:4374:22 | out : MultiSet [<element>] : String | Test.java:230:19:230:32 | it : MultiSet [<element>] : String | Test.java:230:44:230:63 | next(...) : String | Test.java:4374:9:4374:23 | getElement(...) |
| Test.java:4379:45:4379:60 | (...)... : String | Test.java:258:49:258:57 | element : String | Test.java:258:127:258:127 | x : HashMultiSet [<element>] : String | Test.java:4379:18:4379:61 | newHashMultiSetWithElement(...) : HashMultiSet [<element>] : String |
| Test.java:4379:45:4379:60 | (...)... : String | Test.java:258:49:258:57 | element : String | Test.java:258:127:258:127 | x : HashMultiSet [<element>] : String | Test.java:4379:18:4379:61 | newHashMultiSetWithElement(...) : HashMultiSet [<element>] : String |
| Test.java:4382:20:4382:22 | out : MultiSet [<element>] : String | Test.java:230:19:230:32 | it : MultiSet [<element>] : String | Test.java:230:44:230:63 | next(...) : String | Test.java:4382:9:4382:23 | getElement(...) |
| Test.java:4387:80:4387:95 | (...)... : String | Test.java:264:80:264:88 | element : String | Test.java:264:194:264:194 | x : Builder [<element>] : String | Test.java:4387:38:4387:96 | newPredicatedCollectionBuilderWithElement(...) : Builder [<element>] : String |
| Test.java:4389:20:4389:22 | out : Queue [<element>] : String | Test.java:230:19:230:32 | it : Queue [<element>] : String | Test.java:230:44:230:63 | next(...) : String | Test.java:4389:9:4389:23 | getElement(...) |
@@ -19011,21 +18832,16 @@ subpaths
| Test.java:4431:80:4431:95 | (...)... : String | Test.java:264:80:264:88 | element : String | Test.java:264:194:264:194 | x : Builder [<element>] : String | Test.java:4431:38:4431:96 | newPredicatedCollectionBuilderWithElement(...) : Builder [<element>] : String |
| Test.java:4433:20:4433:22 | out : Collection [<element>] : String | Test.java:230:19:230:32 | it : Collection [<element>] : String | Test.java:230:44:230:63 | next(...) : String | Test.java:4433:9:4433:23 | getElement(...) |
| Test.java:4438:42:4438:57 | (...)... : String | Test.java:267:39:267:47 | element : String | Test.java:267:107:267:107 | b : TreeBag [<element>] : String | Test.java:4438:20:4438:58 | newTreeBagWithElement(...) : TreeBag [<element>] : String |
| Test.java:4438:42:4438:57 | (...)... : String | Test.java:267:39:267:47 | element : String | Test.java:267:107:267:107 | b : TreeBag [<element>] : String | Test.java:4438:20:4438:58 | newTreeBagWithElement(...) : TreeBag [<element>] : String |
| Test.java:4440:20:4440:22 | out : PredicatedCollection [<element>] : String | Test.java:230:19:230:32 | it : PredicatedCollection [<element>] : String | Test.java:230:44:230:63 | next(...) : String | Test.java:4440:9:4440:23 | getElement(...) |
| Test.java:4445:42:4445:57 | (...)... : String | Test.java:267:39:267:47 | element : String | Test.java:267:107:267:107 | b : TreeBag [<element>] : String | Test.java:4445:20:4445:58 | newTreeBagWithElement(...) : TreeBag [<element>] : String |
| Test.java:4445:42:4445:57 | (...)... : String | Test.java:267:39:267:47 | element : String | Test.java:267:107:267:107 | b : TreeBag [<element>] : String | Test.java:4445:20:4445:58 | newTreeBagWithElement(...) : TreeBag [<element>] : String |
| Test.java:4447:20:4447:22 | out : SynchronizedCollection [<element>] : String | Test.java:230:19:230:32 | it : SynchronizedCollection [<element>] : String | Test.java:230:44:230:63 | next(...) : String | Test.java:4447:9:4447:23 | getElement(...) |
| Test.java:4452:42:4452:57 | (...)... : String | Test.java:267:39:267:47 | element : String | Test.java:267:107:267:107 | b : TreeBag [<element>] : String | Test.java:4452:20:4452:58 | newTreeBagWithElement(...) : TreeBag [<element>] : String |
| Test.java:4452:42:4452:57 | (...)... : String | Test.java:267:39:267:47 | element : String | Test.java:267:107:267:107 | b : TreeBag [<element>] : String | Test.java:4452:20:4452:58 | newTreeBagWithElement(...) : TreeBag [<element>] : String |
| Test.java:4454:20:4454:22 | out : TransformedCollection [<element>] : String | Test.java:230:19:230:32 | it : TransformedCollection [<element>] : String | Test.java:230:44:230:63 | next(...) : String | Test.java:4454:9:4454:23 | getElement(...) |
| Test.java:4459:42:4459:57 | (...)... : String | Test.java:267:39:267:47 | element : String | Test.java:267:107:267:107 | b : TreeBag [<element>] : String | Test.java:4459:20:4459:58 | newTreeBagWithElement(...) : TreeBag [<element>] : String |
| Test.java:4459:42:4459:57 | (...)... : String | Test.java:267:39:267:47 | element : String | Test.java:267:107:267:107 | b : TreeBag [<element>] : String | Test.java:4459:20:4459:58 | newTreeBagWithElement(...) : TreeBag [<element>] : String |
| Test.java:4461:20:4461:22 | out : BoundedCollection [<element>] : String | Test.java:230:19:230:32 | it : BoundedCollection [<element>] : String | Test.java:230:44:230:63 | next(...) : String | Test.java:4461:9:4461:23 | getElement(...) |
| Test.java:4466:59:4466:74 | (...)... : String | Test.java:253:59:253:67 | element : String | Test.java:253:147:253:147 | x : CircularFifoQueue [<element>] : String | Test.java:4466:27:4466:75 | newCircularFifoQueueWithElement(...) : CircularFifoQueue [<element>] : String |
| Test.java:4468:20:4468:22 | out : BoundedCollection [<element>] : String | Test.java:230:19:230:32 | it : BoundedCollection [<element>] : String | Test.java:230:44:230:63 | next(...) : String | Test.java:4468:9:4468:23 | getElement(...) |
| Test.java:4473:42:4473:57 | (...)... : String | Test.java:267:39:267:47 | element : String | Test.java:267:107:267:107 | b : TreeBag [<element>] : String | Test.java:4473:20:4473:58 | newTreeBagWithElement(...) : TreeBag [<element>] : String |
| Test.java:4473:42:4473:57 | (...)... : String | Test.java:267:39:267:47 | element : String | Test.java:267:107:267:107 | b : TreeBag [<element>] : String | Test.java:4473:20:4473:58 | newTreeBagWithElement(...) : TreeBag [<element>] : String |
| Test.java:4475:20:4475:22 | out : Collection [<element>] : String | Test.java:230:19:230:32 | it : Collection [<element>] : String | Test.java:230:44:230:63 | next(...) : String | Test.java:4475:9:4475:23 | getElement(...) |
| Test.java:4480:45:4480:60 | (...)... : String | Test.java:259:49:259:57 | element : String | Test.java:259:69:259:112 | listIterator(...) : ListIterator [<element>] : String | Test.java:4480:18:4480:61 | newListIteratorWithElement(...) : ListIterator [<element>] : String |
| Test.java:4481:42:4481:43 | in : ListIterator [<element>] : String | Test.java:7161:38:7161:63 | iterator : ListIterator [<element>] : String | Test.java:7161:10:7161:36 | parameter this [Return] : MyAbstractIteratorDecorator [<element>] : String | Test.java:4481:10:4481:44 | new MyAbstractIteratorDecorator<>(...) : MyAbstractIteratorDecorator [<element>] : String |
@@ -19128,7 +18944,6 @@ subpaths
| Test.java:4753:49:4753:64 | (...)... : String | Test.java:259:49:259:57 | element : String | Test.java:259:69:259:112 | listIterator(...) : ListIterator [<element>] : String | Test.java:4753:22:4753:65 | newListIteratorWithElement(...) : ListIterator [<element>] : String |
| Test.java:4755:20:4755:22 | out : FilterListIterator [<element>] : String | Test.java:231:19:231:32 | it : FilterListIterator [<element>] : String | Test.java:231:44:231:52 | next(...) : String | Test.java:4755:9:4755:23 | getElement(...) |
| Test.java:4760:42:4760:85 | newListIteratorWithElement(...) : ListIterator [<element>] : String | Test.java:267:39:267:47 | element : ListIterator [<element>] : String | Test.java:267:107:267:107 | b : TreeBag [<element>, <element>] : String | Test.java:4760:20:4760:86 | newTreeBagWithElement(...) : TreeBag [<element>, <element>] : String |
| Test.java:4760:42:4760:85 | newListIteratorWithElement(...) : ListIterator [<element>] : String | Test.java:267:39:267:47 | element : ListIterator [<element>] : String | Test.java:267:107:267:107 | b : TreeBag [<element>, <element>] : String | Test.java:4760:20:4760:86 | newTreeBagWithElement(...) : TreeBag [<element>, <element>] : String |
| Test.java:4760:69:4760:84 | (...)... : String | Test.java:259:49:259:57 | element : String | Test.java:259:69:259:112 | listIterator(...) : ListIterator [<element>] : String | Test.java:4760:42:4760:85 | newListIteratorWithElement(...) : ListIterator [<element>] : String |
| Test.java:4762:20:4762:22 | out : IteratorChain [<element>] : String | Test.java:231:19:231:32 | it : IteratorChain [<element>] : String | Test.java:231:44:231:52 | next(...) : String | Test.java:4762:9:4762:23 | getElement(...) |
| Test.java:4767:45:4767:60 | (...)... : String | Test.java:259:49:259:57 | element : String | Test.java:259:69:259:112 | listIterator(...) : ListIterator [<element>] : String | Test.java:4767:18:4767:61 | newListIteratorWithElement(...) : ListIterator [<element>] : String |
@@ -19154,7 +18969,6 @@ subpaths
| Test.java:4837:45:4837:60 | (...)... : String | Test.java:259:49:259:57 | element : String | Test.java:259:69:259:112 | listIterator(...) : ListIterator [<element>] : String | Test.java:4837:18:4837:61 | newListIteratorWithElement(...) : ListIterator [<element>] : String |
| Test.java:4839:20:4839:22 | out : ListIteratorWrapper [<element>] : String | Test.java:231:19:231:32 | it : ListIteratorWrapper [<element>] : String | Test.java:231:44:231:52 | next(...) : String | Test.java:4839:9:4839:23 | getElement(...) |
| Test.java:4844:42:4844:57 | (...)... : String | Test.java:267:39:267:47 | element : String | Test.java:267:107:267:107 | b : TreeBag [<element>] : String | Test.java:4844:20:4844:58 | newTreeBagWithElement(...) : TreeBag [<element>] : String |
| Test.java:4844:42:4844:57 | (...)... : String | Test.java:267:39:267:47 | element : String | Test.java:267:107:267:107 | b : TreeBag [<element>] : String | Test.java:4844:20:4844:58 | newTreeBagWithElement(...) : TreeBag [<element>] : String |
| Test.java:4846:20:4846:22 | out : LoopingIterator [<element>] : String | Test.java:231:19:231:32 | it : LoopingIterator [<element>] : String | Test.java:231:44:231:52 | next(...) : String | Test.java:4846:9:4846:23 | getElement(...) |
| Test.java:4853:20:4853:22 | out : LoopingListIterator [<element>] : String | Test.java:231:19:231:32 | it : LoopingListIterator [<element>] : String | Test.java:231:44:231:52 | next(...) : String | Test.java:4853:9:4853:23 | getElement(...) |
| Test.java:4860:20:4860:22 | out : ObjectArrayIterator [<element>] : String | Test.java:231:19:231:32 | it : ObjectArrayIterator [<element>] : String | Test.java:231:44:231:52 | next(...) : String | Test.java:4860:9:4860:23 | getElement(...) |
@@ -19229,7 +19043,6 @@ subpaths
| Test.java:5208:41:5208:56 | (...)... : String | Test.java:261:41:261:49 | element : String | Test.java:261:61:261:93 | new MultiKey<T>(...) : MultiKey [<element>] : String | Test.java:5208:18:5208:57 | newMultiKeyWithElement(...) : MultiKey [<element>] : String |
| Test.java:5210:25:5210:27 | out : Object[] [[]] : String | Test.java:229:24:229:32 | array : Object[] [[]] : String | Test.java:229:44:229:51 | ...[...] : String | Test.java:5210:9:5210:28 | getArrayElement(...) |
| Test.java:5215:42:5215:57 | (...)... : String | Test.java:267:39:267:47 | element : String | Test.java:267:107:267:107 | b : TreeBag [<element>] : String | Test.java:5215:20:5215:58 | newTreeBagWithElement(...) : TreeBag [<element>] : String |
| Test.java:5215:42:5215:57 | (...)... : String | Test.java:267:39:267:47 | element : String | Test.java:267:107:267:107 | b : TreeBag [<element>] : String | Test.java:5215:20:5215:58 | newTreeBagWithElement(...) : TreeBag [<element>] : String |
| Test.java:5216:35:5216:36 | in : TreeBag [<element>] : String | Test.java:7204:31:7204:64 | coll : TreeBag [<element>] : String | Test.java:7204:10:7204:29 | parameter this [Return] : MyAbstractLinkedList [<element>] : String | Test.java:5216:10:5216:37 | new MyAbstractLinkedList<>(...) : MyAbstractLinkedList [<element>] : String |
| Test.java:5217:20:5217:22 | out : MyAbstractLinkedList [<element>] : String | Test.java:230:19:230:32 | it : MyAbstractLinkedList [<element>] : String | Test.java:230:44:230:63 | next(...) : String | Test.java:5217:9:5217:23 | getElement(...) |
| Test.java:5224:20:5224:22 | out : AbstractLinkedList [<element>] : Object | Test.java:230:19:230:32 | it : AbstractLinkedList [<element>] : Object | Test.java:230:44:230:63 | next(...) : Object | Test.java:5224:9:5224:23 | getElement(...) |
@@ -19418,24 +19231,19 @@ subpaths
| Test.java:6169:40:6169:55 | (...)... : String | Test.java:297:47:297:53 | value : String | Test.java:297:136:297:136 | m : MultiKeyMap [<map.value>] : String | Test.java:6169:21:6169:56 | newMKMWithMapValue(...) : MultiKeyMap [<map.value>] : String |
| Test.java:6176:42:6176:57 | (...)... : String | Test.java:298:49:298:55 | value : String | Test.java:298:137:298:137 | m : MultiValueMap [<map.value>, <element>] : String | Test.java:6176:23:6176:58 | newMVMWithMapValue(...) : MultiValueMap [<map.value>, <element>] : String |
| Test.java:6176:42:6176:57 | (...)... : String | Test.java:298:49:298:55 | value : String | Test.java:298:137:298:137 | m : MultiValueMap [<map.value>] : String | Test.java:6176:23:6176:58 | newMVMWithMapValue(...) : MultiValueMap [<map.value>] : String |
| Test.java:6176:42:6176:57 | (...)... : String | Test.java:298:49:298:55 | value : String | Test.java:298:137:298:137 | m : MultiValueMap [<map.value>] : String | Test.java:6176:23:6176:58 | newMVMWithMapValue(...) : MultiValueMap [<map.value>] : String |
| Test.java:6178:20:6178:22 | out : Collection [<element>] : Object | Test.java:230:19:230:32 | it : Collection [<element>] : Object | Test.java:230:44:230:63 | next(...) : Object | Test.java:6178:9:6178:23 | getElement(...) |
| Test.java:6178:20:6178:22 | out : Collection [<element>] : String | Test.java:230:19:230:32 | it : Collection [<element>] : String | Test.java:230:44:230:63 | next(...) : String | Test.java:6178:9:6178:23 | getElement(...) |
| Test.java:6183:57:6183:72 | (...)... : String | Test.java:298:49:298:55 | value : String | Test.java:298:137:298:137 | m : MultiValueMap [<map.value>, <element>] : String | Test.java:6183:38:6183:73 | newMVMWithMapValue(...) : MultiValueMap [<map.value>, <element>] : String |
| Test.java:6183:57:6183:72 | (...)... : String | Test.java:298:49:298:55 | value : String | Test.java:298:137:298:137 | m : MultiValueMap [<map.value>] : String | Test.java:6183:38:6183:73 | newMVMWithMapValue(...) : MultiValueMap [<map.value>] : String |
| Test.java:6183:57:6183:72 | (...)... : String | Test.java:298:49:298:55 | value : String | Test.java:298:137:298:137 | m : MultiValueMap [<map.value>] : String | Test.java:6183:38:6183:73 | newMVMWithMapValue(...) : MultiValueMap [<map.value>] : String |
| Test.java:6185:30:6185:44 | getElement(...) : Entry [<map.value>] : Object | Test.java:244:29:244:52 | container : Entry [<map.value>] : Object | Test.java:244:64:244:83 | getValue(...) : Object | Test.java:6185:9:6185:45 | getMapValueFromEntry(...) |
| Test.java:6185:30:6185:44 | getElement(...) : Entry [<map.value>] : String | Test.java:244:29:244:52 | container : Entry [<map.value>] : String | Test.java:244:64:244:83 | getValue(...) : String | Test.java:6185:9:6185:45 | getMapValueFromEntry(...) |
| Test.java:6185:41:6185:43 | out : Iterator [<element>, <map.value>] : Object | Test.java:231:19:231:32 | it : Iterator [<element>, <map.value>] : Object | Test.java:231:44:231:52 | next(...) : Object [<map.value>] : Object | Test.java:6185:30:6185:44 | getElement(...) : Entry [<map.value>] : Object |
| Test.java:6185:41:6185:43 | out : Iterator [<element>, <map.value>] : String | Test.java:231:19:231:32 | it : Iterator [<element>, <map.value>] : String | Test.java:231:44:231:52 | next(...) : Object [<map.value>] : String | Test.java:6185:30:6185:44 | getElement(...) : Entry [<map.value>] : String |
| Test.java:6190:55:6190:70 | (...)... : String | Test.java:279:47:279:51 | key : String | Test.java:279:131:279:131 | m : MultiValueMap [<map.key>] : String | Test.java:6190:38:6190:71 | newMVMWithMapKey(...) : MultiValueMap [<map.key>] : String |
| Test.java:6190:55:6190:70 | (...)... : String | Test.java:279:47:279:51 | key : String | Test.java:279:131:279:131 | m : MultiValueMap [<map.key>] : String | Test.java:6190:38:6190:71 | newMVMWithMapKey(...) : MultiValueMap [<map.key>] : String |
| Test.java:6190:55:6190:70 | (...)... : String | Test.java:279:47:279:51 | key : String | Test.java:279:131:279:131 | m : MultiValueMap [<map.key>] : String | Test.java:6190:38:6190:71 | newMVMWithMapKey(...) : MultiValueMap [<map.key>] : String |
| Test.java:6192:28:6192:42 | getElement(...) : Entry [<map.key>] : String | Test.java:238:27:238:50 | container : Entry [<map.key>] : String | Test.java:238:62:238:79 | getKey(...) : String | Test.java:6192:9:6192:43 | getMapKeyFromEntry(...) |
| Test.java:6192:39:6192:41 | out : Iterator [<element>, <map.key>] : String | Test.java:231:19:231:32 | it : Iterator [<element>, <map.key>] : String | Test.java:231:44:231:52 | next(...) : Object [<map.key>] : String | Test.java:6192:28:6192:42 | getElement(...) : Entry [<map.key>] : String |
| Test.java:6197:57:6197:72 | (...)... : String | Test.java:298:49:298:55 | value : String | Test.java:298:137:298:137 | m : MultiValueMap [<map.value>, <element>] : String | Test.java:6197:38:6197:73 | newMVMWithMapValue(...) : MultiValueMap [<map.value>, <element>] : String |
| Test.java:6197:57:6197:72 | (...)... : String | Test.java:298:49:298:55 | value : String | Test.java:298:137:298:137 | m : MultiValueMap [<map.value>] : String | Test.java:6197:38:6197:73 | newMVMWithMapValue(...) : MultiValueMap [<map.value>] : String |
| Test.java:6197:57:6197:72 | (...)... : String | Test.java:298:49:298:55 | value : String | Test.java:298:137:298:137 | m : MultiValueMap [<map.value>] : String | Test.java:6197:38:6197:73 | newMVMWithMapValue(...) : MultiValueMap [<map.value>] : String |
| Test.java:6199:20:6199:22 | out : Iterator [<element>] : Object | Test.java:231:19:231:32 | it : Iterator [<element>] : Object | Test.java:231:44:231:52 | next(...) : Object | Test.java:6199:9:6199:23 | getElement(...) |
| Test.java:6199:20:6199:22 | out : Iterator [<element>] : String | Test.java:231:19:231:32 | it : Iterator [<element>] : String | Test.java:231:44:231:52 | next(...) : String | Test.java:6199:9:6199:23 | getElement(...) |
| Test.java:6204:47:6204:62 | (...)... : String | Test.java:269:37:269:45 | element : String | Test.java:269:103:269:103 | v : Vector [<element>] : String | Test.java:6204:26:6204:63 | newVectorWithElement(...) : Vector [<element>] : String |
@@ -19452,7 +19260,6 @@ subpaths
| Test.java:6241:19:6241:21 | out : MultiValueMap [<map.key>] : String | Test.java:228:18:228:29 | map : MultiValueMap [<map.key>] : String | Test.java:228:41:228:70 | next(...) : String | Test.java:6241:9:6241:22 | getMapKey(...) |
| Test.java:6246:32:6246:47 | (...)... : String | Test.java:298:49:298:55 | value : String | Test.java:298:137:298:137 | m : MultiValueMap [<map.value>, <element>] : String | Test.java:6246:13:6246:48 | newMVMWithMapValue(...) : MultiValueMap [<map.value>, <element>] : String |
| Test.java:6246:32:6246:47 | (...)... : String | Test.java:298:49:298:55 | value : String | Test.java:298:137:298:137 | m : MultiValueMap [<map.value>] : String | Test.java:6246:13:6246:48 | newMVMWithMapValue(...) : MultiValueMap [<map.value>] : String |
| Test.java:6246:32:6246:47 | (...)... : String | Test.java:298:49:298:55 | value : String | Test.java:298:137:298:137 | m : MultiValueMap [<map.value>] : String | Test.java:6246:13:6246:48 | newMVMWithMapValue(...) : MultiValueMap [<map.value>] : String |
| Test.java:6248:20:6248:47 | (...)... : Collection [<element>] : Object | Test.java:230:19:230:32 | it : Collection [<element>] : Object | Test.java:230:44:230:63 | next(...) : Object | Test.java:6248:9:6248:48 | getElement(...) |
| Test.java:6248:20:6248:47 | (...)... : Collection [<element>] : String | Test.java:230:19:230:32 | it : Collection [<element>] : String | Test.java:230:44:230:63 | next(...) : String | Test.java:6248:9:6248:48 | getElement(...) |
| Test.java:6248:44:6248:46 | out : MultiValueMap [<map.value>, <element>] : Object | Test.java:232:20:232:31 | map : MultiValueMap [<map.value>, <element>] : Object | Test.java:232:43:232:55 | get(...) : Object [<element>] : Object | Test.java:6248:32:6248:47 | getMapValue(...) : Object [<element>] : Object |
@@ -19463,12 +19270,10 @@ subpaths
| Test.java:6255:44:6255:46 | out : MultiValueMap [<map.value>] : Object | Test.java:232:20:232:31 | map : MultiValueMap [<map.value>] : Object | Test.java:232:43:232:55 | get(...) : Object | Test.java:6255:32:6255:47 | getMapValue(...) : Object |
| Test.java:6262:19:6262:21 | out : MultiValueMap [<map.key>] : Object | Test.java:228:18:228:29 | map : MultiValueMap [<map.key>] : Object | Test.java:228:41:228:70 | next(...) : Object | Test.java:6262:9:6262:22 | getMapKey(...) |
| Test.java:6267:42:6267:57 | (...)... : String | Test.java:267:39:267:47 | element : String | Test.java:267:107:267:107 | b : TreeBag [<element>] : String | Test.java:6267:20:6267:58 | newTreeBagWithElement(...) : TreeBag [<element>] : String |
| Test.java:6267:42:6267:57 | (...)... : String | Test.java:267:39:267:47 | element : String | Test.java:267:107:267:107 | b : TreeBag [<element>] : String | Test.java:6267:20:6267:58 | newTreeBagWithElement(...) : TreeBag [<element>] : String |
| Test.java:6269:20:6269:47 | (...)... : Collection [<element>] : String | Test.java:230:19:230:32 | it : Collection [<element>] : String | Test.java:230:44:230:63 | next(...) : String | Test.java:6269:9:6269:48 | getElement(...) |
| Test.java:6269:44:6269:46 | out : MultiValueMap [<map.value>, <element>] : String | Test.java:232:20:232:31 | map : MultiValueMap [<map.value>, <element>] : String | Test.java:232:43:232:55 | get(...) : Object [<element>] : String | Test.java:6269:32:6269:47 | getMapValue(...) : Object [<element>] : String |
| Test.java:6274:42:6274:57 | (...)... : String | Test.java:298:49:298:55 | value : String | Test.java:298:137:298:137 | m : MultiValueMap [<map.value>, <element>] : String | Test.java:6274:23:6274:58 | newMVMWithMapValue(...) : MultiValueMap [<map.value>, <element>] : String |
| Test.java:6274:42:6274:57 | (...)... : String | Test.java:298:49:298:55 | value : String | Test.java:298:137:298:137 | m : MultiValueMap [<map.value>] : String | Test.java:6274:23:6274:58 | newMVMWithMapValue(...) : MultiValueMap [<map.value>] : String |
| Test.java:6274:42:6274:57 | (...)... : String | Test.java:298:49:298:55 | value : String | Test.java:298:137:298:137 | m : MultiValueMap [<map.value>] : String | Test.java:6274:23:6274:58 | newMVMWithMapValue(...) : MultiValueMap [<map.value>] : String |
| Test.java:6276:20:6276:22 | out : Collection [<element>] : Object | Test.java:230:19:230:32 | it : Collection [<element>] : Object | Test.java:230:44:230:63 | next(...) : Object | Test.java:6276:9:6276:23 | getElement(...) |
| Test.java:6276:20:6276:22 | out : Collection [<element>] : String | Test.java:230:19:230:32 | it : Collection [<element>] : String | Test.java:230:44:230:63 | next(...) : String | Test.java:6276:9:6276:23 | getElement(...) |
| Test.java:6283:19:6283:21 | out : PassiveExpiringMap [<map.key>] : String | Test.java:228:18:228:29 | map : PassiveExpiringMap [<map.key>] : String | Test.java:228:41:228:70 | next(...) : String | Test.java:6283:9:6283:22 | getMapKey(...) |
@@ -19549,19 +19354,14 @@ subpaths
| Test.java:6589:43:6589:58 | (...)... : String | Test.java:272:58:272:62 | key : String | Test.java:272:160:272:160 | m : ArrayListValuedHashMap [<map.key>] : String | Test.java:6589:24:6589:59 | newALVHMWithMapKey(...) : ArrayListValuedHashMap [<map.key>] : String |
| Test.java:6591:19:6591:21 | out : UnmodifiableMultiValuedMap [<map.key>] : String | Test.java:240:18:240:46 | container : UnmodifiableMultiValuedMap [<map.key>] : String | Test.java:240:58:240:93 | next(...) : String | Test.java:6591:9:6591:22 | getMapKey(...) |
| Test.java:6596:42:6596:57 | (...)... : String | Test.java:267:39:267:47 | element : String | Test.java:267:107:267:107 | b : TreeBag [<element>] : String | Test.java:6596:20:6596:58 | newTreeBagWithElement(...) : TreeBag [<element>] : String |
| Test.java:6596:42:6596:57 | (...)... : String | Test.java:267:39:267:47 | element : String | Test.java:267:107:267:107 | b : TreeBag [<element>] : String | Test.java:6596:20:6596:58 | newTreeBagWithElement(...) : TreeBag [<element>] : String |
| Test.java:6598:20:6598:22 | out : HashMultiSet [<element>] : String | Test.java:230:19:230:32 | it : HashMultiSet [<element>] : String | Test.java:230:44:230:63 | next(...) : String | Test.java:6598:9:6598:23 | getElement(...) |
| Test.java:6603:45:6603:60 | (...)... : String | Test.java:258:49:258:57 | element : String | Test.java:258:127:258:127 | x : HashMultiSet [<element>] : String | Test.java:6603:18:6603:61 | newHashMultiSetWithElement(...) : HashMultiSet [<element>] : String |
| Test.java:6603:45:6603:60 | (...)... : String | Test.java:258:49:258:57 | element : String | Test.java:258:127:258:127 | x : HashMultiSet [<element>] : String | Test.java:6603:18:6603:61 | newHashMultiSetWithElement(...) : HashMultiSet [<element>] : String |
| Test.java:6605:20:6605:22 | out : PredicatedMultiSet [<element>] : String | Test.java:230:19:230:32 | it : PredicatedMultiSet [<element>] : String | Test.java:230:44:230:63 | next(...) : String | Test.java:6605:9:6605:23 | getElement(...) |
| Test.java:6610:45:6610:60 | (...)... : String | Test.java:258:49:258:57 | element : String | Test.java:258:127:258:127 | x : HashMultiSet [<element>] : String | Test.java:6610:18:6610:61 | newHashMultiSetWithElement(...) : HashMultiSet [<element>] : String |
| Test.java:6610:45:6610:60 | (...)... : String | Test.java:258:49:258:57 | element : String | Test.java:258:127:258:127 | x : HashMultiSet [<element>] : String | Test.java:6610:18:6610:61 | newHashMultiSetWithElement(...) : HashMultiSet [<element>] : String |
| Test.java:6612:20:6612:22 | out : SynchronizedMultiSet [<element>] : String | Test.java:230:19:230:32 | it : SynchronizedMultiSet [<element>] : String | Test.java:230:44:230:63 | next(...) : String | Test.java:6612:9:6612:23 | getElement(...) |
| Test.java:6617:45:6617:60 | (...)... : String | Test.java:258:49:258:57 | element : String | Test.java:258:127:258:127 | x : HashMultiSet [<element>] : String | Test.java:6617:18:6617:61 | newHashMultiSetWithElement(...) : HashMultiSet [<element>] : String |
| Test.java:6617:45:6617:60 | (...)... : String | Test.java:258:49:258:57 | element : String | Test.java:258:127:258:127 | x : HashMultiSet [<element>] : String | Test.java:6617:18:6617:61 | newHashMultiSetWithElement(...) : HashMultiSet [<element>] : String |
| Test.java:6619:20:6619:22 | out : MultiSet [<element>] : String | Test.java:230:19:230:32 | it : MultiSet [<element>] : String | Test.java:230:44:230:63 | next(...) : String | Test.java:6619:9:6619:23 | getElement(...) |
| Test.java:6688:42:6688:57 | (...)... : String | Test.java:267:39:267:47 | element : String | Test.java:267:107:267:107 | b : TreeBag [<element>] : String | Test.java:6688:20:6688:58 | newTreeBagWithElement(...) : TreeBag [<element>] : String |
| Test.java:6688:42:6688:57 | (...)... : String | Test.java:267:39:267:47 | element : String | Test.java:267:107:267:107 | b : TreeBag [<element>] : String | Test.java:6688:20:6688:58 | newTreeBagWithElement(...) : TreeBag [<element>] : String |
| Test.java:6690:20:6690:22 | out : CircularFifoQueue [<element>] : String | Test.java:230:19:230:32 | it : CircularFifoQueue [<element>] : String | Test.java:230:44:230:63 | next(...) : String | Test.java:6690:9:6690:23 | getElement(...) |
| Test.java:6695:59:6695:74 | (...)... : String | Test.java:253:59:253:67 | element : String | Test.java:253:147:253:147 | x : CircularFifoQueue [<element>] : String | Test.java:6695:27:6695:75 | newCircularFifoQueueWithElement(...) : CircularFifoQueue [<element>] : String |
| Test.java:6702:47:6702:62 | (...)... : String | Test.java:253:59:253:67 | element : String | Test.java:253:147:253:147 | x : CircularFifoQueue [<element>] : String | Test.java:6702:15:6702:63 | newCircularFifoQueueWithElement(...) : CircularFifoQueue [<element>] : String |
@@ -19585,10 +19385,8 @@ subpaths
| Test.java:6762:20:6762:34 | getElement(...) : Set [<element>] : Object | Test.java:230:19:230:32 | it : Set [<element>] : Object | Test.java:230:44:230:63 | next(...) : Object | Test.java:6762:9:6762:35 | getElement(...) |
| Test.java:6762:31:6762:33 | out : List [<element>, <element>] : Object | Test.java:230:19:230:32 | it : List [<element>, <element>] : Object | Test.java:230:44:230:63 | next(...) : Object [<element>] : Object | Test.java:6762:20:6762:34 | getElement(...) : Set [<element>] : Object |
| Test.java:6767:42:6767:57 | (...)... : String | Test.java:267:39:267:47 | element : String | Test.java:267:107:267:107 | b : TreeBag [<element>] : String | Test.java:6767:20:6767:58 | newTreeBagWithElement(...) : TreeBag [<element>] : String |
| Test.java:6767:42:6767:57 | (...)... : String | Test.java:267:39:267:47 | element : String | Test.java:267:107:267:107 | b : TreeBag [<element>] : String | Test.java:6767:20:6767:58 | newTreeBagWithElement(...) : TreeBag [<element>] : String |
| Test.java:6770:20:6770:22 | out : CompositeSet [<element>] : String | Test.java:230:19:230:32 | it : CompositeSet [<element>] : String | Test.java:230:44:230:63 | next(...) : String | Test.java:6770:9:6770:23 | getElement(...) |
| Test.java:6775:42:6775:57 | (...)... : String | Test.java:267:39:267:47 | element : String | Test.java:267:107:267:107 | b : TreeBag [<element>] : String | Test.java:6775:20:6775:58 | newTreeBagWithElement(...) : TreeBag [<element>] : String |
| Test.java:6775:42:6775:57 | (...)... : String | Test.java:267:39:267:47 | element : String | Test.java:267:107:267:107 | b : TreeBag [<element>] : String | Test.java:6775:20:6775:58 | newTreeBagWithElement(...) : TreeBag [<element>] : String |
| Test.java:6778:20:6778:34 | getElement(...) : Set [<element>] : String | Test.java:230:19:230:32 | it : Set [<element>] : String | Test.java:230:44:230:63 | next(...) : String | Test.java:6778:9:6778:35 | getElement(...) |
| Test.java:6778:31:6778:33 | out : List [<element>, <element>] : String | Test.java:230:19:230:32 | it : List [<element>, <element>] : String | Test.java:230:44:230:63 | next(...) : Object [<element>] : String | Test.java:6778:20:6778:34 | getElement(...) : Set [<element>] : String |
| Test.java:6783:42:6783:57 | (...)... : String | Test.java:260:53:260:61 | element : String | Test.java:260:135:260:135 | x : ListOrderedSet [<element>] : String | Test.java:6783:13:6783:58 | newListOrderedSetWithElement(...) : ListOrderedSet [<element>] : String |
@@ -19643,19 +19441,13 @@ subpaths
| Test.java:6988:19:6988:21 | out : PatriciaTrie [<map.key>] : String | Test.java:228:18:228:29 | map : PatriciaTrie [<map.key>] : String | Test.java:228:41:228:70 | next(...) : String | Test.java:6988:9:6988:22 | getMapKey(...) |
| Test.java:6995:21:6995:23 | out : PatriciaTrie [<map.value>] : String | Test.java:232:20:232:31 | map : PatriciaTrie [<map.value>] : String | Test.java:232:43:232:55 | get(...) : String | Test.java:6995:9:6995:24 | getMapValue(...) |
| Test.java:6999:56:6999:71 | (...)... : String | Test.java:288:49:288:58 | key : String | Test.java:288:134:288:134 | m : PatriciaTrie [<map.key>] : String | Test.java:6999:30:6999:72 | newPatriciaTrieWithMapKey(...) : PatriciaTrie [<map.key>] : String |
| Test.java:6999:56:6999:71 | (...)... : String | Test.java:288:49:288:58 | key : String | Test.java:288:134:288:134 | m : PatriciaTrie [<map.key>] : String | Test.java:6999:30:6999:72 | newPatriciaTrieWithMapKey(...) : PatriciaTrie [<map.key>] : String |
| Test.java:7002:28:7002:30 | out : Entry [<map.key>] : String | Test.java:238:27:238:50 | container : Entry [<map.key>] : String | Test.java:238:62:238:79 | getKey(...) : String | Test.java:7002:9:7002:31 | getMapKeyFromEntry(...) |
| Test.java:7006:58:7006:73 | (...)... : String | Test.java:307:50:307:56 | value : String | Test.java:307:129:307:129 | m : PatriciaTrie [<map.value>] : String | Test.java:7006:30:7006:74 | newPatriciaTrieWithMapValue(...) : PatriciaTrie [<map.value>] : String |
| Test.java:7006:58:7006:73 | (...)... : String | Test.java:307:50:307:56 | value : String | Test.java:307:129:307:129 | m : PatriciaTrie [<map.value>] : String | Test.java:7006:30:7006:74 | newPatriciaTrieWithMapValue(...) : PatriciaTrie [<map.value>] : String |
| Test.java:7009:30:7009:32 | out : Entry [<map.value>] : String | Test.java:244:29:244:52 | container : Entry [<map.value>] : String | Test.java:244:64:244:83 | getValue(...) : String | Test.java:7009:9:7009:33 | getMapValueFromEntry(...) |
| Test.java:7013:56:7013:71 | (...)... : String | Test.java:288:49:288:58 | key : String | Test.java:288:134:288:134 | m : PatriciaTrie [<map.key>] : String | Test.java:7013:30:7013:72 | newPatriciaTrieWithMapKey(...) : PatriciaTrie [<map.key>] : String |
| Test.java:7013:56:7013:71 | (...)... : String | Test.java:288:49:288:58 | key : String | Test.java:288:134:288:134 | m : PatriciaTrie [<map.key>] : String | Test.java:7013:30:7013:72 | newPatriciaTrieWithMapKey(...) : PatriciaTrie [<map.key>] : String |
| Test.java:7020:58:7020:73 | (...)... : String | Test.java:307:50:307:56 | value : String | Test.java:307:129:307:129 | m : PatriciaTrie [<map.value>] : String | Test.java:7020:30:7020:74 | newPatriciaTrieWithMapValue(...) : PatriciaTrie [<map.value>] : String |
| Test.java:7020:58:7020:73 | (...)... : String | Test.java:307:50:307:56 | value : String | Test.java:307:129:307:129 | m : PatriciaTrie [<map.value>] : String | Test.java:7020:30:7020:74 | newPatriciaTrieWithMapValue(...) : PatriciaTrie [<map.value>] : String |
| Test.java:7028:40:7028:55 | (...)... : String | Test.java:288:49:288:58 | key : String | Test.java:288:134:288:134 | m : PatriciaTrie [<map.key>] : String | Test.java:7028:14:7028:56 | newPatriciaTrieWithMapKey(...) : PatriciaTrie [<map.key>] : String |
| Test.java:7028:40:7028:55 | (...)... : String | Test.java:288:49:288:58 | key : String | Test.java:288:134:288:134 | m : PatriciaTrie [<map.key>] : String | Test.java:7028:14:7028:56 | newPatriciaTrieWithMapKey(...) : PatriciaTrie [<map.key>] : String |
| Test.java:7030:19:7030:21 | out : Trie [<map.key>] : String | Test.java:228:18:228:29 | map : Trie [<map.key>] : String | Test.java:228:41:228:70 | next(...) : String | Test.java:7030:9:7030:22 | getMapKey(...) |
| Test.java:7035:42:7035:57 | (...)... : String | Test.java:307:50:307:56 | value : String | Test.java:307:129:307:129 | m : PatriciaTrie [<map.value>] : String | Test.java:7035:14:7035:58 | newPatriciaTrieWithMapValue(...) : PatriciaTrie [<map.value>] : String |
| Test.java:7035:42:7035:57 | (...)... : String | Test.java:307:50:307:56 | value : String | Test.java:307:129:307:129 | m : PatriciaTrie [<map.value>] : String | Test.java:7035:14:7035:58 | newPatriciaTrieWithMapValue(...) : PatriciaTrie [<map.value>] : String |
| Test.java:7037:21:7037:23 | out : Trie [<map.value>] : String | Test.java:232:20:232:31 | map : Trie [<map.value>] : String | Test.java:232:43:232:55 | get(...) : String | Test.java:7037:9:7037:24 | getMapValue(...) |
testFailures

View File

@@ -745,12 +745,9 @@ edges
| ArrayUtilsTest.java:68:27:68:57 | {...} : int[] [[]] : Number | ArrayUtilsTest.java:69:56:69:66 | taintedInts : int[] [[]] : Number | provenance | |
| ArrayUtilsTest.java:68:39:68:55 | taint(...) : Number | ArrayUtilsTest.java:68:27:68:57 | {...} : int[] [[]] : Number | provenance | |
| ArrayUtilsTest.java:69:36:69:67 | toObject(...) : Integer[] [[]] : Number | ArrayUtilsTest.java:70:12:70:27 | taintedBoxedInts | provenance | |
| ArrayUtilsTest.java:69:36:69:67 | toObject(...) : Integer[] [[]] : Number | ArrayUtilsTest.java:71:35:71:50 | taintedBoxedInts : Integer[] | provenance | |
| ArrayUtilsTest.java:69:36:69:67 | toObject(...) : Integer[] [[]] : Number | ArrayUtilsTest.java:71:35:71:50 | taintedBoxedInts : Integer[] [[]] : Number | provenance | |
| ArrayUtilsTest.java:69:56:69:66 | taintedInts : int[] [[]] : Number | ArrayUtilsTest.java:69:36:69:67 | toObject(...) : Integer[] [[]] : Number | provenance | MaD:53 |
| ArrayUtilsTest.java:71:12:71:51 | toPrimitive(...) : int[] [[]] : Number | ArrayUtilsTest.java:71:12:71:51 | toPrimitive(...) | provenance | |
| ArrayUtilsTest.java:71:12:71:51 | toPrimitive(...) : int[] [[]] : Object | ArrayUtilsTest.java:71:12:71:51 | toPrimitive(...) | provenance | |
| ArrayUtilsTest.java:71:35:71:50 | taintedBoxedInts : Integer[] | ArrayUtilsTest.java:71:12:71:51 | toPrimitive(...) : int[] [[]] : Object | provenance | MaD:54 |
| ArrayUtilsTest.java:71:35:71:50 | taintedBoxedInts : Integer[] [[]] : Number | ArrayUtilsTest.java:71:12:71:51 | toPrimitive(...) : int[] [[]] : Number | provenance | MaD:54 |
| ArrayUtilsTest.java:72:12:72:70 | toPrimitive(...) : int[] [[]] : Number | ArrayUtilsTest.java:72:12:72:70 | toPrimitive(...) | provenance | |
| ArrayUtilsTest.java:72:53:72:69 | taint(...) : Number | ArrayUtilsTest.java:72:12:72:70 | toPrimitive(...) : int[] [[]] : Number | provenance | MaD:55 |
@@ -3434,8 +3431,6 @@ nodes
| ArrayUtilsTest.java:70:12:70:27 | taintedBoxedInts | semmle.label | taintedBoxedInts |
| ArrayUtilsTest.java:71:12:71:51 | toPrimitive(...) | semmle.label | toPrimitive(...) |
| ArrayUtilsTest.java:71:12:71:51 | toPrimitive(...) : int[] [[]] : Number | semmle.label | toPrimitive(...) : int[] [[]] : Number |
| ArrayUtilsTest.java:71:12:71:51 | toPrimitive(...) : int[] [[]] : Object | semmle.label | toPrimitive(...) : int[] [[]] : Object |
| ArrayUtilsTest.java:71:35:71:50 | taintedBoxedInts : Integer[] | semmle.label | taintedBoxedInts : Integer[] |
| ArrayUtilsTest.java:71:35:71:50 | taintedBoxedInts : Integer[] [[]] : Number | semmle.label | taintedBoxedInts : Integer[] [[]] : Number |
| ArrayUtilsTest.java:72:12:72:70 | toPrimitive(...) | semmle.label | toPrimitive(...) |
| ArrayUtilsTest.java:72:12:72:70 | toPrimitive(...) : int[] [[]] : Number | semmle.label | toPrimitive(...) : int[] [[]] : Number |

View File

@@ -312,13 +312,8 @@ nodes
| Test.java:21:10:21:18 | container : MutablePropertyValues [<element>] : PropertyValue | semmle.label | container : MutablePropertyValues [<element>] : PropertyValue |
| Test.java:21:10:21:39 | getPropertyValue(...) : PropertyValue | semmle.label | getPropertyValue(...) : PropertyValue |
| Test.java:21:10:21:39 | getPropertyValue(...) : PropertyValue | semmle.label | getPropertyValue(...) : PropertyValue |
| Test.java:21:10:21:39 | getPropertyValue(...) : PropertyValue | semmle.label | getPropertyValue(...) : PropertyValue |
| Test.java:21:10:21:39 | getPropertyValue(...) : PropertyValue | semmle.label | getPropertyValue(...) : PropertyValue |
| Test.java:21:10:21:39 | getPropertyValue(...) : PropertyValue [<map.key>] : Object | semmle.label | getPropertyValue(...) : PropertyValue [<map.key>] : Object |
| Test.java:21:10:21:39 | getPropertyValue(...) : PropertyValue [<map.key>] : Object | semmle.label | getPropertyValue(...) : PropertyValue [<map.key>] : Object |
| Test.java:21:10:21:39 | getPropertyValue(...) : PropertyValue [<map.key>] : String | semmle.label | getPropertyValue(...) : PropertyValue [<map.key>] : String |
| Test.java:21:10:21:39 | getPropertyValue(...) : PropertyValue [<map.key>] : String | semmle.label | getPropertyValue(...) : PropertyValue [<map.key>] : String |
| Test.java:21:10:21:39 | getPropertyValue(...) : PropertyValue [<map.value>] : Object | semmle.label | getPropertyValue(...) : PropertyValue [<map.value>] : Object |
| Test.java:21:10:21:39 | getPropertyValue(...) : PropertyValue [<map.value>] : Object | semmle.label | getPropertyValue(...) : PropertyValue [<map.value>] : Object |
| Test.java:24:26:24:48 | container : PropertyValue [<map.key>] : Object | semmle.label | container : PropertyValue [<map.key>] : Object |
| Test.java:24:26:24:48 | container : PropertyValue [<map.key>] : String | semmle.label | container : PropertyValue [<map.key>] : String |
@@ -540,39 +535,27 @@ nodes
| Test.java:279:25:279:27 | out : PropertyValue[] [[]] : PropertyValue | semmle.label | out : PropertyValue[] [[]] : PropertyValue |
subpaths
| Test.java:57:27:57:29 | out : MutablePropertyValues [<element>] : Object | Test.java:20:34:20:64 | container : MutablePropertyValues [<element>] : Object | Test.java:21:10:21:39 | getPropertyValue(...) : PropertyValue | Test.java:57:9:57:30 | getElementDefault(...) |
| Test.java:57:27:57:29 | out : MutablePropertyValues [<element>] : Object | Test.java:20:34:20:64 | container : MutablePropertyValues [<element>] : Object | Test.java:21:10:21:39 | getPropertyValue(...) : PropertyValue | Test.java:57:9:57:30 | getElementDefault(...) |
| Test.java:64:26:64:47 | getElementDefault(...) : PropertyValue [<map.key>] : Object | Test.java:24:26:24:48 | container : PropertyValue [<map.key>] : Object | Test.java:25:10:25:28 | getName(...) : String | Test.java:64:9:64:48 | getMapKeyDefault(...) |
| Test.java:64:44:64:46 | out : MutablePropertyValues [<element>, <map.key>] : Object | Test.java:20:34:20:64 | container : MutablePropertyValues [<element>, <map.key>] : Object | Test.java:21:10:21:39 | getPropertyValue(...) : PropertyValue [<map.key>] : Object | Test.java:64:26:64:47 | getElementDefault(...) : PropertyValue [<map.key>] : Object |
| Test.java:64:44:64:46 | out : MutablePropertyValues [<element>, <map.key>] : Object | Test.java:20:34:20:64 | container : MutablePropertyValues [<element>, <map.key>] : Object | Test.java:21:10:21:39 | getPropertyValue(...) : PropertyValue [<map.key>] : Object | Test.java:64:26:64:47 | getElementDefault(...) : PropertyValue [<map.key>] : Object |
| Test.java:71:28:71:49 | getElementDefault(...) : PropertyValue [<map.value>] : Object | Test.java:28:28:28:50 | container : PropertyValue [<map.value>] : Object | Test.java:29:10:29:29 | getValue(...) : Object | Test.java:71:9:71:50 | getMapValueDefault(...) |
| Test.java:71:46:71:48 | out : MutablePropertyValues [<element>, <map.value>] : Object | Test.java:20:34:20:64 | container : MutablePropertyValues [<element>, <map.value>] : Object | Test.java:21:10:21:39 | getPropertyValue(...) : PropertyValue [<map.value>] : Object | Test.java:71:28:71:49 | getElementDefault(...) : PropertyValue [<map.value>] : Object |
| Test.java:71:46:71:48 | out : MutablePropertyValues [<element>, <map.value>] : Object | Test.java:20:34:20:64 | container : MutablePropertyValues [<element>, <map.value>] : Object | Test.java:21:10:21:39 | getPropertyValue(...) : PropertyValue [<map.value>] : Object | Test.java:71:28:71:49 | getElementDefault(...) : PropertyValue [<map.value>] : Object |
| Test.java:76:60:76:83 | (...)... : PropertyValue | Test.java:32:60:32:80 | element : PropertyValue | Test.java:33:10:33:52 | new MutablePropertyValues(...) : MutablePropertyValues [<element>] : PropertyValue | Test.java:76:24:76:84 | newMutablePropertyValuesWithElement(...) : MutablePropertyValues [<element>] : PropertyValue |
| Test.java:78:27:78:29 | out : MutablePropertyValues [<element>] : PropertyValue | Test.java:20:34:20:64 | container : MutablePropertyValues [<element>] : PropertyValue | Test.java:21:10:21:39 | getPropertyValue(...) : PropertyValue | Test.java:78:9:78:30 | getElementDefault(...) |
| Test.java:78:27:78:29 | out : MutablePropertyValues [<element>] : PropertyValue | Test.java:20:34:20:64 | container : MutablePropertyValues [<element>] : PropertyValue | Test.java:21:10:21:39 | getPropertyValue(...) : PropertyValue | Test.java:78:9:78:30 | getElementDefault(...) |
| Test.java:92:26:92:47 | getElementDefault(...) : PropertyValue [<map.key>] : String | Test.java:24:26:24:48 | container : PropertyValue [<map.key>] : String | Test.java:25:10:25:28 | getName(...) : String | Test.java:92:9:92:48 | getMapKeyDefault(...) |
| Test.java:92:44:92:46 | out : MutablePropertyValues [<element>, <map.key>] : String | Test.java:20:34:20:64 | container : MutablePropertyValues [<element>, <map.key>] : String | Test.java:21:10:21:39 | getPropertyValue(...) : PropertyValue [<map.key>] : String | Test.java:92:26:92:47 | getElementDefault(...) : PropertyValue [<map.key>] : String |
| Test.java:92:44:92:46 | out : MutablePropertyValues [<element>, <map.key>] : String | Test.java:20:34:20:64 | container : MutablePropertyValues [<element>, <map.key>] : String | Test.java:21:10:21:39 | getPropertyValue(...) : PropertyValue [<map.key>] : String | Test.java:92:26:92:47 | getElementDefault(...) : PropertyValue [<map.key>] : String |
| Test.java:99:28:99:49 | getElementDefault(...) : PropertyValue [<map.value>] : Object | Test.java:28:28:28:50 | container : PropertyValue [<map.value>] : Object | Test.java:29:10:29:29 | getValue(...) : Object | Test.java:99:9:99:50 | getMapValueDefault(...) |
| Test.java:99:46:99:48 | out : MutablePropertyValues [<element>, <map.value>] : Object | Test.java:20:34:20:64 | container : MutablePropertyValues [<element>, <map.value>] : Object | Test.java:21:10:21:39 | getPropertyValue(...) : PropertyValue [<map.value>] : Object | Test.java:99:28:99:49 | getElementDefault(...) : PropertyValue [<map.value>] : Object |
| Test.java:99:46:99:48 | out : MutablePropertyValues [<element>, <map.value>] : Object | Test.java:20:34:20:64 | container : MutablePropertyValues [<element>, <map.value>] : Object | Test.java:21:10:21:39 | getPropertyValue(...) : PropertyValue [<map.value>] : Object | Test.java:99:28:99:49 | getElementDefault(...) : PropertyValue [<map.value>] : Object |
| Test.java:113:27:113:29 | out : MutablePropertyValues [<element>] : PropertyValue | Test.java:20:34:20:64 | container : MutablePropertyValues [<element>] : PropertyValue | Test.java:21:10:21:39 | getPropertyValue(...) : PropertyValue | Test.java:113:9:113:30 | getElementDefault(...) |
| Test.java:113:27:113:29 | out : MutablePropertyValues [<element>] : PropertyValue | Test.java:20:34:20:64 | container : MutablePropertyValues [<element>] : PropertyValue | Test.java:21:10:21:39 | getPropertyValue(...) : PropertyValue | Test.java:113:9:113:30 | getElementDefault(...) |
| Test.java:120:26:120:47 | getElementDefault(...) : PropertyValue [<map.key>] : String | Test.java:24:26:24:48 | container : PropertyValue [<map.key>] : String | Test.java:25:10:25:28 | getName(...) : String | Test.java:120:9:120:48 | getMapKeyDefault(...) |
| Test.java:120:44:120:46 | out : MutablePropertyValues [<element>, <map.key>] : String | Test.java:20:34:20:64 | container : MutablePropertyValues [<element>, <map.key>] : String | Test.java:21:10:21:39 | getPropertyValue(...) : PropertyValue [<map.key>] : String | Test.java:120:26:120:47 | getElementDefault(...) : PropertyValue [<map.key>] : String |
| Test.java:120:44:120:46 | out : MutablePropertyValues [<element>, <map.key>] : String | Test.java:20:34:20:64 | container : MutablePropertyValues [<element>, <map.key>] : String | Test.java:21:10:21:39 | getPropertyValue(...) : PropertyValue [<map.key>] : String | Test.java:120:26:120:47 | getElementDefault(...) : PropertyValue [<map.key>] : String |
| Test.java:127:28:127:49 | getElementDefault(...) : PropertyValue [<map.value>] : Object | Test.java:28:28:28:50 | container : PropertyValue [<map.value>] : Object | Test.java:29:10:29:29 | getValue(...) : Object | Test.java:127:9:127:50 | getMapValueDefault(...) |
| Test.java:127:46:127:48 | out : MutablePropertyValues [<element>, <map.value>] : Object | Test.java:20:34:20:64 | container : MutablePropertyValues [<element>, <map.value>] : Object | Test.java:21:10:21:39 | getPropertyValue(...) : PropertyValue [<map.value>] : Object | Test.java:127:28:127:49 | getElementDefault(...) : PropertyValue [<map.value>] : Object |
| Test.java:127:46:127:48 | out : MutablePropertyValues [<element>, <map.value>] : Object | Test.java:20:34:20:64 | container : MutablePropertyValues [<element>, <map.value>] : Object | Test.java:21:10:21:39 | getPropertyValue(...) : PropertyValue [<map.value>] : Object | Test.java:127:28:127:49 | getElementDefault(...) : PropertyValue [<map.value>] : Object |
| Test.java:141:26:141:47 | getElementDefault(...) : PropertyValue [<map.key>] : Object | Test.java:24:26:24:48 | container : PropertyValue [<map.key>] : Object | Test.java:25:10:25:28 | getName(...) : String | Test.java:141:9:141:48 | getMapKeyDefault(...) |
| Test.java:141:44:141:46 | out : MutablePropertyValues [<element>, <map.key>] : Object | Test.java:20:34:20:64 | container : MutablePropertyValues [<element>, <map.key>] : Object | Test.java:21:10:21:39 | getPropertyValue(...) : PropertyValue [<map.key>] : Object | Test.java:141:26:141:47 | getElementDefault(...) : PropertyValue [<map.key>] : Object |
| Test.java:141:44:141:46 | out : MutablePropertyValues [<element>, <map.key>] : Object | Test.java:20:34:20:64 | container : MutablePropertyValues [<element>, <map.key>] : Object | Test.java:21:10:21:39 | getPropertyValue(...) : PropertyValue [<map.key>] : Object | Test.java:141:26:141:47 | getElementDefault(...) : PropertyValue [<map.key>] : Object |
| Test.java:148:28:148:49 | getElementDefault(...) : PropertyValue [<map.value>] : Object | Test.java:28:28:28:50 | container : PropertyValue [<map.value>] : Object | Test.java:29:10:29:29 | getValue(...) : Object | Test.java:148:9:148:50 | getMapValueDefault(...) |
| Test.java:148:46:148:48 | out : MutablePropertyValues [<element>, <map.value>] : Object | Test.java:20:34:20:64 | container : MutablePropertyValues [<element>, <map.value>] : Object | Test.java:21:10:21:39 | getPropertyValue(...) : PropertyValue [<map.value>] : Object | Test.java:148:28:148:49 | getElementDefault(...) : PropertyValue [<map.value>] : Object |
| Test.java:148:46:148:48 | out : MutablePropertyValues [<element>, <map.value>] : Object | Test.java:20:34:20:64 | container : MutablePropertyValues [<element>, <map.value>] : Object | Test.java:21:10:21:39 | getPropertyValue(...) : PropertyValue [<map.value>] : Object | Test.java:148:28:148:49 | getElementDefault(...) : PropertyValue [<map.value>] : Object |
| Test.java:160:60:160:83 | (...)... : PropertyValue | Test.java:32:60:32:80 | element : PropertyValue | Test.java:33:10:33:52 | new MutablePropertyValues(...) : MutablePropertyValues [<element>] : PropertyValue | Test.java:160:24:160:84 | newMutablePropertyValuesWithElement(...) : MutablePropertyValues [<element>] : PropertyValue |
| Test.java:162:27:162:29 | out : MutablePropertyValues [<element>] : PropertyValue | Test.java:20:34:20:64 | container : MutablePropertyValues [<element>] : PropertyValue | Test.java:21:10:21:39 | getPropertyValue(...) : PropertyValue | Test.java:162:9:162:30 | getElementDefault(...) |
| Test.java:162:27:162:29 | out : MutablePropertyValues [<element>] : PropertyValue | Test.java:20:34:20:64 | container : MutablePropertyValues [<element>] : PropertyValue | Test.java:21:10:21:39 | getPropertyValue(...) : PropertyValue | Test.java:162:9:162:30 | getElementDefault(...) |
| Test.java:167:68:167:75 | source(...) : Object | Test.java:40:61:40:74 | element : Object | Test.java:41:10:41:57 | new MutablePropertyValues(...) : MutablePropertyValues [<element>, <map.value>] : Object | Test.java:167:31:167:76 | newMutablePropertyValuesWithMapValue(...) : MutablePropertyValues [<element>, <map.value>] : Object |
| Test.java:175:42:175:65 | (...)... : PropertyValue | Test.java:32:60:32:80 | element : PropertyValue | Test.java:33:10:33:52 | new MutablePropertyValues(...) : MutablePropertyValues [<element>] : PropertyValue | Test.java:175:6:175:66 | newMutablePropertyValuesWithElement(...) : MutablePropertyValues [<element>] : PropertyValue |
| Test.java:183:42:183:65 | (...)... : PropertyValue | Test.java:32:60:32:80 | element : PropertyValue | Test.java:33:10:33:52 | new MutablePropertyValues(...) : MutablePropertyValues [<element>] : PropertyValue | Test.java:183:6:183:66 | newMutablePropertyValuesWithElement(...) : MutablePropertyValues [<element>] : PropertyValue |
@@ -580,7 +563,6 @@ subpaths
| Test.java:191:42:191:65 | (...)... : PropertyValue | Test.java:32:60:32:80 | element : PropertyValue | Test.java:33:10:33:52 | new MutablePropertyValues(...) : MutablePropertyValues [<element>] : PropertyValue | Test.java:191:6:191:66 | newMutablePropertyValuesWithElement(...) : MutablePropertyValues [<element>] : PropertyValue |
| Test.java:193:25:193:27 | out : PropertyValue[] [[]] : PropertyValue | Test.java:12:24:12:32 | array : PropertyValue[] [[]] : PropertyValue | Test.java:13:10:13:17 | ...[...] : PropertyValue | Test.java:193:9:193:28 | getArrayElement(...) |
| Test.java:200:27:200:29 | out : MutablePropertyValues [<element>] : PropertyValue | Test.java:20:34:20:64 | container : MutablePropertyValues [<element>] : PropertyValue | Test.java:21:10:21:39 | getPropertyValue(...) : PropertyValue | Test.java:200:9:200:30 | getElementDefault(...) |
| Test.java:200:27:200:29 | out : MutablePropertyValues [<element>] : PropertyValue | Test.java:20:34:20:64 | container : MutablePropertyValues [<element>] : PropertyValue | Test.java:21:10:21:39 | getPropertyValue(...) : PropertyValue | Test.java:200:9:200:30 | getElementDefault(...) |
| Test.java:214:26:214:28 | out : PropertyValue [<map.key>] : String | Test.java:24:26:24:48 | container : PropertyValue [<map.key>] : String | Test.java:25:10:25:28 | getName(...) : String | Test.java:214:9:214:29 | getMapKeyDefault(...) |
| Test.java:221:28:221:30 | out : PropertyValue [<map.value>] : Object | Test.java:28:28:28:50 | container : PropertyValue [<map.value>] : Object | Test.java:29:10:29:29 | getValue(...) : Object | Test.java:221:9:221:31 | getMapValueDefault(...) |
| Test.java:228:26:228:28 | out : PropertyValue [<map.key>] : String | Test.java:24:26:24:48 | container : PropertyValue [<map.key>] : String | Test.java:25:10:25:28 | getName(...) : String | Test.java:228:9:228:29 | getMapKeyDefault(...) |

View File

@@ -156,7 +156,6 @@ nodes
| Test.java:42:21:42:48 | container : ValueWrapper [<map.value>] : Object | semmle.label | container : ValueWrapper [<map.value>] : Object |
| Test.java:42:60:42:68 | container : ValueWrapper [<map.value>] : Object | semmle.label | container : ValueWrapper [<map.value>] : Object |
| Test.java:42:60:42:74 | get(...) : Object | semmle.label | get(...) : Object |
| Test.java:42:60:42:74 | get(...) : Object | semmle.label | get(...) : Object |
| Test.java:51:16:51:23 | source(...) : Object | semmle.label | source(...) : Object |
| Test.java:52:10:52:58 | new ValueRetrievalException(...) : ValueRetrievalException [<map.key>] : Object | semmle.label | new ValueRetrievalException(...) : ValueRetrievalException [<map.key>] : Object |
| Test.java:52:44:52:45 | in : Object | semmle.label | in : Object |
@@ -228,13 +227,11 @@ nodes
| Test.java:137:21:137:23 | out : ValueWrapper [<map.value>] : Object | semmle.label | out : ValueWrapper [<map.value>] : Object |
subpaths
| Test.java:42:60:42:68 | container : ValueWrapper [<map.value>] : Object | Test.java:18:17:18:19 | parameter this : ValueWrapper [<map.value>] : Object | Test.java:18:32:18:45 | get(...) : Object | Test.java:42:60:42:74 | get(...) : Object |
| Test.java:42:60:42:68 | container : ValueWrapper [<map.value>] : Object | Test.java:18:17:18:19 | parameter this : ValueWrapper [<map.value>] : Object | Test.java:18:32:18:45 | get(...) : Object | Test.java:42:60:42:74 | get(...) : Object |
| Test.java:53:19:53:21 | out : ValueRetrievalException [<map.key>] : Object | Test.java:39:19:39:57 | container : ValueRetrievalException [<map.key>] : Object | Test.java:39:69:39:86 | getKey(...) : Object | Test.java:53:9:53:22 | getMapKey(...) |
| Test.java:65:45:65:52 | source(...) : Object | Test.java:13:16:13:29 | element : Object | Test.java:13:3:13:14 | parameter this [Return] : ValueWrapper [<map.value>] : Object | Test.java:65:28:65:53 | new ValueWrapper(...) : ValueWrapper [<map.value>] : Object |
| Test.java:66:10:66:11 | in : ValueWrapper [<map.value>] : Object | Test.java:18:17:18:19 | parameter this : ValueWrapper [<map.value>] : Object | Test.java:18:32:18:45 | get(...) : Object | Test.java:66:10:66:17 | get(...) : Object |
| Test.java:72:36:72:43 | source(...) : Object | Test.java:22:26:22:37 | value : Object | Test.java:22:3:22:12 | parameter this [Return] : DummyCache [<map.value>] : Object | Test.java:72:15:72:44 | new DummyCache(...) : DummyCache [<map.value>] : Object |
| Test.java:74:21:74:23 | out : ValueWrapper [<map.value>] : Object | Test.java:42:21:42:48 | container : ValueWrapper [<map.value>] : Object | Test.java:42:60:42:74 | get(...) : Object | Test.java:74:9:74:24 | getMapValue(...) |
| Test.java:74:21:74:23 | out : ValueWrapper [<map.value>] : Object | Test.java:42:21:42:48 | container : ValueWrapper [<map.value>] : Object | Test.java:42:60:42:74 | get(...) : Object | Test.java:74:9:74:24 | getMapValue(...) |
| Test.java:79:36:79:43 | source(...) : Object | Test.java:22:26:22:37 | value : Object | Test.java:22:3:22:12 | parameter this [Return] : DummyCache [<map.value>] : Object | Test.java:79:15:79:44 | new DummyCache(...) : DummyCache [<map.value>] : Object |
| Test.java:86:36:86:43 | source(...) : Object | Test.java:22:26:22:37 | value : Object | Test.java:22:3:22:12 | parameter this [Return] : DummyCache [<map.value>] : Object | Test.java:86:15:86:44 | new DummyCache(...) : DummyCache [<map.value>] : Object |
| Test.java:93:30:93:37 | source(...) : Object | Test.java:22:14:22:23 | key : Object | Test.java:22:3:22:12 | parameter this [Return] : DummyCache [<map.key>] : Object | Test.java:93:15:93:44 | new DummyCache(...) : DummyCache [<map.key>] : Object |
@@ -247,5 +244,4 @@ subpaths
| Test.java:130:21:130:23 | out : Cache [<map.value>] : Object | Test.java:41:21:41:35 | container : Cache [<map.value>] : Object | Test.java:41:47:41:78 | get(...) : Object | Test.java:130:9:130:24 | getMapValue(...) |
| Test.java:135:36:135:43 | source(...) : Object | Test.java:22:26:22:37 | value : Object | Test.java:22:3:22:12 | parameter this [Return] : DummyCache [<map.value>] : Object | Test.java:135:15:135:44 | new DummyCache(...) : DummyCache [<map.value>] : Object |
| Test.java:137:21:137:23 | out : ValueWrapper [<map.value>] : Object | Test.java:42:21:42:48 | container : ValueWrapper [<map.value>] : Object | Test.java:42:60:42:74 | get(...) : Object | Test.java:137:9:137:24 | getMapValue(...) |
| Test.java:137:21:137:23 | out : ValueWrapper [<map.value>] : Object | Test.java:42:21:42:48 | container : ValueWrapper [<map.value>] : Object | Test.java:42:60:42:74 | get(...) : Object | Test.java:137:9:137:24 | getMapValue(...) |
testFailures

View File

@@ -208,12 +208,10 @@ edges
| Test.java:53:70:53:76 | element : Object | Test.java:53:56:53:77 | {...} : Object[] [[]] : Object | provenance | |
| Test.java:54:37:54:50 | element : Object | Test.java:54:94:54:100 | element : Object | provenance | |
| Test.java:54:88:54:88 | p [post update] : Properties [<map.key>] : Object | Test.java:54:117:54:117 | p : Properties [<map.key>] : Object | provenance | |
| Test.java:54:88:54:88 | p [post update] : Properties [<map.key>] : Object | Test.java:54:117:54:117 | p : Properties [<map.key>] : Object | provenance | |
| Test.java:54:94:54:100 | element : Object | Test.java:54:88:54:88 | p [post update] : Properties [<map.key>] : Object | provenance | MaD:5 |
| Test.java:54:94:54:100 | element : Object | Test.java:54:88:54:88 | p [post update] : Properties [<map.key>] : Object | provenance | MaD:13 |
| Test.java:55:39:55:52 | element : Object | Test.java:55:102:55:108 | element : Object | provenance | |
| Test.java:55:90:55:90 | p [post update] : Properties [<map.value>] : Object | Test.java:55:119:55:119 | p : Properties [<map.value>] : Object | provenance | |
| Test.java:55:90:55:90 | p [post update] : Properties [<map.value>] : Object | Test.java:55:119:55:119 | p : Properties [<map.value>] : Object | provenance | |
| Test.java:55:102:55:108 | element : Object | Test.java:55:90:55:90 | p [post update] : Properties [<map.value>] : Object | provenance | MaD:6 |
| Test.java:55:102:55:108 | element : Object | Test.java:55:90:55:90 | p [post update] : Properties [<map.value>] : Object | provenance | MaD:14 |
| Test.java:66:17:66:32 | (...)... : String | Test.java:67:33:67:34 | in : String | provenance | |
@@ -1264,16 +1262,12 @@ nodes
| Test.java:53:70:53:76 | element : Object | semmle.label | element : Object |
| Test.java:54:37:54:50 | element : Object | semmle.label | element : Object |
| Test.java:54:88:54:88 | p [post update] : Properties [<map.key>] : Object | semmle.label | p [post update] : Properties [<map.key>] : Object |
| Test.java:54:88:54:88 | p [post update] : Properties [<map.key>] : Object | semmle.label | p [post update] : Properties [<map.key>] : Object |
| Test.java:54:94:54:100 | element : Object | semmle.label | element : Object |
| Test.java:54:117:54:117 | p : Properties [<map.key>] : Object | semmle.label | p : Properties [<map.key>] : Object |
| Test.java:54:117:54:117 | p : Properties [<map.key>] : Object | semmle.label | p : Properties [<map.key>] : Object |
| Test.java:55:39:55:52 | element : Object | semmle.label | element : Object |
| Test.java:55:90:55:90 | p [post update] : Properties [<map.value>] : Object | semmle.label | p [post update] : Properties [<map.value>] : Object |
| Test.java:55:90:55:90 | p [post update] : Properties [<map.value>] : Object | semmle.label | p [post update] : Properties [<map.value>] : Object |
| Test.java:55:102:55:108 | element : Object | semmle.label | element : Object |
| Test.java:55:119:55:119 | p : Properties [<map.value>] : Object | semmle.label | p : Properties [<map.value>] : Object |
| Test.java:55:119:55:119 | p : Properties [<map.value>] : Object | semmle.label | p : Properties [<map.value>] : Object |
| Test.java:66:17:66:32 | (...)... : String | semmle.label | (...)... : String |
| Test.java:66:25:66:32 | source(...) : Object | semmle.label | source(...) : Object |
| Test.java:67:33:67:34 | in : String | semmle.label | in : String |
@@ -2338,10 +2332,8 @@ subpaths
| Test.java:251:38:251:45 | source(...) : Object | Test.java:53:31:53:44 | element : Object | Test.java:53:56:53:77 | new Object[] : Object[] [[]] : Object | Test.java:251:18:251:46 | newWithArrayElement(...) : Object[] [[]] : Object |
| Test.java:253:20:253:22 | out : Collection [<element>] : Object | Test.java:49:19:49:41 | container : Collection [<element>] : Object | Test.java:49:53:49:79 | next(...) : Object | Test.java:253:9:253:23 | getElement(...) |
| Test.java:258:44:258:51 | source(...) : Object | Test.java:54:37:54:50 | element : Object | Test.java:54:117:54:117 | p : Properties [<map.key>] : Object | Test.java:258:20:258:52 | newPropertiesWithMapKey(...) : Properties [<map.key>] : Object |
| Test.java:258:44:258:51 | source(...) : Object | Test.java:54:37:54:50 | element : Object | Test.java:54:117:54:117 | p : Properties [<map.key>] : Object | Test.java:258:20:258:52 | newPropertiesWithMapKey(...) : Properties [<map.key>] : Object |
| Test.java:260:19:260:21 | out : Map [<map.key>] : Object | Test.java:51:21:51:39 | container : Map [<map.key>] : Object | Test.java:51:51:51:86 | next(...) : Object | Test.java:260:9:260:22 | getMapKey(...) |
| Test.java:265:46:265:53 | source(...) : Object | Test.java:55:39:55:52 | element : Object | Test.java:55:119:55:119 | p : Properties [<map.value>] : Object | Test.java:265:20:265:54 | newPropertiesWithMapValue(...) : Properties [<map.value>] : Object |
| Test.java:265:46:265:53 | source(...) : Object | Test.java:55:39:55:52 | element : Object | Test.java:55:119:55:119 | p : Properties [<map.value>] : Object | Test.java:265:20:265:54 | newPropertiesWithMapValue(...) : Properties [<map.value>] : Object |
| Test.java:267:21:267:23 | out : Map [<map.value>] : Object | Test.java:52:23:52:41 | container : Map [<map.value>] : Object | Test.java:52:53:52:71 | get(...) : Object | Test.java:267:9:267:24 | getMapValue(...) |
| Test.java:274:20:274:22 | out : Iterator [<element>] : Object | Test.java:50:19:50:39 | container : Iterator [<element>] : Object | Test.java:50:51:50:66 | next(...) : Object | Test.java:274:9:274:23 | getElement(...) |
| Test.java:281:20:281:35 | getMapValue(...) : List [<element>] : Object | Test.java:49:19:49:41 | container : List [<element>] : Object | Test.java:49:53:49:79 | next(...) : Object | Test.java:281:9:281:36 | getElement(...) |

View File

@@ -305,12 +305,16 @@ edges
| Test.java:239:18:239:19 | a1 [Return] : Object[] [[]] : Object | Test.java:250:18:250:18 | a : Object[] [[]] : Object | provenance | MaD:16+MaD:14 |
| Test.java:239:18:239:19 | a1 [Return] : Object[] [[]] : Object | Test.java:254:18:254:19 | a1 : Object[] [[]] : Object | provenance | MaD:16+MaD:14 |
| Test.java:239:18:239:19 | a1 [Return] : Object[] [[]] : Object | Test.java:254:22:254:23 | a2 : Object[] [[]] : Object | provenance | MaD:16+MaD:14 |
| Test.java:239:18:239:19 | a1 [Return] : Object[] [[]] : Object | Test.java:265:18:265:19 | a1 : Object[] [[]] : Object | provenance | MaD:16+MaD:14 |
| Test.java:239:18:239:19 | a1 [Return] : Object[] [[]] : Object | Test.java:265:22:265:23 | a2 : Object[] [[]] : Object | provenance | MaD:16+MaD:14 |
| Test.java:239:22:239:23 | a2 [Return] : Object[] [[]] : Object | Test.java:238:18:238:18 | a : Object[] [[]] : Object | provenance | MaD:16 |
| Test.java:239:22:239:23 | a2 [Return] : Object[] [[]] : Object | Test.java:238:18:238:18 | a : Object[] [[]] : Object | provenance | MaD:16+MaD:14 |
| Test.java:239:22:239:23 | a2 [Return] : Object[] [[]] : Object | Test.java:250:18:250:18 | a : Object[] [[]] : Object | provenance | MaD:16 |
| Test.java:239:22:239:23 | a2 [Return] : Object[] [[]] : Object | Test.java:250:18:250:18 | a : Object[] [[]] : Object | provenance | MaD:16+MaD:14 |
| Test.java:239:22:239:23 | a2 [Return] : Object[] [[]] : Object | Test.java:254:18:254:19 | a1 : Object[] [[]] : Object | provenance | MaD:16+MaD:14 |
| Test.java:239:22:239:23 | a2 [Return] : Object[] [[]] : Object | Test.java:254:22:254:23 | a2 : Object[] [[]] : Object | provenance | MaD:16+MaD:14 |
| Test.java:239:22:239:23 | a2 [Return] : Object[] [[]] : Object | Test.java:265:18:265:19 | a1 : Object[] [[]] : Object | provenance | MaD:16+MaD:14 |
| Test.java:239:22:239:23 | a2 [Return] : Object[] [[]] : Object | Test.java:265:22:265:23 | a2 : Object[] [[]] : Object | provenance | MaD:16+MaD:14 |
| Test.java:240:21:240:22 | a1 [post update] : Object[] [[]] : Object | Test.java:239:18:239:19 | a1 [Return] : Object[] [[]] : Object | provenance | |
| Test.java:240:29:240:47 | source(...) : Object | Test.java:240:21:240:22 | a1 [post update] : Object[] [[]] : Object | provenance | |
| Test.java:241:21:241:22 | a2 [post update] : Object[] [[]] : Object | Test.java:239:22:239:23 | a2 [Return] : Object[] [[]] : Object | provenance | |
@@ -324,6 +328,8 @@ edges
| Test.java:249:23:249:58 | new Object[] : Object[] [[]] : Object | Test.java:250:18:250:18 | a : Object[] [[]] : Object | provenance | MaD:13+MaD:14 |
| Test.java:249:23:249:58 | new Object[] : Object[] [[]] : Object | Test.java:254:18:254:19 | a1 : Object[] [[]] : Object | provenance | MaD:13+MaD:14 |
| Test.java:249:23:249:58 | new Object[] : Object[] [[]] : Object | Test.java:254:22:254:23 | a2 : Object[] [[]] : Object | provenance | MaD:13+MaD:14 |
| Test.java:249:23:249:58 | new Object[] : Object[] [[]] : Object | Test.java:265:18:265:19 | a1 : Object[] [[]] : Object | provenance | MaD:13+MaD:14 |
| Test.java:249:23:249:58 | new Object[] : Object[] [[]] : Object | Test.java:265:22:265:23 | a2 : Object[] [[]] : Object | provenance | MaD:13+MaD:14 |
| Test.java:249:23:249:58 | {...} : Object[] [[]] : Object | Test.java:249:23:249:58 | new Object[] : Object[] [[]] : Object | provenance | |
| Test.java:249:38:249:56 | source(...) : Object | Test.java:249:23:249:58 | {...} : Object[] [[]] : Object | provenance | |
| Test.java:250:18:250:18 | a : Object[] [[]] : Object | Test.java:251:26:251:26 | a : Object[] [[]] : Object | provenance | |
@@ -335,6 +341,8 @@ edges
| Test.java:250:18:250:18 | a [Return] : Object[] [[]] : Object | Test.java:250:18:250:18 | a : Object[] [[]] : Object | provenance | MaD:14+MaD:16 |
| Test.java:250:18:250:18 | a [Return] : Object[] [[]] : Object | Test.java:254:18:254:19 | a1 : Object[] [[]] : Object | provenance | MaD:14 |
| Test.java:250:18:250:18 | a [Return] : Object[] [[]] : Object | Test.java:254:22:254:23 | a2 : Object[] [[]] : Object | provenance | MaD:14 |
| Test.java:250:18:250:18 | a [Return] : Object[] [[]] : Object | Test.java:265:18:265:19 | a1 : Object[] [[]] : Object | provenance | MaD:14 |
| Test.java:250:18:250:18 | a [Return] : Object[] [[]] : Object | Test.java:265:22:265:23 | a2 : Object[] [[]] : Object | provenance | MaD:14 |
| Test.java:251:26:251:26 | a : Object[] [[]] : Object | Test.java:251:26:251:29 | ...[...] | provenance | |
| Test.java:252:21:252:21 | a [post update] : Object[] [[]] : Object | Test.java:250:18:250:18 | a [Return] : Object[] [[]] : Object | provenance | |
| Test.java:252:28:252:46 | source(...) : Object | Test.java:252:21:252:21 | a [post update] : Object[] [[]] : Object | provenance | |
@@ -347,10 +355,20 @@ edges
| Test.java:261:43:261:61 | source(...) : Object | Test.java:261:33:261:62 | of(...) : Stream [<element>] : Object | provenance | MaD:56 |
| Test.java:262:28:262:29 | in : Stream [<element>] : Object | Test.java:262:28:268:18 | collect(...) : Object[] [[]] : Object | provenance | MaD:12 |
| Test.java:262:28:262:29 | in : Stream [<element>] : Object | Test.java:264:21:264:21 | x : Object | provenance | MaD:12 |
| Test.java:262:28:262:29 | in : Stream [<element>] : Object | Test.java:265:18:265:19 | a1 : Object[] [[]] : Object | provenance | MaD:12 |
| Test.java:262:28:262:29 | in : Stream [<element>] : Object | Test.java:265:22:265:23 | a2 : Object[] [[]] : Object | provenance | MaD:12 |
| Test.java:262:28:268:18 | collect(...) : Object[] [[]] : Object | Test.java:269:18:269:20 | out : Object[] [[]] : Object | provenance | |
| Test.java:264:21:264:21 | x : Object | Test.java:264:36:264:36 | x : Object | provenance | |
| Test.java:264:29:264:29 | a [post update] : Object[] [[]] : Object | Test.java:264:18:264:18 | a [Return] : Object[] [[]] : Object | provenance | |
| Test.java:264:36:264:36 | x : Object | Test.java:264:29:264:29 | a [post update] : Object[] [[]] : Object | provenance | |
| Test.java:265:18:265:19 | a1 : Object[] [[]] : Object | Test.java:267:29:267:30 | a1 : Object[] [[]] : Object | provenance | |
| Test.java:265:22:265:23 | a2 : Object[] [[]] : Object | Test.java:266:29:266:30 | a2 : Object[] [[]] : Object | provenance | |
| Test.java:266:21:266:22 | a1 [post update] : Object[] [[]] : Object | Test.java:265:18:265:19 | a1 [Return] : Object[] [[]] : Object | provenance | |
| Test.java:266:29:266:30 | a2 : Object[] [[]] : Object | Test.java:266:29:266:33 | ...[...] : Object | provenance | |
| Test.java:266:29:266:33 | ...[...] : Object | Test.java:266:21:266:22 | a1 [post update] : Object[] [[]] : Object | provenance | |
| Test.java:267:21:267:22 | a2 [post update] : Object[] [[]] : Object | Test.java:265:22:265:23 | a2 [Return] : Object[] [[]] : Object | provenance | |
| Test.java:267:29:267:30 | a1 : Object[] [[]] : Object | Test.java:267:29:267:33 | ...[...] : Object | provenance | |
| Test.java:267:29:267:33 | ...[...] : Object | Test.java:267:21:267:22 | a2 [post update] : Object[] [[]] : Object | provenance | |
| Test.java:269:18:269:20 | out : Object[] [[]] : Object | Test.java:269:18:269:23 | ...[...] | provenance | |
| Test.java:273:33:273:62 | of(...) : Stream [<element>] : Object | Test.java:274:13:274:14 | in : Stream [<element>] : Object | provenance | |
| Test.java:273:43:273:61 | source(...) : Object | Test.java:273:33:273:62 | of(...) : Stream [<element>] : Object | provenance | MaD:56 |
@@ -790,6 +808,16 @@ nodes
| Test.java:264:21:264:21 | x : Object | semmle.label | x : Object |
| Test.java:264:29:264:29 | a [post update] : Object[] [[]] : Object | semmle.label | a [post update] : Object[] [[]] : Object |
| Test.java:264:36:264:36 | x : Object | semmle.label | x : Object |
| Test.java:265:18:265:19 | a1 : Object[] [[]] : Object | semmle.label | a1 : Object[] [[]] : Object |
| Test.java:265:18:265:19 | a1 [Return] : Object[] [[]] : Object | semmle.label | a1 [Return] : Object[] [[]] : Object |
| Test.java:265:22:265:23 | a2 : Object[] [[]] : Object | semmle.label | a2 : Object[] [[]] : Object |
| Test.java:265:22:265:23 | a2 [Return] : Object[] [[]] : Object | semmle.label | a2 [Return] : Object[] [[]] : Object |
| Test.java:266:21:266:22 | a1 [post update] : Object[] [[]] : Object | semmle.label | a1 [post update] : Object[] [[]] : Object |
| Test.java:266:29:266:30 | a2 : Object[] [[]] : Object | semmle.label | a2 : Object[] [[]] : Object |
| Test.java:266:29:266:33 | ...[...] : Object | semmle.label | ...[...] : Object |
| Test.java:267:21:267:22 | a2 [post update] : Object[] [[]] : Object | semmle.label | a2 [post update] : Object[] [[]] : Object |
| Test.java:267:29:267:30 | a1 : Object[] [[]] : Object | semmle.label | a1 : Object[] [[]] : Object |
| Test.java:267:29:267:33 | ...[...] : Object | semmle.label | ...[...] : Object |
| Test.java:269:18:269:20 | out : Object[] [[]] : Object | semmle.label | out : Object[] [[]] : Object |
| Test.java:269:18:269:23 | ...[...] | semmle.label | ...[...] |
| Test.java:273:33:273:62 | of(...) : Stream [<element>] : Object | semmle.label | of(...) : Stream [<element>] : Object |
@@ -1010,6 +1038,8 @@ subpaths
| Test.java:208:34:208:36 | out : Object[] [[]] : Object | Test.java:16:27:16:35 | array : Object[] [[]] : Object | Test.java:16:47:16:54 | ...[...] : Object | Test.java:208:18:208:37 | getArrayElement(...) |
| Test.java:215:29:215:31 | out : List [<element>] : Object | Test.java:18:22:18:35 | it : List [<element>] : Object | Test.java:18:47:18:66 | next(...) : Object | Test.java:215:18:215:32 | getElement(...) |
| Test.java:262:28:262:29 | in : Stream [<element>] : Object | Test.java:264:21:264:21 | x : Object | Test.java:264:18:264:18 | a [Return] : Object[] [[]] : Object | Test.java:262:28:268:18 | collect(...) : Object[] [[]] : Object |
| Test.java:262:28:262:29 | in : Stream [<element>] : Object | Test.java:265:18:265:19 | a1 : Object[] [[]] : Object | Test.java:265:22:265:23 | a2 [Return] : Object[] [[]] : Object | Test.java:262:28:268:18 | collect(...) : Object[] [[]] : Object |
| Test.java:262:28:262:29 | in : Stream [<element>] : Object | Test.java:265:22:265:23 | a2 : Object[] [[]] : Object | Test.java:265:18:265:19 | a1 [Return] : Object[] [[]] : Object | Test.java:262:28:268:18 | collect(...) : Object[] [[]] : Object |
| Test.java:289:29:289:31 | out : Stream [<element>] : Object | Test.java:17:22:17:38 | s : Stream [<element>] : Object | Test.java:17:50:17:68 | next(...) : Object | Test.java:289:18:289:32 | getElement(...) |
| Test.java:319:29:319:31 | out : Stream [<element>] : Object | Test.java:17:22:17:38 | s : Stream [<element>] : Object | Test.java:17:50:17:68 | next(...) : Object | Test.java:319:18:319:32 | getElement(...) |
| Test.java:335:29:335:31 | out : Stream [<element>] : Object | Test.java:17:22:17:38 | s : Stream [<element>] : Object | Test.java:17:50:17:68 | next(...) : Object | Test.java:335:18:335:32 | getElement(...) |

View File

@@ -1,2 +1,2 @@
failures
testFailures
failures

View File

@@ -32,8 +32,8 @@ public class ImplicitPendingIntentsTest {
PendingIntent pi = PendingIntent.getActivity(ctx, 0, baseIntent, 0);
Intent fwdIntent = new Intent();
fwdIntent.putExtra("fwdIntent", pi);
ctx.startActivities(new Intent[] {fwdIntent}); // $ MISSING: hasImplicitPendingIntent
ctx.startActivity(fwdIntent); // $hasImplicitPendingIntent
ctx.startActivities(new Intent[] {fwdIntent}); // $hasImplicitPendingIntent
ctx.startService(fwdIntent); // Safe
ctx.sendBroadcast(fwdIntent); // $hasImplicitPendingIntent

View File

@@ -295,6 +295,15 @@ private predicate isRequire(DataFlow::Node nd) {
isCreateRequire(call.getCallee().flow()) and
nd = call.flow()
)
or
// `$.require('underscore');`.
// NPM as supported in [XSJS files](https://www.npmjs.com/package/@sap/async-xsjs#npm-packages-support).
exists(MethodCallExpr require |
nd.getFile().getExtension() = ["xsjs", "xsjslib"] and
require.getCalleeName() = "require" and
require.getReceiver().(GlobalVarAccess).getName() = "$" and
nd = require.getCallee().flow()
)
}
/**

View File

@@ -1,6 +1,6 @@
extensions:
- addsTo:
pack: codeql/javascript-queries
pack: codeql/javascript-all
extensible: requiredHelmetSecuritySetting
data:
- ["frameguard"]

View File

@@ -0,0 +1,41 @@
/**
* Provides classes for working with Helmet
*/
private import javascript
/**
* A write to a property of a route handler from the "helmet" module.
*/
class HelmetProperty extends DataFlow::Node instanceof DataFlow::PropWrite {
ExpressLibraries::HelmetRouteHandler helmet;
HelmetProperty() {
this = helmet.(DataFlow::CallNode).getAnArgument().getALocalSource().getAPropertyWrite()
}
/**
* Gets the route handler associated to this property.
*/
ExpressLibraries::HelmetRouteHandler getHelmet() { result = helmet }
/**
* Gets the boolean value of this property, if it may evaluate to a `Boolean`.
*/
predicate isFalse() { DataFlow::PropWrite.super.getRhs().mayHaveBooleanValue(false) }
/**
* Gets the name of the `HelmetProperty`.
*/
string getName() { result = DataFlow::PropWrite.super.getPropertyName() }
/**
* read from data extensions to allow enforcing custom settings
*/
predicate isImportantSecuritySetting() { requiredHelmetSecuritySetting(this.getName()) }
}
/**
* defaults are located in `javascript/ql/lib/semmle/frameworks/helmet/Helmet.Required.Setting.model.yml`
*/
extensible predicate requiredHelmetSecuritySetting(string name);

View File

@@ -24,7 +24,7 @@ A suitable [model pack](https://docs.github.com/en/code-security/codeql-cli/usin
name: my-org/javascript-helmet-insecure-config-model-pack
version: 1.0.0
extensionTargets:
codeql/java-all: '*'
codeql/javascript-all: '*'
dataExtensions:
- models/**/*.yml
```

View File

@@ -12,30 +12,8 @@
*/
import javascript
import DataFlow
import semmle.javascript.frameworks.ExpressModules
class HelmetProperty extends DataFlow::Node instanceof DataFlow::PropWrite {
ExpressLibraries::HelmetRouteHandler helmet;
HelmetProperty() {
this = helmet.(DataFlow::CallNode).getAnArgument().getALocalSource().getAPropertyWrite()
}
ExpressLibraries::HelmetRouteHandler getHelmet() { result = helmet }
predicate isFalse() { DataFlow::PropWrite.super.getRhs().mayHaveBooleanValue(false) }
string getName() { result = DataFlow::PropWrite.super.getPropertyName() }
predicate isImportantSecuritySetting() {
// read from data extensions to allow enforcing custom settings
// defaults are located in javascript/ql/lib/semmle/frameworks/helmet/Helmet.Required.Setting.model.yml
requiredHelmetSecuritySetting(this.getName())
}
}
extensible predicate requiredHelmetSecuritySetting(string name);
import semmle.javascript.frameworks.helmet.Helmet
from HelmetProperty helmetProperty, ExpressLibraries::HelmetRouteHandler helmet
where

View File

@@ -9,3 +9,4 @@
| tst.js:35:13:35:43 | crypto. ... an(512) | Creation of an asymmetric key uses 512 bits, which is below 2048 and considered breakable. |
| tst.js:39:13:39:33 | new Nod ... : 512}) | Creation of an asymmetric RSA key uses 512 bits, which is below 2048 and considered breakable. |
| tst.js:43:1:43:31 | key.gen ... 65537) | Creation of an asymmetric RSA key uses 512 bits, which is below 2048 and considered breakable. |
| tst.xsjs:3:14:3:71 | crypto. ... 1024 }) | Creation of an asymmetric RSA key uses 1024 bits, which is below 2048 and considered breakable. |

View File

@@ -0,0 +1,5 @@
const crypto = $.require("crypto");
const bad1 = crypto.generateKeyPairSync("rsa", { modulusLength: 1024 }); // NOT OK
const good1 = crypto.generateKeyPairSync("rsa", { modulusLength: 4096 }); // OK

View File

@@ -1,13 +1,3 @@
load("@buildifier_prebuilt//:rules.bzl", "buildifier")
buildifier(
name = "buildifier",
exclude_patterns = [
"./.git/*",
],
lint_mode = "fix",
)
sh_library(
name = "sh_runfiles",
srcs = ["runfiles.sh"],

View File

@@ -0,0 +1,9 @@
load("@buildifier_prebuilt//:rules.bzl", "buildifier")
buildifier(
name = "buildifier",
exclude_patterns = [
"./.git/*",
],
lint_mode = "fix",
)

View File

@@ -16,13 +16,13 @@ import shutil
import json
import typing
import urllib.request
import urllib.error
from urllib.parse import urlparse
import re
import base64
from dataclasses import dataclass
import argparse
def options():
p = argparse.ArgumentParser(description=__doc__)
p.add_argument("--hash-only", action="store_true")
@@ -30,6 +30,12 @@ def options():
return p.parse_args()
TIMEOUT = 20
def warn(message: str) -> None:
print(f"WARNING: {message}", file=sys.stderr)
@dataclass
class Endpoint:
name: str
@@ -41,6 +47,10 @@ class Endpoint:
self.headers.update((k.capitalize(), v) for k, v in d)
class NoEndpointsFound(Exception):
pass
opts = options()
sources = [p.resolve() for p in opts.sources]
source_dir = pathlib.Path(os.path.commonpath(src.parent for src in sources))
@@ -105,18 +115,12 @@ def get_endpoints() -> typing.Iterable[Endpoint]:
"download",
]
try:
res = subprocess.run(cmd, stdout=subprocess.PIPE, timeout=15)
res = subprocess.run(cmd, stdout=subprocess.PIPE, timeout=TIMEOUT)
except subprocess.TimeoutExpired:
print(
f"WARNING: ssh timed out when connecting to {server}, ignoring {endpoint.name} endpoint",
file=sys.stderr,
)
warn(f"ssh timed out when connecting to {server}, ignoring {endpoint.name} endpoint")
continue
if res.returncode != 0:
print(
f"WARNING: ssh failed when connecting to {server}, ignoring {endpoint.name} endpoint",
file=sys.stderr,
)
warn(f"ssh failed when connecting to {server}, ignoring {endpoint.name} endpoint")
continue
ssh_resp = json.loads(res.stdout)
endpoint.href = ssh_resp.get("href", endpoint)
@@ -139,10 +143,7 @@ def get_endpoints() -> typing.Iterable[Endpoint]:
input=f"protocol={url.scheme}\nhost={url.netloc}\npath={url.path[1:]}\n",
)
if credentials is None:
print(
f"WARNING: no authorization method found, ignoring {data.name} endpoint",
file=sys.stderr,
)
warn(f"no authorization method found, ignoring {endpoint.name} endpoint")
continue
credentials = dict(get_env(credentials))
auth = base64.b64encode(
@@ -176,10 +177,10 @@ def get_locations(objects):
data=json.dumps(data).encode("ascii"),
)
try:
with urllib.request.urlopen(req) as resp:
with urllib.request.urlopen(req, timeout=TIMEOUT) as resp:
data = json.load(resp)
except urllib.request.HTTPError as e:
print(f"WARNING: encountered HTTPError {e}, ignoring endpoint {e.name}")
except urllib.error.URLError as e:
warn(f"encountered {type(e).__name__} {e}, ignoring endpoint {endpoint.name}")
continue
assert len(data["objects"]) == len(
indexes
@@ -187,7 +188,7 @@ def get_locations(objects):
for i, resp in zip(indexes, data["objects"]):
ret[i] = f'{resp["oid"]} {resp["actions"]["download"]["href"]}'
return ret
raise Exception(f"no valid endpoint found")
raise NoEndpointsFound
def get_lfs_object(path):
@@ -204,6 +205,10 @@ def get_lfs_object(path):
return {"oid": sha256, "size": size}
objects = [get_lfs_object(src) for src in sources]
for resp in get_locations(objects):
print(resp)
try:
objects = [get_lfs_object(src) for src in sources]
for resp in get_locations(objects):
print(resp)
except NoEndpointsFound as e:
print(f"ERROR: no valid endpoints found", file=sys.stderr)
sys.exit(1)

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