Merge pull request #7178 from michaelnebel/csharp-flowsummary-pp-csv

C#: Initial implementation of csv printing in FlowSummaries test
This commit is contained in:
Tom Hvitved
2021-11-29 09:59:33 +01:00
committed by GitHub
12 changed files with 3306 additions and 2981 deletions

View File

@@ -383,7 +383,7 @@ class Parameterizable extends DotNet::Parameterizable, Declaration, @parameteriz
override Parameter getParameter(int i) { params(result, _, _, i, _, this, _) }
/**
* Gets the name of this parameter followed by its type, possibly prefixed
* Gets the type of the parameter, possibly prefixed
* with `out`, `ref`, or `params`, where appropriate.
*/
private string parameterTypeToString(int i) {

View File

@@ -127,6 +127,38 @@ module Public {
SummaryComponentStack return(ReturnKind rk) { result = singleton(SummaryComponent::return(rk)) }
}
private predicate noComponentSpecificCsv(SummaryComponent sc) {
not exists(getComponentSpecificCsv(sc))
}
/** Gets a textual representation of this component used for flow summaries. */
private string getComponentCsv(SummaryComponent sc) {
result = getComponentSpecificCsv(sc)
or
noComponentSpecificCsv(sc) and
(
exists(int i | sc = TParameterSummaryComponent(i) and result = "Parameter[" + i + "]")
or
exists(int i | sc = TArgumentSummaryComponent(i) and result = "Argument[" + i + "]")
or
sc = TReturnSummaryComponent(getReturnValueKind()) and result = "ReturnValue"
)
}
/** Gets a textual representation of this stack used for flow summaries. */
string getComponentStackCsv(SummaryComponentStack stack) {
exists(SummaryComponent head, SummaryComponentStack tail |
head = stack.head() and
tail = stack.tail() and
result = getComponentCsv(head) + " of " + getComponentStackCsv(tail)
)
or
exists(SummaryComponent c |
stack = TSingletonSummaryComponentStack(c) and
result = getComponentCsv(c)
)
}
/**
* A class that exists for QL technical reasons only (the IPA type used
* to represent component stacks needs to be bounded).
@@ -970,18 +1002,31 @@ module Private {
module TestOutput {
/** A flow summary to include in the `summary/3` query predicate. */
abstract class RelevantSummarizedCallable extends SummarizedCallable {
/** Gets the string representation of this callable used by `summary/3`. */
string getFullString() { result = this.toString() }
/** Gets the string representation of this callable used by `summary/1`. */
abstract string getCallableCsv();
}
/** A query predicate for outputting flow summaries in QL tests. */
query predicate summary(string callable, string flow, boolean preservesValue) {
/** Render the kind in the format used in flow summaries. */
private string renderKind(boolean preservesValue) {
preservesValue = true and result = "value"
or
preservesValue = false and result = "taint"
}
/**
* A query predicate for outputting flow summaries in semi-colon separated format in QL tests.
* The syntax is: "namespace;type;overrides;name;signature;ext;inputspec;outputspec;kind",
* ext is hardcoded to empty.
*/
query predicate summary(string csv) {
exists(
RelevantSummarizedCallable c, SummaryComponentStack input, SummaryComponentStack output
RelevantSummarizedCallable c, SummaryComponentStack input, SummaryComponentStack output,
boolean preservesValue
|
callable = c.getFullString() and
c.propagatesFlow(input, output, preservesValue) and
flow = input + " -> " + output
csv =
c.getCallableCsv() + ";;" + getComponentStackCsv(input) + ";" +
getComponentStackCsv(output) + ";" + renderKind(preservesValue)
)
}
}

View File

@@ -138,6 +138,26 @@ SummaryComponent interpretComponentSpecific(string c) {
)
}
/** Gets the textual representation of the content in the format used for flow summaries. */
private string getContentSpecificCsv(Content c) {
c = TElementContent() and result = "Element"
or
exists(Field f | c = TFieldContent(f) and result = "Field[" + f.getQualifiedName() + "]")
or
exists(Property p | c = TPropertyContent(p) and result = "Property[" + p.getQualifiedName() + "]")
}
/** Gets the textual representation of a summary component in the format used for flow summaries. */
string getComponentSpecificCsv(SummaryComponent sc) {
exists(Content c | sc = TContentSummaryComponent(c) and result = getContentSpecificCsv(c))
or
exists(ReturnKind rk |
sc = TReturnSummaryComponent(rk) and
result = "ReturnValue[" + rk + "]" and
not rk instanceof NormalReturnKind
)
}
class SourceOrSinkElement = Element;
/** Gets the return kind corresponding to specification `"ReturnValue"`. */

View File

@@ -1,8 +1,5 @@
import semmle.code.csharp.dataflow.FlowSummary
import semmle.code.csharp.dataflow.internal.FlowSummaryImpl::Private::TestOutput
import shared.FlowSummaries
private class IncludeSummarizedCallable extends RelevantSummarizedCallable {
IncludeSummarizedCallable() { this instanceof SummarizedCallable }
override string getFullString() { result = this.(Callable).getQualifiedNameWithTypes() }
private class IncludeAllSummarizedCallable extends IncludeSummarizedCallable {
IncludeAllSummarizedCallable() { this instanceof SummarizedCallable }
}

View File

@@ -1,134 +1,134 @@
| Microsoft.EntityFrameworkCore.DbContext.SaveChanges() | property AddressId of element of property PersonAddresses of argument -1 -> property AddressId of element of return (jump to get_PersonAddresses) | true |
| Microsoft.EntityFrameworkCore.DbContext.SaveChanges() | property Id of element of property Addresses of argument -1 -> property Id of element of property Addresses of element of return (jump to get_Persons) | true |
| Microsoft.EntityFrameworkCore.DbContext.SaveChanges() | property Id of element of property Addresses of argument -1 -> property Id of element of return (jump to get_Addresses) | true |
| Microsoft.EntityFrameworkCore.DbContext.SaveChanges() | property Id of element of property Addresses of argument -1 -> property Id of property Address of element of return (jump to get_PersonAddresses) | true |
| Microsoft.EntityFrameworkCore.DbContext.SaveChanges() | property Id of element of property Addresses of element of property Persons of argument -1 -> property Id of element of property Addresses of element of return (jump to get_Persons) | true |
| Microsoft.EntityFrameworkCore.DbContext.SaveChanges() | property Id of element of property Addresses of element of property Persons of argument -1 -> property Id of element of return (jump to get_Addresses) | true |
| Microsoft.EntityFrameworkCore.DbContext.SaveChanges() | property Id of element of property Addresses of element of property Persons of argument -1 -> property Id of property Address of element of return (jump to get_PersonAddresses) | true |
| Microsoft.EntityFrameworkCore.DbContext.SaveChanges() | property Id of element of property PersonAddresses of argument -1 -> property Id of element of return (jump to get_PersonAddresses) | true |
| Microsoft.EntityFrameworkCore.DbContext.SaveChanges() | property Id of element of property Persons of argument -1 -> property Id of element of return (jump to get_Persons) | true |
| Microsoft.EntityFrameworkCore.DbContext.SaveChanges() | property Id of element of property Persons of argument -1 -> property Id of property Person of element of return (jump to get_PersonAddresses) | true |
| Microsoft.EntityFrameworkCore.DbContext.SaveChanges() | property Id of property Address of element of property PersonAddresses of argument -1 -> property Id of element of property Addresses of element of return (jump to get_Persons) | true |
| Microsoft.EntityFrameworkCore.DbContext.SaveChanges() | property Id of property Address of element of property PersonAddresses of argument -1 -> property Id of element of return (jump to get_Addresses) | true |
| Microsoft.EntityFrameworkCore.DbContext.SaveChanges() | property Id of property Address of element of property PersonAddresses of argument -1 -> property Id of property Address of element of return (jump to get_PersonAddresses) | true |
| Microsoft.EntityFrameworkCore.DbContext.SaveChanges() | property Id of property Person of element of property PersonAddresses of argument -1 -> property Id of element of return (jump to get_Persons) | true |
| Microsoft.EntityFrameworkCore.DbContext.SaveChanges() | property Id of property Person of element of property PersonAddresses of argument -1 -> property Id of property Person of element of return (jump to get_PersonAddresses) | true |
| Microsoft.EntityFrameworkCore.DbContext.SaveChanges() | property Name of element of property Persons of argument -1 -> property Name of element of return (jump to get_Persons) | true |
| Microsoft.EntityFrameworkCore.DbContext.SaveChanges() | property Name of element of property Persons of argument -1 -> property Name of property Person of element of return (jump to get_PersonAddresses) | true |
| Microsoft.EntityFrameworkCore.DbContext.SaveChanges() | property Name of property Person of element of property PersonAddresses of argument -1 -> property Name of element of return (jump to get_Persons) | true |
| Microsoft.EntityFrameworkCore.DbContext.SaveChanges() | property Name of property Person of element of property PersonAddresses of argument -1 -> property Name of property Person of element of return (jump to get_PersonAddresses) | true |
| Microsoft.EntityFrameworkCore.DbContext.SaveChanges() | property PersonId of element of property PersonAddresses of argument -1 -> property PersonId of element of return (jump to get_PersonAddresses) | true |
| Microsoft.EntityFrameworkCore.DbContext.SaveChanges() | property Street of element of property Addresses of argument -1 -> property Street of element of property Addresses of element of return (jump to get_Persons) | true |
| Microsoft.EntityFrameworkCore.DbContext.SaveChanges() | property Street of element of property Addresses of argument -1 -> property Street of element of return (jump to get_Addresses) | true |
| Microsoft.EntityFrameworkCore.DbContext.SaveChanges() | property Street of element of property Addresses of argument -1 -> property Street of property Address of element of return (jump to get_PersonAddresses) | true |
| Microsoft.EntityFrameworkCore.DbContext.SaveChanges() | property Street of element of property Addresses of element of property Persons of argument -1 -> property Street of element of property Addresses of element of return (jump to get_Persons) | true |
| Microsoft.EntityFrameworkCore.DbContext.SaveChanges() | property Street of element of property Addresses of element of property Persons of argument -1 -> property Street of element of return (jump to get_Addresses) | true |
| Microsoft.EntityFrameworkCore.DbContext.SaveChanges() | property Street of element of property Addresses of element of property Persons of argument -1 -> property Street of property Address of element of return (jump to get_PersonAddresses) | true |
| Microsoft.EntityFrameworkCore.DbContext.SaveChanges() | property Street of property Address of element of property PersonAddresses of argument -1 -> property Street of element of property Addresses of element of return (jump to get_Persons) | true |
| Microsoft.EntityFrameworkCore.DbContext.SaveChanges() | property Street of property Address of element of property PersonAddresses of argument -1 -> property Street of element of return (jump to get_Addresses) | true |
| Microsoft.EntityFrameworkCore.DbContext.SaveChanges() | property Street of property Address of element of property PersonAddresses of argument -1 -> property Street of property Address of element of return (jump to get_PersonAddresses) | true |
| Microsoft.EntityFrameworkCore.DbContext.SaveChangesAsync() | property AddressId of element of property PersonAddresses of argument -1 -> property AddressId of element of return (jump to get_PersonAddresses) | true |
| Microsoft.EntityFrameworkCore.DbContext.SaveChangesAsync() | property Id of element of property Addresses of argument -1 -> property Id of element of property Addresses of element of return (jump to get_Persons) | true |
| Microsoft.EntityFrameworkCore.DbContext.SaveChangesAsync() | property Id of element of property Addresses of argument -1 -> property Id of element of return (jump to get_Addresses) | true |
| Microsoft.EntityFrameworkCore.DbContext.SaveChangesAsync() | property Id of element of property Addresses of argument -1 -> property Id of property Address of element of return (jump to get_PersonAddresses) | true |
| Microsoft.EntityFrameworkCore.DbContext.SaveChangesAsync() | property Id of element of property Addresses of element of property Persons of argument -1 -> property Id of element of property Addresses of element of return (jump to get_Persons) | true |
| Microsoft.EntityFrameworkCore.DbContext.SaveChangesAsync() | property Id of element of property Addresses of element of property Persons of argument -1 -> property Id of element of return (jump to get_Addresses) | true |
| Microsoft.EntityFrameworkCore.DbContext.SaveChangesAsync() | property Id of element of property Addresses of element of property Persons of argument -1 -> property Id of property Address of element of return (jump to get_PersonAddresses) | true |
| Microsoft.EntityFrameworkCore.DbContext.SaveChangesAsync() | property Id of element of property PersonAddresses of argument -1 -> property Id of element of return (jump to get_PersonAddresses) | true |
| Microsoft.EntityFrameworkCore.DbContext.SaveChangesAsync() | property Id of element of property Persons of argument -1 -> property Id of element of return (jump to get_Persons) | true |
| Microsoft.EntityFrameworkCore.DbContext.SaveChangesAsync() | property Id of element of property Persons of argument -1 -> property Id of property Person of element of return (jump to get_PersonAddresses) | true |
| Microsoft.EntityFrameworkCore.DbContext.SaveChangesAsync() | property Id of property Address of element of property PersonAddresses of argument -1 -> property Id of element of property Addresses of element of return (jump to get_Persons) | true |
| Microsoft.EntityFrameworkCore.DbContext.SaveChangesAsync() | property Id of property Address of element of property PersonAddresses of argument -1 -> property Id of element of return (jump to get_Addresses) | true |
| Microsoft.EntityFrameworkCore.DbContext.SaveChangesAsync() | property Id of property Address of element of property PersonAddresses of argument -1 -> property Id of property Address of element of return (jump to get_PersonAddresses) | true |
| Microsoft.EntityFrameworkCore.DbContext.SaveChangesAsync() | property Id of property Person of element of property PersonAddresses of argument -1 -> property Id of element of return (jump to get_Persons) | true |
| Microsoft.EntityFrameworkCore.DbContext.SaveChangesAsync() | property Id of property Person of element of property PersonAddresses of argument -1 -> property Id of property Person of element of return (jump to get_PersonAddresses) | true |
| Microsoft.EntityFrameworkCore.DbContext.SaveChangesAsync() | property Name of element of property Persons of argument -1 -> property Name of element of return (jump to get_Persons) | true |
| Microsoft.EntityFrameworkCore.DbContext.SaveChangesAsync() | property Name of element of property Persons of argument -1 -> property Name of property Person of element of return (jump to get_PersonAddresses) | true |
| Microsoft.EntityFrameworkCore.DbContext.SaveChangesAsync() | property Name of property Person of element of property PersonAddresses of argument -1 -> property Name of element of return (jump to get_Persons) | true |
| Microsoft.EntityFrameworkCore.DbContext.SaveChangesAsync() | property Name of property Person of element of property PersonAddresses of argument -1 -> property Name of property Person of element of return (jump to get_PersonAddresses) | true |
| Microsoft.EntityFrameworkCore.DbContext.SaveChangesAsync() | property PersonId of element of property PersonAddresses of argument -1 -> property PersonId of element of return (jump to get_PersonAddresses) | true |
| Microsoft.EntityFrameworkCore.DbContext.SaveChangesAsync() | property Street of element of property Addresses of argument -1 -> property Street of element of property Addresses of element of return (jump to get_Persons) | true |
| Microsoft.EntityFrameworkCore.DbContext.SaveChangesAsync() | property Street of element of property Addresses of argument -1 -> property Street of element of return (jump to get_Addresses) | true |
| Microsoft.EntityFrameworkCore.DbContext.SaveChangesAsync() | property Street of element of property Addresses of argument -1 -> property Street of property Address of element of return (jump to get_PersonAddresses) | true |
| Microsoft.EntityFrameworkCore.DbContext.SaveChangesAsync() | property Street of element of property Addresses of element of property Persons of argument -1 -> property Street of element of property Addresses of element of return (jump to get_Persons) | true |
| Microsoft.EntityFrameworkCore.DbContext.SaveChangesAsync() | property Street of element of property Addresses of element of property Persons of argument -1 -> property Street of element of return (jump to get_Addresses) | true |
| Microsoft.EntityFrameworkCore.DbContext.SaveChangesAsync() | property Street of element of property Addresses of element of property Persons of argument -1 -> property Street of property Address of element of return (jump to get_PersonAddresses) | true |
| Microsoft.EntityFrameworkCore.DbContext.SaveChangesAsync() | property Street of property Address of element of property PersonAddresses of argument -1 -> property Street of element of property Addresses of element of return (jump to get_Persons) | true |
| Microsoft.EntityFrameworkCore.DbContext.SaveChangesAsync() | property Street of property Address of element of property PersonAddresses of argument -1 -> property Street of element of return (jump to get_Addresses) | true |
| Microsoft.EntityFrameworkCore.DbContext.SaveChangesAsync() | property Street of property Address of element of property PersonAddresses of argument -1 -> property Street of property Address of element of return (jump to get_PersonAddresses) | true |
| Microsoft.EntityFrameworkCore.DbSet<>.Add(T) | argument 0 -> element of argument -1 | true |
| Microsoft.EntityFrameworkCore.DbSet<>.AddAsync(T) | argument 0 -> element of argument -1 | true |
| Microsoft.EntityFrameworkCore.DbSet<>.AddRange(IEnumerable<T>) | element of argument 0 -> element of argument -1 | true |
| Microsoft.EntityFrameworkCore.DbSet<>.AddRangeAsync(IEnumerable<T>) | element of argument 0 -> element of argument -1 | true |
| Microsoft.EntityFrameworkCore.DbSet<>.Attach(T) | argument 0 -> element of argument -1 | true |
| Microsoft.EntityFrameworkCore.DbSet<>.AttachRange(IEnumerable<T>) | element of argument 0 -> element of argument -1 | true |
| Microsoft.EntityFrameworkCore.DbSet<>.Update(T) | argument 0 -> element of argument -1 | true |
| Microsoft.EntityFrameworkCore.DbSet<>.UpdateRange(IEnumerable<T>) | element of argument 0 -> element of argument -1 | true |
| Microsoft.EntityFrameworkCore.RawSqlString.RawSqlString(string) | argument 0 -> return (normal) | false |
| Microsoft.EntityFrameworkCore.RawSqlString.implicit conversion(string) | argument 0 -> return (normal) | false |
| System.Data.Entity.DbContext.SaveChanges() | property AddressId of element of property PersonAddresses of argument -1 -> property AddressId of element of return (jump to get_PersonAddresses) | true |
| System.Data.Entity.DbContext.SaveChanges() | property Id of element of property Addresses of argument -1 -> property Id of element of property Addresses of element of return (jump to get_Persons) | true |
| System.Data.Entity.DbContext.SaveChanges() | property Id of element of property Addresses of argument -1 -> property Id of element of return (jump to get_Addresses) | true |
| System.Data.Entity.DbContext.SaveChanges() | property Id of element of property Addresses of argument -1 -> property Id of property Address of element of return (jump to get_PersonAddresses) | true |
| System.Data.Entity.DbContext.SaveChanges() | property Id of element of property Addresses of element of property Persons of argument -1 -> property Id of element of property Addresses of element of return (jump to get_Persons) | true |
| System.Data.Entity.DbContext.SaveChanges() | property Id of element of property Addresses of element of property Persons of argument -1 -> property Id of element of return (jump to get_Addresses) | true |
| System.Data.Entity.DbContext.SaveChanges() | property Id of element of property Addresses of element of property Persons of argument -1 -> property Id of property Address of element of return (jump to get_PersonAddresses) | true |
| System.Data.Entity.DbContext.SaveChanges() | property Id of element of property PersonAddresses of argument -1 -> property Id of element of return (jump to get_PersonAddresses) | true |
| System.Data.Entity.DbContext.SaveChanges() | property Id of element of property Persons of argument -1 -> property Id of element of return (jump to get_Persons) | true |
| System.Data.Entity.DbContext.SaveChanges() | property Id of element of property Persons of argument -1 -> property Id of property Person of element of return (jump to get_PersonAddresses) | true |
| System.Data.Entity.DbContext.SaveChanges() | property Id of property Address of element of property PersonAddresses of argument -1 -> property Id of element of property Addresses of element of return (jump to get_Persons) | true |
| System.Data.Entity.DbContext.SaveChanges() | property Id of property Address of element of property PersonAddresses of argument -1 -> property Id of element of return (jump to get_Addresses) | true |
| System.Data.Entity.DbContext.SaveChanges() | property Id of property Address of element of property PersonAddresses of argument -1 -> property Id of property Address of element of return (jump to get_PersonAddresses) | true |
| System.Data.Entity.DbContext.SaveChanges() | property Id of property Person of element of property PersonAddresses of argument -1 -> property Id of element of return (jump to get_Persons) | true |
| System.Data.Entity.DbContext.SaveChanges() | property Id of property Person of element of property PersonAddresses of argument -1 -> property Id of property Person of element of return (jump to get_PersonAddresses) | true |
| System.Data.Entity.DbContext.SaveChanges() | property Name of element of property Persons of argument -1 -> property Name of element of return (jump to get_Persons) | true |
| System.Data.Entity.DbContext.SaveChanges() | property Name of element of property Persons of argument -1 -> property Name of property Person of element of return (jump to get_PersonAddresses) | true |
| System.Data.Entity.DbContext.SaveChanges() | property Name of property Person of element of property PersonAddresses of argument -1 -> property Name of element of return (jump to get_Persons) | true |
| System.Data.Entity.DbContext.SaveChanges() | property Name of property Person of element of property PersonAddresses of argument -1 -> property Name of property Person of element of return (jump to get_PersonAddresses) | true |
| System.Data.Entity.DbContext.SaveChanges() | property PersonId of element of property PersonAddresses of argument -1 -> property PersonId of element of return (jump to get_PersonAddresses) | true |
| System.Data.Entity.DbContext.SaveChanges() | property Street of element of property Addresses of argument -1 -> property Street of element of property Addresses of element of return (jump to get_Persons) | true |
| System.Data.Entity.DbContext.SaveChanges() | property Street of element of property Addresses of argument -1 -> property Street of element of return (jump to get_Addresses) | true |
| System.Data.Entity.DbContext.SaveChanges() | property Street of element of property Addresses of argument -1 -> property Street of property Address of element of return (jump to get_PersonAddresses) | true |
| System.Data.Entity.DbContext.SaveChanges() | property Street of element of property Addresses of element of property Persons of argument -1 -> property Street of element of property Addresses of element of return (jump to get_Persons) | true |
| System.Data.Entity.DbContext.SaveChanges() | property Street of element of property Addresses of element of property Persons of argument -1 -> property Street of element of return (jump to get_Addresses) | true |
| System.Data.Entity.DbContext.SaveChanges() | property Street of element of property Addresses of element of property Persons of argument -1 -> property Street of property Address of element of return (jump to get_PersonAddresses) | true |
| System.Data.Entity.DbContext.SaveChanges() | property Street of property Address of element of property PersonAddresses of argument -1 -> property Street of element of property Addresses of element of return (jump to get_Persons) | true |
| System.Data.Entity.DbContext.SaveChanges() | property Street of property Address of element of property PersonAddresses of argument -1 -> property Street of element of return (jump to get_Addresses) | true |
| System.Data.Entity.DbContext.SaveChanges() | property Street of property Address of element of property PersonAddresses of argument -1 -> property Street of property Address of element of return (jump to get_PersonAddresses) | true |
| System.Data.Entity.DbContext.SaveChangesAsync() | property AddressId of element of property PersonAddresses of argument -1 -> property AddressId of element of return (jump to get_PersonAddresses) | true |
| System.Data.Entity.DbContext.SaveChangesAsync() | property Id of element of property Addresses of argument -1 -> property Id of element of property Addresses of element of return (jump to get_Persons) | true |
| System.Data.Entity.DbContext.SaveChangesAsync() | property Id of element of property Addresses of argument -1 -> property Id of element of return (jump to get_Addresses) | true |
| System.Data.Entity.DbContext.SaveChangesAsync() | property Id of element of property Addresses of argument -1 -> property Id of property Address of element of return (jump to get_PersonAddresses) | true |
| System.Data.Entity.DbContext.SaveChangesAsync() | property Id of element of property Addresses of element of property Persons of argument -1 -> property Id of element of property Addresses of element of return (jump to get_Persons) | true |
| System.Data.Entity.DbContext.SaveChangesAsync() | property Id of element of property Addresses of element of property Persons of argument -1 -> property Id of element of return (jump to get_Addresses) | true |
| System.Data.Entity.DbContext.SaveChangesAsync() | property Id of element of property Addresses of element of property Persons of argument -1 -> property Id of property Address of element of return (jump to get_PersonAddresses) | true |
| System.Data.Entity.DbContext.SaveChangesAsync() | property Id of element of property PersonAddresses of argument -1 -> property Id of element of return (jump to get_PersonAddresses) | true |
| System.Data.Entity.DbContext.SaveChangesAsync() | property Id of element of property Persons of argument -1 -> property Id of element of return (jump to get_Persons) | true |
| System.Data.Entity.DbContext.SaveChangesAsync() | property Id of element of property Persons of argument -1 -> property Id of property Person of element of return (jump to get_PersonAddresses) | true |
| System.Data.Entity.DbContext.SaveChangesAsync() | property Id of property Address of element of property PersonAddresses of argument -1 -> property Id of element of property Addresses of element of return (jump to get_Persons) | true |
| System.Data.Entity.DbContext.SaveChangesAsync() | property Id of property Address of element of property PersonAddresses of argument -1 -> property Id of element of return (jump to get_Addresses) | true |
| System.Data.Entity.DbContext.SaveChangesAsync() | property Id of property Address of element of property PersonAddresses of argument -1 -> property Id of property Address of element of return (jump to get_PersonAddresses) | true |
| System.Data.Entity.DbContext.SaveChangesAsync() | property Id of property Person of element of property PersonAddresses of argument -1 -> property Id of element of return (jump to get_Persons) | true |
| System.Data.Entity.DbContext.SaveChangesAsync() | property Id of property Person of element of property PersonAddresses of argument -1 -> property Id of property Person of element of return (jump to get_PersonAddresses) | true |
| System.Data.Entity.DbContext.SaveChangesAsync() | property Name of element of property Persons of argument -1 -> property Name of element of return (jump to get_Persons) | true |
| System.Data.Entity.DbContext.SaveChangesAsync() | property Name of element of property Persons of argument -1 -> property Name of property Person of element of return (jump to get_PersonAddresses) | true |
| System.Data.Entity.DbContext.SaveChangesAsync() | property Name of property Person of element of property PersonAddresses of argument -1 -> property Name of element of return (jump to get_Persons) | true |
| System.Data.Entity.DbContext.SaveChangesAsync() | property Name of property Person of element of property PersonAddresses of argument -1 -> property Name of property Person of element of return (jump to get_PersonAddresses) | true |
| System.Data.Entity.DbContext.SaveChangesAsync() | property PersonId of element of property PersonAddresses of argument -1 -> property PersonId of element of return (jump to get_PersonAddresses) | true |
| System.Data.Entity.DbContext.SaveChangesAsync() | property Street of element of property Addresses of argument -1 -> property Street of element of property Addresses of element of return (jump to get_Persons) | true |
| System.Data.Entity.DbContext.SaveChangesAsync() | property Street of element of property Addresses of argument -1 -> property Street of element of return (jump to get_Addresses) | true |
| System.Data.Entity.DbContext.SaveChangesAsync() | property Street of element of property Addresses of argument -1 -> property Street of property Address of element of return (jump to get_PersonAddresses) | true |
| System.Data.Entity.DbContext.SaveChangesAsync() | property Street of element of property Addresses of element of property Persons of argument -1 -> property Street of element of property Addresses of element of return (jump to get_Persons) | true |
| System.Data.Entity.DbContext.SaveChangesAsync() | property Street of element of property Addresses of element of property Persons of argument -1 -> property Street of element of return (jump to get_Addresses) | true |
| System.Data.Entity.DbContext.SaveChangesAsync() | property Street of element of property Addresses of element of property Persons of argument -1 -> property Street of property Address of element of return (jump to get_PersonAddresses) | true |
| System.Data.Entity.DbContext.SaveChangesAsync() | property Street of property Address of element of property PersonAddresses of argument -1 -> property Street of element of property Addresses of element of return (jump to get_Persons) | true |
| System.Data.Entity.DbContext.SaveChangesAsync() | property Street of property Address of element of property PersonAddresses of argument -1 -> property Street of element of return (jump to get_Addresses) | true |
| System.Data.Entity.DbContext.SaveChangesAsync() | property Street of property Address of element of property PersonAddresses of argument -1 -> property Street of property Address of element of return (jump to get_PersonAddresses) | true |
| System.Data.Entity.DbSet<>.Add(T) | argument 0 -> element of argument -1 | true |
| System.Data.Entity.DbSet<>.AddAsync(T) | argument 0 -> element of argument -1 | true |
| System.Data.Entity.DbSet<>.AddRange(IEnumerable<T>) | element of argument 0 -> element of argument -1 | true |
| System.Data.Entity.DbSet<>.AddRangeAsync(IEnumerable<T>) | element of argument 0 -> element of argument -1 | true |
| System.Data.Entity.DbSet<>.Attach(T) | argument 0 -> element of argument -1 | true |
| System.Data.Entity.DbSet<>.AttachRange(IEnumerable<T>) | element of argument 0 -> element of argument -1 | true |
| System.Data.Entity.DbSet<>.Update(T) | argument 0 -> element of argument -1 | true |
| System.Data.Entity.DbSet<>.UpdateRange(IEnumerable<T>) | element of argument 0 -> element of argument -1 | true |
| Microsoft.EntityFrameworkCore;DbContext;false;SaveChanges;();;Property[EFCoreTests.Address.Id] of Element of Property[EFCoreTests.MyContext.Addresses] of Argument[-1];Property[EFCoreTests.Address.Id] of Element of Property[EFCoreTests.Person.Addresses] of Element of ReturnValue[jump to get_Persons];value |
| Microsoft.EntityFrameworkCore;DbContext;false;SaveChanges;();;Property[EFCoreTests.Address.Id] of Element of Property[EFCoreTests.MyContext.Addresses] of Argument[-1];Property[EFCoreTests.Address.Id] of Element of ReturnValue[jump to get_Addresses];value |
| Microsoft.EntityFrameworkCore;DbContext;false;SaveChanges;();;Property[EFCoreTests.Address.Id] of Element of Property[EFCoreTests.MyContext.Addresses] of Argument[-1];Property[EFCoreTests.Address.Id] of Property[EFCoreTests.PersonAddressMap.Address] of Element of ReturnValue[jump to get_PersonAddresses];value |
| Microsoft.EntityFrameworkCore;DbContext;false;SaveChanges;();;Property[EFCoreTests.Address.Id] of Element of Property[EFCoreTests.Person.Addresses] of Element of Property[EFCoreTests.MyContext.Persons] of Argument[-1];Property[EFCoreTests.Address.Id] of Element of Property[EFCoreTests.Person.Addresses] of Element of ReturnValue[jump to get_Persons];value |
| Microsoft.EntityFrameworkCore;DbContext;false;SaveChanges;();;Property[EFCoreTests.Address.Id] of Element of Property[EFCoreTests.Person.Addresses] of Element of Property[EFCoreTests.MyContext.Persons] of Argument[-1];Property[EFCoreTests.Address.Id] of Element of ReturnValue[jump to get_Addresses];value |
| Microsoft.EntityFrameworkCore;DbContext;false;SaveChanges;();;Property[EFCoreTests.Address.Id] of Element of Property[EFCoreTests.Person.Addresses] of Element of Property[EFCoreTests.MyContext.Persons] of Argument[-1];Property[EFCoreTests.Address.Id] of Property[EFCoreTests.PersonAddressMap.Address] of Element of ReturnValue[jump to get_PersonAddresses];value |
| Microsoft.EntityFrameworkCore;DbContext;false;SaveChanges;();;Property[EFCoreTests.Address.Id] of Property[EFCoreTests.PersonAddressMap.Address] of Element of Property[EFCoreTests.MyContext.PersonAddresses] of Argument[-1];Property[EFCoreTests.Address.Id] of Element of Property[EFCoreTests.Person.Addresses] of Element of ReturnValue[jump to get_Persons];value |
| Microsoft.EntityFrameworkCore;DbContext;false;SaveChanges;();;Property[EFCoreTests.Address.Id] of Property[EFCoreTests.PersonAddressMap.Address] of Element of Property[EFCoreTests.MyContext.PersonAddresses] of Argument[-1];Property[EFCoreTests.Address.Id] of Element of ReturnValue[jump to get_Addresses];value |
| Microsoft.EntityFrameworkCore;DbContext;false;SaveChanges;();;Property[EFCoreTests.Address.Id] of Property[EFCoreTests.PersonAddressMap.Address] of Element of Property[EFCoreTests.MyContext.PersonAddresses] of Argument[-1];Property[EFCoreTests.Address.Id] of Property[EFCoreTests.PersonAddressMap.Address] of Element of ReturnValue[jump to get_PersonAddresses];value |
| Microsoft.EntityFrameworkCore;DbContext;false;SaveChanges;();;Property[EFCoreTests.Address.Street] of Element of Property[EFCoreTests.MyContext.Addresses] of Argument[-1];Property[EFCoreTests.Address.Street] of Element of Property[EFCoreTests.Person.Addresses] of Element of ReturnValue[jump to get_Persons];value |
| Microsoft.EntityFrameworkCore;DbContext;false;SaveChanges;();;Property[EFCoreTests.Address.Street] of Element of Property[EFCoreTests.MyContext.Addresses] of Argument[-1];Property[EFCoreTests.Address.Street] of Element of ReturnValue[jump to get_Addresses];value |
| Microsoft.EntityFrameworkCore;DbContext;false;SaveChanges;();;Property[EFCoreTests.Address.Street] of Element of Property[EFCoreTests.MyContext.Addresses] of Argument[-1];Property[EFCoreTests.Address.Street] of Property[EFCoreTests.PersonAddressMap.Address] of Element of ReturnValue[jump to get_PersonAddresses];value |
| Microsoft.EntityFrameworkCore;DbContext;false;SaveChanges;();;Property[EFCoreTests.Address.Street] of Element of Property[EFCoreTests.Person.Addresses] of Element of Property[EFCoreTests.MyContext.Persons] of Argument[-1];Property[EFCoreTests.Address.Street] of Element of Property[EFCoreTests.Person.Addresses] of Element of ReturnValue[jump to get_Persons];value |
| Microsoft.EntityFrameworkCore;DbContext;false;SaveChanges;();;Property[EFCoreTests.Address.Street] of Element of Property[EFCoreTests.Person.Addresses] of Element of Property[EFCoreTests.MyContext.Persons] of Argument[-1];Property[EFCoreTests.Address.Street] of Element of ReturnValue[jump to get_Addresses];value |
| Microsoft.EntityFrameworkCore;DbContext;false;SaveChanges;();;Property[EFCoreTests.Address.Street] of Element of Property[EFCoreTests.Person.Addresses] of Element of Property[EFCoreTests.MyContext.Persons] of Argument[-1];Property[EFCoreTests.Address.Street] of Property[EFCoreTests.PersonAddressMap.Address] of Element of ReturnValue[jump to get_PersonAddresses];value |
| Microsoft.EntityFrameworkCore;DbContext;false;SaveChanges;();;Property[EFCoreTests.Address.Street] of Property[EFCoreTests.PersonAddressMap.Address] of Element of Property[EFCoreTests.MyContext.PersonAddresses] of Argument[-1];Property[EFCoreTests.Address.Street] of Element of Property[EFCoreTests.Person.Addresses] of Element of ReturnValue[jump to get_Persons];value |
| Microsoft.EntityFrameworkCore;DbContext;false;SaveChanges;();;Property[EFCoreTests.Address.Street] of Property[EFCoreTests.PersonAddressMap.Address] of Element of Property[EFCoreTests.MyContext.PersonAddresses] of Argument[-1];Property[EFCoreTests.Address.Street] of Element of ReturnValue[jump to get_Addresses];value |
| Microsoft.EntityFrameworkCore;DbContext;false;SaveChanges;();;Property[EFCoreTests.Address.Street] of Property[EFCoreTests.PersonAddressMap.Address] of Element of Property[EFCoreTests.MyContext.PersonAddresses] of Argument[-1];Property[EFCoreTests.Address.Street] of Property[EFCoreTests.PersonAddressMap.Address] of Element of ReturnValue[jump to get_PersonAddresses];value |
| Microsoft.EntityFrameworkCore;DbContext;false;SaveChanges;();;Property[EFCoreTests.Person.Id] of Element of Property[EFCoreTests.MyContext.Persons] of Argument[-1];Property[EFCoreTests.Person.Id] of Element of ReturnValue[jump to get_Persons];value |
| Microsoft.EntityFrameworkCore;DbContext;false;SaveChanges;();;Property[EFCoreTests.Person.Id] of Element of Property[EFCoreTests.MyContext.Persons] of Argument[-1];Property[EFCoreTests.Person.Id] of Property[EFCoreTests.PersonAddressMap.Person] of Element of ReturnValue[jump to get_PersonAddresses];value |
| Microsoft.EntityFrameworkCore;DbContext;false;SaveChanges;();;Property[EFCoreTests.Person.Id] of Property[EFCoreTests.PersonAddressMap.Person] of Element of Property[EFCoreTests.MyContext.PersonAddresses] of Argument[-1];Property[EFCoreTests.Person.Id] of Element of ReturnValue[jump to get_Persons];value |
| Microsoft.EntityFrameworkCore;DbContext;false;SaveChanges;();;Property[EFCoreTests.Person.Id] of Property[EFCoreTests.PersonAddressMap.Person] of Element of Property[EFCoreTests.MyContext.PersonAddresses] of Argument[-1];Property[EFCoreTests.Person.Id] of Property[EFCoreTests.PersonAddressMap.Person] of Element of ReturnValue[jump to get_PersonAddresses];value |
| Microsoft.EntityFrameworkCore;DbContext;false;SaveChanges;();;Property[EFCoreTests.Person.Name] of Element of Property[EFCoreTests.MyContext.Persons] of Argument[-1];Property[EFCoreTests.Person.Name] of Element of ReturnValue[jump to get_Persons];value |
| Microsoft.EntityFrameworkCore;DbContext;false;SaveChanges;();;Property[EFCoreTests.Person.Name] of Element of Property[EFCoreTests.MyContext.Persons] of Argument[-1];Property[EFCoreTests.Person.Name] of Property[EFCoreTests.PersonAddressMap.Person] of Element of ReturnValue[jump to get_PersonAddresses];value |
| Microsoft.EntityFrameworkCore;DbContext;false;SaveChanges;();;Property[EFCoreTests.Person.Name] of Property[EFCoreTests.PersonAddressMap.Person] of Element of Property[EFCoreTests.MyContext.PersonAddresses] of Argument[-1];Property[EFCoreTests.Person.Name] of Element of ReturnValue[jump to get_Persons];value |
| Microsoft.EntityFrameworkCore;DbContext;false;SaveChanges;();;Property[EFCoreTests.Person.Name] of Property[EFCoreTests.PersonAddressMap.Person] of Element of Property[EFCoreTests.MyContext.PersonAddresses] of Argument[-1];Property[EFCoreTests.Person.Name] of Property[EFCoreTests.PersonAddressMap.Person] of Element of ReturnValue[jump to get_PersonAddresses];value |
| Microsoft.EntityFrameworkCore;DbContext;false;SaveChanges;();;Property[EFCoreTests.PersonAddressMap.AddressId] of Element of Property[EFCoreTests.MyContext.PersonAddresses] of Argument[-1];Property[EFCoreTests.PersonAddressMap.AddressId] of Element of ReturnValue[jump to get_PersonAddresses];value |
| Microsoft.EntityFrameworkCore;DbContext;false;SaveChanges;();;Property[EFCoreTests.PersonAddressMap.Id] of Element of Property[EFCoreTests.MyContext.PersonAddresses] of Argument[-1];Property[EFCoreTests.PersonAddressMap.Id] of Element of ReturnValue[jump to get_PersonAddresses];value |
| Microsoft.EntityFrameworkCore;DbContext;false;SaveChanges;();;Property[EFCoreTests.PersonAddressMap.PersonId] of Element of Property[EFCoreTests.MyContext.PersonAddresses] of Argument[-1];Property[EFCoreTests.PersonAddressMap.PersonId] of Element of ReturnValue[jump to get_PersonAddresses];value |
| Microsoft.EntityFrameworkCore;DbContext;false;SaveChangesAsync;();;Property[EFCoreTests.Address.Id] of Element of Property[EFCoreTests.MyContext.Addresses] of Argument[-1];Property[EFCoreTests.Address.Id] of Element of Property[EFCoreTests.Person.Addresses] of Element of ReturnValue[jump to get_Persons];value |
| Microsoft.EntityFrameworkCore;DbContext;false;SaveChangesAsync;();;Property[EFCoreTests.Address.Id] of Element of Property[EFCoreTests.MyContext.Addresses] of Argument[-1];Property[EFCoreTests.Address.Id] of Element of ReturnValue[jump to get_Addresses];value |
| Microsoft.EntityFrameworkCore;DbContext;false;SaveChangesAsync;();;Property[EFCoreTests.Address.Id] of Element of Property[EFCoreTests.MyContext.Addresses] of Argument[-1];Property[EFCoreTests.Address.Id] of Property[EFCoreTests.PersonAddressMap.Address] of Element of ReturnValue[jump to get_PersonAddresses];value |
| Microsoft.EntityFrameworkCore;DbContext;false;SaveChangesAsync;();;Property[EFCoreTests.Address.Id] of Element of Property[EFCoreTests.Person.Addresses] of Element of Property[EFCoreTests.MyContext.Persons] of Argument[-1];Property[EFCoreTests.Address.Id] of Element of Property[EFCoreTests.Person.Addresses] of Element of ReturnValue[jump to get_Persons];value |
| Microsoft.EntityFrameworkCore;DbContext;false;SaveChangesAsync;();;Property[EFCoreTests.Address.Id] of Element of Property[EFCoreTests.Person.Addresses] of Element of Property[EFCoreTests.MyContext.Persons] of Argument[-1];Property[EFCoreTests.Address.Id] of Element of ReturnValue[jump to get_Addresses];value |
| Microsoft.EntityFrameworkCore;DbContext;false;SaveChangesAsync;();;Property[EFCoreTests.Address.Id] of Element of Property[EFCoreTests.Person.Addresses] of Element of Property[EFCoreTests.MyContext.Persons] of Argument[-1];Property[EFCoreTests.Address.Id] of Property[EFCoreTests.PersonAddressMap.Address] of Element of ReturnValue[jump to get_PersonAddresses];value |
| Microsoft.EntityFrameworkCore;DbContext;false;SaveChangesAsync;();;Property[EFCoreTests.Address.Id] of Property[EFCoreTests.PersonAddressMap.Address] of Element of Property[EFCoreTests.MyContext.PersonAddresses] of Argument[-1];Property[EFCoreTests.Address.Id] of Element of Property[EFCoreTests.Person.Addresses] of Element of ReturnValue[jump to get_Persons];value |
| Microsoft.EntityFrameworkCore;DbContext;false;SaveChangesAsync;();;Property[EFCoreTests.Address.Id] of Property[EFCoreTests.PersonAddressMap.Address] of Element of Property[EFCoreTests.MyContext.PersonAddresses] of Argument[-1];Property[EFCoreTests.Address.Id] of Element of ReturnValue[jump to get_Addresses];value |
| Microsoft.EntityFrameworkCore;DbContext;false;SaveChangesAsync;();;Property[EFCoreTests.Address.Id] of Property[EFCoreTests.PersonAddressMap.Address] of Element of Property[EFCoreTests.MyContext.PersonAddresses] of Argument[-1];Property[EFCoreTests.Address.Id] of Property[EFCoreTests.PersonAddressMap.Address] of Element of ReturnValue[jump to get_PersonAddresses];value |
| Microsoft.EntityFrameworkCore;DbContext;false;SaveChangesAsync;();;Property[EFCoreTests.Address.Street] of Element of Property[EFCoreTests.MyContext.Addresses] of Argument[-1];Property[EFCoreTests.Address.Street] of Element of Property[EFCoreTests.Person.Addresses] of Element of ReturnValue[jump to get_Persons];value |
| Microsoft.EntityFrameworkCore;DbContext;false;SaveChangesAsync;();;Property[EFCoreTests.Address.Street] of Element of Property[EFCoreTests.MyContext.Addresses] of Argument[-1];Property[EFCoreTests.Address.Street] of Element of ReturnValue[jump to get_Addresses];value |
| Microsoft.EntityFrameworkCore;DbContext;false;SaveChangesAsync;();;Property[EFCoreTests.Address.Street] of Element of Property[EFCoreTests.MyContext.Addresses] of Argument[-1];Property[EFCoreTests.Address.Street] of Property[EFCoreTests.PersonAddressMap.Address] of Element of ReturnValue[jump to get_PersonAddresses];value |
| Microsoft.EntityFrameworkCore;DbContext;false;SaveChangesAsync;();;Property[EFCoreTests.Address.Street] of Element of Property[EFCoreTests.Person.Addresses] of Element of Property[EFCoreTests.MyContext.Persons] of Argument[-1];Property[EFCoreTests.Address.Street] of Element of Property[EFCoreTests.Person.Addresses] of Element of ReturnValue[jump to get_Persons];value |
| Microsoft.EntityFrameworkCore;DbContext;false;SaveChangesAsync;();;Property[EFCoreTests.Address.Street] of Element of Property[EFCoreTests.Person.Addresses] of Element of Property[EFCoreTests.MyContext.Persons] of Argument[-1];Property[EFCoreTests.Address.Street] of Element of ReturnValue[jump to get_Addresses];value |
| Microsoft.EntityFrameworkCore;DbContext;false;SaveChangesAsync;();;Property[EFCoreTests.Address.Street] of Element of Property[EFCoreTests.Person.Addresses] of Element of Property[EFCoreTests.MyContext.Persons] of Argument[-1];Property[EFCoreTests.Address.Street] of Property[EFCoreTests.PersonAddressMap.Address] of Element of ReturnValue[jump to get_PersonAddresses];value |
| Microsoft.EntityFrameworkCore;DbContext;false;SaveChangesAsync;();;Property[EFCoreTests.Address.Street] of Property[EFCoreTests.PersonAddressMap.Address] of Element of Property[EFCoreTests.MyContext.PersonAddresses] of Argument[-1];Property[EFCoreTests.Address.Street] of Element of Property[EFCoreTests.Person.Addresses] of Element of ReturnValue[jump to get_Persons];value |
| Microsoft.EntityFrameworkCore;DbContext;false;SaveChangesAsync;();;Property[EFCoreTests.Address.Street] of Property[EFCoreTests.PersonAddressMap.Address] of Element of Property[EFCoreTests.MyContext.PersonAddresses] of Argument[-1];Property[EFCoreTests.Address.Street] of Element of ReturnValue[jump to get_Addresses];value |
| Microsoft.EntityFrameworkCore;DbContext;false;SaveChangesAsync;();;Property[EFCoreTests.Address.Street] of Property[EFCoreTests.PersonAddressMap.Address] of Element of Property[EFCoreTests.MyContext.PersonAddresses] of Argument[-1];Property[EFCoreTests.Address.Street] of Property[EFCoreTests.PersonAddressMap.Address] of Element of ReturnValue[jump to get_PersonAddresses];value |
| Microsoft.EntityFrameworkCore;DbContext;false;SaveChangesAsync;();;Property[EFCoreTests.Person.Id] of Element of Property[EFCoreTests.MyContext.Persons] of Argument[-1];Property[EFCoreTests.Person.Id] of Element of ReturnValue[jump to get_Persons];value |
| Microsoft.EntityFrameworkCore;DbContext;false;SaveChangesAsync;();;Property[EFCoreTests.Person.Id] of Element of Property[EFCoreTests.MyContext.Persons] of Argument[-1];Property[EFCoreTests.Person.Id] of Property[EFCoreTests.PersonAddressMap.Person] of Element of ReturnValue[jump to get_PersonAddresses];value |
| Microsoft.EntityFrameworkCore;DbContext;false;SaveChangesAsync;();;Property[EFCoreTests.Person.Id] of Property[EFCoreTests.PersonAddressMap.Person] of Element of Property[EFCoreTests.MyContext.PersonAddresses] of Argument[-1];Property[EFCoreTests.Person.Id] of Element of ReturnValue[jump to get_Persons];value |
| Microsoft.EntityFrameworkCore;DbContext;false;SaveChangesAsync;();;Property[EFCoreTests.Person.Id] of Property[EFCoreTests.PersonAddressMap.Person] of Element of Property[EFCoreTests.MyContext.PersonAddresses] of Argument[-1];Property[EFCoreTests.Person.Id] of Property[EFCoreTests.PersonAddressMap.Person] of Element of ReturnValue[jump to get_PersonAddresses];value |
| Microsoft.EntityFrameworkCore;DbContext;false;SaveChangesAsync;();;Property[EFCoreTests.Person.Name] of Element of Property[EFCoreTests.MyContext.Persons] of Argument[-1];Property[EFCoreTests.Person.Name] of Element of ReturnValue[jump to get_Persons];value |
| Microsoft.EntityFrameworkCore;DbContext;false;SaveChangesAsync;();;Property[EFCoreTests.Person.Name] of Element of Property[EFCoreTests.MyContext.Persons] of Argument[-1];Property[EFCoreTests.Person.Name] of Property[EFCoreTests.PersonAddressMap.Person] of Element of ReturnValue[jump to get_PersonAddresses];value |
| Microsoft.EntityFrameworkCore;DbContext;false;SaveChangesAsync;();;Property[EFCoreTests.Person.Name] of Property[EFCoreTests.PersonAddressMap.Person] of Element of Property[EFCoreTests.MyContext.PersonAddresses] of Argument[-1];Property[EFCoreTests.Person.Name] of Element of ReturnValue[jump to get_Persons];value |
| Microsoft.EntityFrameworkCore;DbContext;false;SaveChangesAsync;();;Property[EFCoreTests.Person.Name] of Property[EFCoreTests.PersonAddressMap.Person] of Element of Property[EFCoreTests.MyContext.PersonAddresses] of Argument[-1];Property[EFCoreTests.Person.Name] of Property[EFCoreTests.PersonAddressMap.Person] of Element of ReturnValue[jump to get_PersonAddresses];value |
| Microsoft.EntityFrameworkCore;DbContext;false;SaveChangesAsync;();;Property[EFCoreTests.PersonAddressMap.AddressId] of Element of Property[EFCoreTests.MyContext.PersonAddresses] of Argument[-1];Property[EFCoreTests.PersonAddressMap.AddressId] of Element of ReturnValue[jump to get_PersonAddresses];value |
| Microsoft.EntityFrameworkCore;DbContext;false;SaveChangesAsync;();;Property[EFCoreTests.PersonAddressMap.Id] of Element of Property[EFCoreTests.MyContext.PersonAddresses] of Argument[-1];Property[EFCoreTests.PersonAddressMap.Id] of Element of ReturnValue[jump to get_PersonAddresses];value |
| Microsoft.EntityFrameworkCore;DbContext;false;SaveChangesAsync;();;Property[EFCoreTests.PersonAddressMap.PersonId] of Element of Property[EFCoreTests.MyContext.PersonAddresses] of Argument[-1];Property[EFCoreTests.PersonAddressMap.PersonId] of Element of ReturnValue[jump to get_PersonAddresses];value |
| Microsoft.EntityFrameworkCore;DbSet<>;false;Add;(T);;Argument[0];Element of Argument[-1];value |
| Microsoft.EntityFrameworkCore;DbSet<>;false;AddAsync;(T);;Argument[0];Element of Argument[-1];value |
| Microsoft.EntityFrameworkCore;DbSet<>;false;AddRange;(System.Collections.Generic.IEnumerable<T>);;Element of Argument[0];Element of Argument[-1];value |
| Microsoft.EntityFrameworkCore;DbSet<>;false;AddRangeAsync;(System.Collections.Generic.IEnumerable<T>);;Element of Argument[0];Element of Argument[-1];value |
| Microsoft.EntityFrameworkCore;DbSet<>;false;Attach;(T);;Argument[0];Element of Argument[-1];value |
| Microsoft.EntityFrameworkCore;DbSet<>;false;AttachRange;(System.Collections.Generic.IEnumerable<T>);;Element of Argument[0];Element of Argument[-1];value |
| Microsoft.EntityFrameworkCore;DbSet<>;false;Update;(T);;Argument[0];Element of Argument[-1];value |
| Microsoft.EntityFrameworkCore;DbSet<>;false;UpdateRange;(System.Collections.Generic.IEnumerable<T>);;Element of Argument[0];Element of Argument[-1];value |
| Microsoft.EntityFrameworkCore;RawSqlString;false;RawSqlString;(System.String);;Argument[0];ReturnValue;taint |
| Microsoft.EntityFrameworkCore;RawSqlString;false;implicit conversion;(System.String);;Argument[0];ReturnValue;taint |
| System.Data.Entity;DbContext;false;SaveChanges;();;Property[EFTests.Address.Id] of Element of Property[EFTests.MyContext.Addresses] of Argument[-1];Property[EFTests.Address.Id] of Element of Property[EFTests.Person.Addresses] of Element of ReturnValue[jump to get_Persons];value |
| System.Data.Entity;DbContext;false;SaveChanges;();;Property[EFTests.Address.Id] of Element of Property[EFTests.MyContext.Addresses] of Argument[-1];Property[EFTests.Address.Id] of Element of ReturnValue[jump to get_Addresses];value |
| System.Data.Entity;DbContext;false;SaveChanges;();;Property[EFTests.Address.Id] of Element of Property[EFTests.MyContext.Addresses] of Argument[-1];Property[EFTests.Address.Id] of Property[EFTests.PersonAddressMap.Address] of Element of ReturnValue[jump to get_PersonAddresses];value |
| System.Data.Entity;DbContext;false;SaveChanges;();;Property[EFTests.Address.Id] of Element of Property[EFTests.Person.Addresses] of Element of Property[EFTests.MyContext.Persons] of Argument[-1];Property[EFTests.Address.Id] of Element of Property[EFTests.Person.Addresses] of Element of ReturnValue[jump to get_Persons];value |
| System.Data.Entity;DbContext;false;SaveChanges;();;Property[EFTests.Address.Id] of Element of Property[EFTests.Person.Addresses] of Element of Property[EFTests.MyContext.Persons] of Argument[-1];Property[EFTests.Address.Id] of Element of ReturnValue[jump to get_Addresses];value |
| System.Data.Entity;DbContext;false;SaveChanges;();;Property[EFTests.Address.Id] of Element of Property[EFTests.Person.Addresses] of Element of Property[EFTests.MyContext.Persons] of Argument[-1];Property[EFTests.Address.Id] of Property[EFTests.PersonAddressMap.Address] of Element of ReturnValue[jump to get_PersonAddresses];value |
| System.Data.Entity;DbContext;false;SaveChanges;();;Property[EFTests.Address.Id] of Property[EFTests.PersonAddressMap.Address] of Element of Property[EFTests.MyContext.PersonAddresses] of Argument[-1];Property[EFTests.Address.Id] of Element of Property[EFTests.Person.Addresses] of Element of ReturnValue[jump to get_Persons];value |
| System.Data.Entity;DbContext;false;SaveChanges;();;Property[EFTests.Address.Id] of Property[EFTests.PersonAddressMap.Address] of Element of Property[EFTests.MyContext.PersonAddresses] of Argument[-1];Property[EFTests.Address.Id] of Element of ReturnValue[jump to get_Addresses];value |
| System.Data.Entity;DbContext;false;SaveChanges;();;Property[EFTests.Address.Id] of Property[EFTests.PersonAddressMap.Address] of Element of Property[EFTests.MyContext.PersonAddresses] of Argument[-1];Property[EFTests.Address.Id] of Property[EFTests.PersonAddressMap.Address] of Element of ReturnValue[jump to get_PersonAddresses];value |
| System.Data.Entity;DbContext;false;SaveChanges;();;Property[EFTests.Address.Street] of Element of Property[EFTests.MyContext.Addresses] of Argument[-1];Property[EFTests.Address.Street] of Element of Property[EFTests.Person.Addresses] of Element of ReturnValue[jump to get_Persons];value |
| System.Data.Entity;DbContext;false;SaveChanges;();;Property[EFTests.Address.Street] of Element of Property[EFTests.MyContext.Addresses] of Argument[-1];Property[EFTests.Address.Street] of Element of ReturnValue[jump to get_Addresses];value |
| System.Data.Entity;DbContext;false;SaveChanges;();;Property[EFTests.Address.Street] of Element of Property[EFTests.MyContext.Addresses] of Argument[-1];Property[EFTests.Address.Street] of Property[EFTests.PersonAddressMap.Address] of Element of ReturnValue[jump to get_PersonAddresses];value |
| System.Data.Entity;DbContext;false;SaveChanges;();;Property[EFTests.Address.Street] of Element of Property[EFTests.Person.Addresses] of Element of Property[EFTests.MyContext.Persons] of Argument[-1];Property[EFTests.Address.Street] of Element of Property[EFTests.Person.Addresses] of Element of ReturnValue[jump to get_Persons];value |
| System.Data.Entity;DbContext;false;SaveChanges;();;Property[EFTests.Address.Street] of Element of Property[EFTests.Person.Addresses] of Element of Property[EFTests.MyContext.Persons] of Argument[-1];Property[EFTests.Address.Street] of Element of ReturnValue[jump to get_Addresses];value |
| System.Data.Entity;DbContext;false;SaveChanges;();;Property[EFTests.Address.Street] of Element of Property[EFTests.Person.Addresses] of Element of Property[EFTests.MyContext.Persons] of Argument[-1];Property[EFTests.Address.Street] of Property[EFTests.PersonAddressMap.Address] of Element of ReturnValue[jump to get_PersonAddresses];value |
| System.Data.Entity;DbContext;false;SaveChanges;();;Property[EFTests.Address.Street] of Property[EFTests.PersonAddressMap.Address] of Element of Property[EFTests.MyContext.PersonAddresses] of Argument[-1];Property[EFTests.Address.Street] of Element of Property[EFTests.Person.Addresses] of Element of ReturnValue[jump to get_Persons];value |
| System.Data.Entity;DbContext;false;SaveChanges;();;Property[EFTests.Address.Street] of Property[EFTests.PersonAddressMap.Address] of Element of Property[EFTests.MyContext.PersonAddresses] of Argument[-1];Property[EFTests.Address.Street] of Element of ReturnValue[jump to get_Addresses];value |
| System.Data.Entity;DbContext;false;SaveChanges;();;Property[EFTests.Address.Street] of Property[EFTests.PersonAddressMap.Address] of Element of Property[EFTests.MyContext.PersonAddresses] of Argument[-1];Property[EFTests.Address.Street] of Property[EFTests.PersonAddressMap.Address] of Element of ReturnValue[jump to get_PersonAddresses];value |
| System.Data.Entity;DbContext;false;SaveChanges;();;Property[EFTests.Person.Id] of Element of Property[EFTests.MyContext.Persons] of Argument[-1];Property[EFTests.Person.Id] of Element of ReturnValue[jump to get_Persons];value |
| System.Data.Entity;DbContext;false;SaveChanges;();;Property[EFTests.Person.Id] of Element of Property[EFTests.MyContext.Persons] of Argument[-1];Property[EFTests.Person.Id] of Property[EFTests.PersonAddressMap.Person] of Element of ReturnValue[jump to get_PersonAddresses];value |
| System.Data.Entity;DbContext;false;SaveChanges;();;Property[EFTests.Person.Id] of Property[EFTests.PersonAddressMap.Person] of Element of Property[EFTests.MyContext.PersonAddresses] of Argument[-1];Property[EFTests.Person.Id] of Element of ReturnValue[jump to get_Persons];value |
| System.Data.Entity;DbContext;false;SaveChanges;();;Property[EFTests.Person.Id] of Property[EFTests.PersonAddressMap.Person] of Element of Property[EFTests.MyContext.PersonAddresses] of Argument[-1];Property[EFTests.Person.Id] of Property[EFTests.PersonAddressMap.Person] of Element of ReturnValue[jump to get_PersonAddresses];value |
| System.Data.Entity;DbContext;false;SaveChanges;();;Property[EFTests.Person.Name] of Element of Property[EFTests.MyContext.Persons] of Argument[-1];Property[EFTests.Person.Name] of Element of ReturnValue[jump to get_Persons];value |
| System.Data.Entity;DbContext;false;SaveChanges;();;Property[EFTests.Person.Name] of Element of Property[EFTests.MyContext.Persons] of Argument[-1];Property[EFTests.Person.Name] of Property[EFTests.PersonAddressMap.Person] of Element of ReturnValue[jump to get_PersonAddresses];value |
| System.Data.Entity;DbContext;false;SaveChanges;();;Property[EFTests.Person.Name] of Property[EFTests.PersonAddressMap.Person] of Element of Property[EFTests.MyContext.PersonAddresses] of Argument[-1];Property[EFTests.Person.Name] of Element of ReturnValue[jump to get_Persons];value |
| System.Data.Entity;DbContext;false;SaveChanges;();;Property[EFTests.Person.Name] of Property[EFTests.PersonAddressMap.Person] of Element of Property[EFTests.MyContext.PersonAddresses] of Argument[-1];Property[EFTests.Person.Name] of Property[EFTests.PersonAddressMap.Person] of Element of ReturnValue[jump to get_PersonAddresses];value |
| System.Data.Entity;DbContext;false;SaveChanges;();;Property[EFTests.PersonAddressMap.AddressId] of Element of Property[EFTests.MyContext.PersonAddresses] of Argument[-1];Property[EFTests.PersonAddressMap.AddressId] of Element of ReturnValue[jump to get_PersonAddresses];value |
| System.Data.Entity;DbContext;false;SaveChanges;();;Property[EFTests.PersonAddressMap.Id] of Element of Property[EFTests.MyContext.PersonAddresses] of Argument[-1];Property[EFTests.PersonAddressMap.Id] of Element of ReturnValue[jump to get_PersonAddresses];value |
| System.Data.Entity;DbContext;false;SaveChanges;();;Property[EFTests.PersonAddressMap.PersonId] of Element of Property[EFTests.MyContext.PersonAddresses] of Argument[-1];Property[EFTests.PersonAddressMap.PersonId] of Element of ReturnValue[jump to get_PersonAddresses];value |
| System.Data.Entity;DbContext;false;SaveChangesAsync;();;Property[EFTests.Address.Id] of Element of Property[EFTests.MyContext.Addresses] of Argument[-1];Property[EFTests.Address.Id] of Element of Property[EFTests.Person.Addresses] of Element of ReturnValue[jump to get_Persons];value |
| System.Data.Entity;DbContext;false;SaveChangesAsync;();;Property[EFTests.Address.Id] of Element of Property[EFTests.MyContext.Addresses] of Argument[-1];Property[EFTests.Address.Id] of Element of ReturnValue[jump to get_Addresses];value |
| System.Data.Entity;DbContext;false;SaveChangesAsync;();;Property[EFTests.Address.Id] of Element of Property[EFTests.MyContext.Addresses] of Argument[-1];Property[EFTests.Address.Id] of Property[EFTests.PersonAddressMap.Address] of Element of ReturnValue[jump to get_PersonAddresses];value |
| System.Data.Entity;DbContext;false;SaveChangesAsync;();;Property[EFTests.Address.Id] of Element of Property[EFTests.Person.Addresses] of Element of Property[EFTests.MyContext.Persons] of Argument[-1];Property[EFTests.Address.Id] of Element of Property[EFTests.Person.Addresses] of Element of ReturnValue[jump to get_Persons];value |
| System.Data.Entity;DbContext;false;SaveChangesAsync;();;Property[EFTests.Address.Id] of Element of Property[EFTests.Person.Addresses] of Element of Property[EFTests.MyContext.Persons] of Argument[-1];Property[EFTests.Address.Id] of Element of ReturnValue[jump to get_Addresses];value |
| System.Data.Entity;DbContext;false;SaveChangesAsync;();;Property[EFTests.Address.Id] of Element of Property[EFTests.Person.Addresses] of Element of Property[EFTests.MyContext.Persons] of Argument[-1];Property[EFTests.Address.Id] of Property[EFTests.PersonAddressMap.Address] of Element of ReturnValue[jump to get_PersonAddresses];value |
| System.Data.Entity;DbContext;false;SaveChangesAsync;();;Property[EFTests.Address.Id] of Property[EFTests.PersonAddressMap.Address] of Element of Property[EFTests.MyContext.PersonAddresses] of Argument[-1];Property[EFTests.Address.Id] of Element of Property[EFTests.Person.Addresses] of Element of ReturnValue[jump to get_Persons];value |
| System.Data.Entity;DbContext;false;SaveChangesAsync;();;Property[EFTests.Address.Id] of Property[EFTests.PersonAddressMap.Address] of Element of Property[EFTests.MyContext.PersonAddresses] of Argument[-1];Property[EFTests.Address.Id] of Element of ReturnValue[jump to get_Addresses];value |
| System.Data.Entity;DbContext;false;SaveChangesAsync;();;Property[EFTests.Address.Id] of Property[EFTests.PersonAddressMap.Address] of Element of Property[EFTests.MyContext.PersonAddresses] of Argument[-1];Property[EFTests.Address.Id] of Property[EFTests.PersonAddressMap.Address] of Element of ReturnValue[jump to get_PersonAddresses];value |
| System.Data.Entity;DbContext;false;SaveChangesAsync;();;Property[EFTests.Address.Street] of Element of Property[EFTests.MyContext.Addresses] of Argument[-1];Property[EFTests.Address.Street] of Element of Property[EFTests.Person.Addresses] of Element of ReturnValue[jump to get_Persons];value |
| System.Data.Entity;DbContext;false;SaveChangesAsync;();;Property[EFTests.Address.Street] of Element of Property[EFTests.MyContext.Addresses] of Argument[-1];Property[EFTests.Address.Street] of Element of ReturnValue[jump to get_Addresses];value |
| System.Data.Entity;DbContext;false;SaveChangesAsync;();;Property[EFTests.Address.Street] of Element of Property[EFTests.MyContext.Addresses] of Argument[-1];Property[EFTests.Address.Street] of Property[EFTests.PersonAddressMap.Address] of Element of ReturnValue[jump to get_PersonAddresses];value |
| System.Data.Entity;DbContext;false;SaveChangesAsync;();;Property[EFTests.Address.Street] of Element of Property[EFTests.Person.Addresses] of Element of Property[EFTests.MyContext.Persons] of Argument[-1];Property[EFTests.Address.Street] of Element of Property[EFTests.Person.Addresses] of Element of ReturnValue[jump to get_Persons];value |
| System.Data.Entity;DbContext;false;SaveChangesAsync;();;Property[EFTests.Address.Street] of Element of Property[EFTests.Person.Addresses] of Element of Property[EFTests.MyContext.Persons] of Argument[-1];Property[EFTests.Address.Street] of Element of ReturnValue[jump to get_Addresses];value |
| System.Data.Entity;DbContext;false;SaveChangesAsync;();;Property[EFTests.Address.Street] of Element of Property[EFTests.Person.Addresses] of Element of Property[EFTests.MyContext.Persons] of Argument[-1];Property[EFTests.Address.Street] of Property[EFTests.PersonAddressMap.Address] of Element of ReturnValue[jump to get_PersonAddresses];value |
| System.Data.Entity;DbContext;false;SaveChangesAsync;();;Property[EFTests.Address.Street] of Property[EFTests.PersonAddressMap.Address] of Element of Property[EFTests.MyContext.PersonAddresses] of Argument[-1];Property[EFTests.Address.Street] of Element of Property[EFTests.Person.Addresses] of Element of ReturnValue[jump to get_Persons];value |
| System.Data.Entity;DbContext;false;SaveChangesAsync;();;Property[EFTests.Address.Street] of Property[EFTests.PersonAddressMap.Address] of Element of Property[EFTests.MyContext.PersonAddresses] of Argument[-1];Property[EFTests.Address.Street] of Element of ReturnValue[jump to get_Addresses];value |
| System.Data.Entity;DbContext;false;SaveChangesAsync;();;Property[EFTests.Address.Street] of Property[EFTests.PersonAddressMap.Address] of Element of Property[EFTests.MyContext.PersonAddresses] of Argument[-1];Property[EFTests.Address.Street] of Property[EFTests.PersonAddressMap.Address] of Element of ReturnValue[jump to get_PersonAddresses];value |
| System.Data.Entity;DbContext;false;SaveChangesAsync;();;Property[EFTests.Person.Id] of Element of Property[EFTests.MyContext.Persons] of Argument[-1];Property[EFTests.Person.Id] of Element of ReturnValue[jump to get_Persons];value |
| System.Data.Entity;DbContext;false;SaveChangesAsync;();;Property[EFTests.Person.Id] of Element of Property[EFTests.MyContext.Persons] of Argument[-1];Property[EFTests.Person.Id] of Property[EFTests.PersonAddressMap.Person] of Element of ReturnValue[jump to get_PersonAddresses];value |
| System.Data.Entity;DbContext;false;SaveChangesAsync;();;Property[EFTests.Person.Id] of Property[EFTests.PersonAddressMap.Person] of Element of Property[EFTests.MyContext.PersonAddresses] of Argument[-1];Property[EFTests.Person.Id] of Element of ReturnValue[jump to get_Persons];value |
| System.Data.Entity;DbContext;false;SaveChangesAsync;();;Property[EFTests.Person.Id] of Property[EFTests.PersonAddressMap.Person] of Element of Property[EFTests.MyContext.PersonAddresses] of Argument[-1];Property[EFTests.Person.Id] of Property[EFTests.PersonAddressMap.Person] of Element of ReturnValue[jump to get_PersonAddresses];value |
| System.Data.Entity;DbContext;false;SaveChangesAsync;();;Property[EFTests.Person.Name] of Element of Property[EFTests.MyContext.Persons] of Argument[-1];Property[EFTests.Person.Name] of Element of ReturnValue[jump to get_Persons];value |
| System.Data.Entity;DbContext;false;SaveChangesAsync;();;Property[EFTests.Person.Name] of Element of Property[EFTests.MyContext.Persons] of Argument[-1];Property[EFTests.Person.Name] of Property[EFTests.PersonAddressMap.Person] of Element of ReturnValue[jump to get_PersonAddresses];value |
| System.Data.Entity;DbContext;false;SaveChangesAsync;();;Property[EFTests.Person.Name] of Property[EFTests.PersonAddressMap.Person] of Element of Property[EFTests.MyContext.PersonAddresses] of Argument[-1];Property[EFTests.Person.Name] of Element of ReturnValue[jump to get_Persons];value |
| System.Data.Entity;DbContext;false;SaveChangesAsync;();;Property[EFTests.Person.Name] of Property[EFTests.PersonAddressMap.Person] of Element of Property[EFTests.MyContext.PersonAddresses] of Argument[-1];Property[EFTests.Person.Name] of Property[EFTests.PersonAddressMap.Person] of Element of ReturnValue[jump to get_PersonAddresses];value |
| System.Data.Entity;DbContext;false;SaveChangesAsync;();;Property[EFTests.PersonAddressMap.AddressId] of Element of Property[EFTests.MyContext.PersonAddresses] of Argument[-1];Property[EFTests.PersonAddressMap.AddressId] of Element of ReturnValue[jump to get_PersonAddresses];value |
| System.Data.Entity;DbContext;false;SaveChangesAsync;();;Property[EFTests.PersonAddressMap.Id] of Element of Property[EFTests.MyContext.PersonAddresses] of Argument[-1];Property[EFTests.PersonAddressMap.Id] of Element of ReturnValue[jump to get_PersonAddresses];value |
| System.Data.Entity;DbContext;false;SaveChangesAsync;();;Property[EFTests.PersonAddressMap.PersonId] of Element of Property[EFTests.MyContext.PersonAddresses] of Argument[-1];Property[EFTests.PersonAddressMap.PersonId] of Element of ReturnValue[jump to get_PersonAddresses];value |
| System.Data.Entity;DbSet<>;false;Add;(T);;Argument[0];Element of Argument[-1];value |
| System.Data.Entity;DbSet<>;false;AddAsync;(T);;Argument[0];Element of Argument[-1];value |
| System.Data.Entity;DbSet<>;false;AddRange;(System.Collections.Generic.IEnumerable<T>);;Element of Argument[0];Element of Argument[-1];value |
| System.Data.Entity;DbSet<>;false;AddRangeAsync;(System.Collections.Generic.IEnumerable<T>);;Element of Argument[0];Element of Argument[-1];value |
| System.Data.Entity;DbSet<>;false;Attach;(T);;Argument[0];Element of Argument[-1];value |
| System.Data.Entity;DbSet<>;false;AttachRange;(System.Collections.Generic.IEnumerable<T>);;Element of Argument[0];Element of Argument[-1];value |
| System.Data.Entity;DbSet<>;false;Update;(T);;Argument[0];Element of Argument[-1];value |
| System.Data.Entity;DbSet<>;false;UpdateRange;(System.Collections.Generic.IEnumerable<T>);;Element of Argument[0];Element of Argument[-1];value |

View File

@@ -1,9 +1,6 @@
import semmle.code.csharp.dataflow.FlowSummary
import semmle.code.csharp.dataflow.internal.FlowSummaryImpl::Private::TestOutput
import semmle.code.csharp.frameworks.EntityFramework::EntityFramework
import shared.FlowSummaries
private class IncludeSummarizedCallable extends RelevantSummarizedCallable {
IncludeSummarizedCallable() { this instanceof EFSummarizedCallable }
override string getFullString() { result = this.(Callable).getQualifiedNameWithTypes() }
private class IncludeEFSummarizedCallable extends IncludeSummarizedCallable {
IncludeEFSummarizedCallable() { this instanceof EFSummarizedCallable }
}

View File

@@ -0,0 +1,33 @@
import semmle.code.csharp.dataflow.FlowSummary
import semmle.code.csharp.dataflow.internal.FlowSummaryImpl::Private::TestOutput
abstract class IncludeSummarizedCallable extends RelevantSummarizedCallable {
/** Gets the qualified parameter types of this callable as a comma-separated string. */
private string parameterQualifiedTypeNamesToString() {
result =
concat(Parameter p, int i |
p = this.getParameter(i)
|
p.getType().getQualifiedName(), ", " order by i
)
}
/* Gets a string representing, whether the declaring type is an interface. */
private string getCallableOverride() {
if
this.getDeclaringType() instanceof Interface or
this.(Modifiable).isAbstract()
then result = "true"
else result = "false"
}
/** Gets a string representing the callable in semi-colon separated format for use in flow summaries. */
final override string getCallableCsv() {
exists(string namespace, string type |
this.getDeclaringType().hasQualifiedName(namespace, type) and
result =
namespace + ";" + type + ";" + this.getCallableOverride() + ";" + this.getName() + ";" + "("
+ parameterQualifiedTypeNamesToString() + ")"
)
}
}

View File

@@ -127,6 +127,38 @@ module Public {
SummaryComponentStack return(ReturnKind rk) { result = singleton(SummaryComponent::return(rk)) }
}
private predicate noComponentSpecificCsv(SummaryComponent sc) {
not exists(getComponentSpecificCsv(sc))
}
/** Gets a textual representation of this component used for flow summaries. */
private string getComponentCsv(SummaryComponent sc) {
result = getComponentSpecificCsv(sc)
or
noComponentSpecificCsv(sc) and
(
exists(int i | sc = TParameterSummaryComponent(i) and result = "Parameter[" + i + "]")
or
exists(int i | sc = TArgumentSummaryComponent(i) and result = "Argument[" + i + "]")
or
sc = TReturnSummaryComponent(getReturnValueKind()) and result = "ReturnValue"
)
}
/** Gets a textual representation of this stack used for flow summaries. */
string getComponentStackCsv(SummaryComponentStack stack) {
exists(SummaryComponent head, SummaryComponentStack tail |
head = stack.head() and
tail = stack.tail() and
result = getComponentCsv(head) + " of " + getComponentStackCsv(tail)
)
or
exists(SummaryComponent c |
stack = TSingletonSummaryComponentStack(c) and
result = getComponentCsv(c)
)
}
/**
* A class that exists for QL technical reasons only (the IPA type used
* to represent component stacks needs to be bounded).
@@ -970,18 +1002,31 @@ module Private {
module TestOutput {
/** A flow summary to include in the `summary/3` query predicate. */
abstract class RelevantSummarizedCallable extends SummarizedCallable {
/** Gets the string representation of this callable used by `summary/3`. */
string getFullString() { result = this.toString() }
/** Gets the string representation of this callable used by `summary/1`. */
abstract string getCallableCsv();
}
/** A query predicate for outputting flow summaries in QL tests. */
query predicate summary(string callable, string flow, boolean preservesValue) {
/** Render the kind in the format used in flow summaries. */
private string renderKind(boolean preservesValue) {
preservesValue = true and result = "value"
or
preservesValue = false and result = "taint"
}
/**
* A query predicate for outputting flow summaries in semi-colon separated format in QL tests.
* The syntax is: "namespace;type;overrides;name;signature;ext;inputspec;outputspec;kind",
* ext is hardcoded to empty.
*/
query predicate summary(string csv) {
exists(
RelevantSummarizedCallable c, SummaryComponentStack input, SummaryComponentStack output
RelevantSummarizedCallable c, SummaryComponentStack input, SummaryComponentStack output,
boolean preservesValue
|
callable = c.getFullString() and
c.propagatesFlow(input, output, preservesValue) and
flow = input + " -> " + output
csv =
c.getCallableCsv() + ";;" + getComponentStackCsv(input) + ";" +
getComponentStackCsv(output) + ";" + renderKind(preservesValue)
)
}
}

View File

@@ -72,6 +72,32 @@ SummaryComponent interpretComponentSpecific(string c) {
exists(Content content | parseContent(c, content) and result = SummaryComponent::content(content))
}
/** Gets the summary component for specification component `c`, if any. */
private string getContentSpecificCsv(Content c) {
exists(Field f, string package, string className, string fieldName |
f = c.(FieldContent).getField() and
f.hasQualifiedName(package, className, fieldName) and
result = "Field[" + package + "." + className + "." + fieldName + "]"
)
or
exists(SyntheticField f |
f = c.(SyntheticFieldContent).getField() and result = "SyntheticField[" + f + "]"
)
or
c instanceof ArrayContent and result = "ArrayElement"
or
c instanceof CollectionContent and result = "Element"
or
c instanceof MapKeyContent and result = "MapKey"
or
c instanceof MapValueContent and result = "MapValue"
}
/** Gets the textual representation of the content in the format used for flow summaries. */
string getComponentSpecificCsv(SummaryComponent sc) {
exists(Content c | sc = TContentSummaryComponent(c) and result = getContentSpecificCsv(c))
}
class SourceOrSinkElement = Top;
/**

View File

@@ -127,6 +127,38 @@ module Public {
SummaryComponentStack return(ReturnKind rk) { result = singleton(SummaryComponent::return(rk)) }
}
private predicate noComponentSpecificCsv(SummaryComponent sc) {
not exists(getComponentSpecificCsv(sc))
}
/** Gets a textual representation of this component used for flow summaries. */
private string getComponentCsv(SummaryComponent sc) {
result = getComponentSpecificCsv(sc)
or
noComponentSpecificCsv(sc) and
(
exists(int i | sc = TParameterSummaryComponent(i) and result = "Parameter[" + i + "]")
or
exists(int i | sc = TArgumentSummaryComponent(i) and result = "Argument[" + i + "]")
or
sc = TReturnSummaryComponent(getReturnValueKind()) and result = "ReturnValue"
)
}
/** Gets a textual representation of this stack used for flow summaries. */
string getComponentStackCsv(SummaryComponentStack stack) {
exists(SummaryComponent head, SummaryComponentStack tail |
head = stack.head() and
tail = stack.tail() and
result = getComponentCsv(head) + " of " + getComponentStackCsv(tail)
)
or
exists(SummaryComponent c |
stack = TSingletonSummaryComponentStack(c) and
result = getComponentCsv(c)
)
}
/**
* A class that exists for QL technical reasons only (the IPA type used
* to represent component stacks needs to be bounded).
@@ -970,18 +1002,31 @@ module Private {
module TestOutput {
/** A flow summary to include in the `summary/3` query predicate. */
abstract class RelevantSummarizedCallable extends SummarizedCallable {
/** Gets the string representation of this callable used by `summary/3`. */
string getFullString() { result = this.toString() }
/** Gets the string representation of this callable used by `summary/1`. */
abstract string getCallableCsv();
}
/** A query predicate for outputting flow summaries in QL tests. */
query predicate summary(string callable, string flow, boolean preservesValue) {
/** Render the kind in the format used in flow summaries. */
private string renderKind(boolean preservesValue) {
preservesValue = true and result = "value"
or
preservesValue = false and result = "taint"
}
/**
* A query predicate for outputting flow summaries in semi-colon separated format in QL tests.
* The syntax is: "namespace;type;overrides;name;signature;ext;inputspec;outputspec;kind",
* ext is hardcoded to empty.
*/
query predicate summary(string csv) {
exists(
RelevantSummarizedCallable c, SummaryComponentStack input, SummaryComponentStack output
RelevantSummarizedCallable c, SummaryComponentStack input, SummaryComponentStack output,
boolean preservesValue
|
callable = c.getFullString() and
c.propagatesFlow(input, output, preservesValue) and
flow = input + " -> " + output
csv =
c.getCallableCsv() + ";;" + getComponentStackCsv(input) + ";" +
getComponentStackCsv(output) + ";" + renderKind(preservesValue)
)
}
}

View File

@@ -69,6 +69,11 @@ SummaryComponent interpretComponentSpecific(string c) {
result = FlowSummary::SummaryComponent::argument(any(int i | i >= 0))
}
/** Gets the textual representation of a summary component in the format used for flow summaries. */
string getComponentSpecificCsv(SummaryComponent sc) {
sc = TArgumentSummaryComponent(-2) and result = "BlockArgument"
}
/** Gets the return kind corresponding to specification `"ReturnValue"`. */
NormalReturnKind getReturnValueKind() { any() }