Merge branch 'main' into 51-2cppnon-constant-format-alter-not-const-source

This commit is contained in:
Ben Rodes
2024-02-07 10:57:31 -08:00
committed by GitHub
102 changed files with 11823 additions and 2443 deletions

View File

@@ -0,0 +1,4 @@
---
category: feature
---
* Added an abstract class `FlowOutBarrierFunction` that can be used to block flow out of a function.

View File

@@ -244,9 +244,15 @@ class ConditionDeclExpr extends Expr, @condition_decl {
/** /**
* Gets the compiler-generated variable access that conceptually occurs after * Gets the compiler-generated variable access that conceptually occurs after
* the initialization of the declared variable. * the initialization of the declared variable, if any.
*/ */
VariableAccess getVariableAccess() { result = this.getChild(0) } VariableAccess getVariableAccess() { result = this.getExpr() }
/**
* Gets the expression that is evaluated after the initialization of the declared
* variable.
*/
Expr getExpr() { result = this.getChild(0) }
/** /**
* Gets the expression that initializes the declared variable. This predicate * Gets the expression that initializes the declared variable. This predicate

View File

@@ -2,8 +2,11 @@ private import codeql.ssa.Ssa as SsaImplCommon
private import semmle.code.cpp.ir.IR private import semmle.code.cpp.ir.IR
private import DataFlowUtil private import DataFlowUtil
private import DataFlowImplCommon as DataFlowImplCommon private import DataFlowImplCommon as DataFlowImplCommon
private import semmle.code.cpp.ir.dataflow.internal.ModelUtil
private import semmle.code.cpp.models.interfaces.Allocation as Alloc private import semmle.code.cpp.models.interfaces.Allocation as Alloc
private import semmle.code.cpp.models.interfaces.DataFlow as DataFlow private import semmle.code.cpp.models.interfaces.DataFlow as DataFlow
private import semmle.code.cpp.models.interfaces.FlowOutBarrier as FOB
private import semmle.code.cpp.models.interfaces.FunctionInputsAndOutputs as FIO
private import semmle.code.cpp.ir.internal.IRCppLanguage private import semmle.code.cpp.ir.internal.IRCppLanguage
private import DataFlowPrivate private import DataFlowPrivate
private import ssa0.SsaInternals as SsaInternals0 private import ssa0.SsaInternals as SsaInternals0
@@ -784,10 +787,30 @@ private Node getAPriorDefinition(SsaDefOrUse defOrUse) {
) )
} }
/**
* Holds if there should not be use-use flow out of `n` (or a conversion that
* flows to `n`).
*/
private predicate modeledFlowBarrier(Node n) {
exists(FIO::FunctionInput input, CallInstruction call |
call.getStaticCallTarget().(FOB::FlowOutBarrierFunction).isFlowOutBarrier(input) and
n = callInput(call, input)
)
or
exists(Operand operand, Instruction instr, Node n0, int indirectionIndex |
modeledFlowBarrier(n0) and
nodeHasInstruction(n0, instr, indirectionIndex) and
conversionFlow(operand, instr, false, _) and
nodeHasOperand(n, operand, indirectionIndex)
)
}
/** Holds if there is def-use or use-use flow from `nodeFrom` to `nodeTo`. */ /** Holds if there is def-use or use-use flow from `nodeFrom` to `nodeTo`. */
predicate ssaFlow(Node nodeFrom, Node nodeTo) { predicate ssaFlow(Node nodeFrom, Node nodeTo) {
exists(Node nFrom, boolean uncertain, SsaDefOrUse defOrUse | exists(Node nFrom, boolean uncertain, SsaDefOrUse defOrUse |
ssaFlowImpl(defOrUse, nFrom, nodeTo, uncertain) and nodeFrom != nodeTo ssaFlowImpl(defOrUse, nFrom, nodeTo, uncertain) and
not modeledFlowBarrier(nFrom) and
nodeFrom != nodeTo
| |
if uncertain = true then nodeFrom = [nFrom, getAPriorDefinition(defOrUse)] else nodeFrom = nFrom if uncertain = true then nodeFrom = [nFrom, getAPriorDefinition(defOrUse)] else nodeFrom = nFrom
) )

View File

@@ -2125,13 +2125,6 @@ class ChiInstruction extends Instruction {
*/ */
final Instruction getPartial() { result = this.getPartialOperand().getDef() } final Instruction getPartial() { result = this.getPartialOperand().getDef() }
/**
* Gets the bit range `[startBit, endBit)` updated by the partial operand of this `ChiInstruction`, relative to the start address of the total operand.
*/
final predicate getUpdatedInterval(int startBit, int endBit) {
Construction::getIntervalUpdatedByChi(this, startBit, endBit)
}
/** /**
* Holds if the `ChiPartialOperand` totally, but not exactly, overlaps with the `ChiTotalOperand`. * Holds if the `ChiPartialOperand` totally, but not exactly, overlaps with the `ChiTotalOperand`.
* This means that the `ChiPartialOperand` will not override the entire memory associated with the * This means that the `ChiPartialOperand` will not override the entire memory associated with the

View File

@@ -233,20 +233,6 @@ private module Cached {
) )
} }
/**
* Holds if the partial operand of this `ChiInstruction` updates the bit range
* `[startBitOffset, endBitOffset)` of the total operand.
*/
cached
predicate getIntervalUpdatedByChi(ChiInstruction chi, int startBitOffset, int endBitOffset) {
exists(Alias::MemoryLocation location, OldInstruction oldInstruction |
oldInstruction = getOldInstruction(chi.getPartial()) and
location = Alias::getResultMemoryLocation(oldInstruction) and
startBitOffset = Alias::getStartBitOffset(location) and
endBitOffset = Alias::getEndBitOffset(location)
)
}
/** /**
* Holds if `operand` totally overlaps with its definition and consumes the bit range * Holds if `operand` totally overlaps with its definition and consumes the bit range
* `[startBitOffset, endBitOffset)`. * `[startBitOffset, endBitOffset)`.

View File

@@ -2125,13 +2125,6 @@ class ChiInstruction extends Instruction {
*/ */
final Instruction getPartial() { result = this.getPartialOperand().getDef() } final Instruction getPartial() { result = this.getPartialOperand().getDef() }
/**
* Gets the bit range `[startBit, endBit)` updated by the partial operand of this `ChiInstruction`, relative to the start address of the total operand.
*/
final predicate getUpdatedInterval(int startBit, int endBit) {
Construction::getIntervalUpdatedByChi(this, startBit, endBit)
}
/** /**
* Holds if the `ChiPartialOperand` totally, but not exactly, overlaps with the `ChiTotalOperand`. * Holds if the `ChiPartialOperand` totally, but not exactly, overlaps with the `ChiTotalOperand`.
* This means that the `ChiPartialOperand` will not override the entire memory associated with the * This means that the `ChiPartialOperand` will not override the entire memory associated with the

View File

@@ -202,12 +202,6 @@ Instruction getMemoryOperandDefinition(
none() none()
} }
/**
* Holds if the partial operand of this `ChiInstruction` updates the bit range
* `[startBitOffset, endBitOffset)` of the total operand.
*/
predicate getIntervalUpdatedByChi(ChiInstruction chi, int startBit, int endBit) { none() }
/** /**
* Holds if the operand totally overlaps with its definition and consumes the * Holds if the operand totally overlaps with its definition and consumes the
* bit range `[startBitOffset, endBitOffset)`. * bit range `[startBitOffset, endBitOffset)`.

View File

@@ -3173,7 +3173,7 @@ class TranslatedConditionDeclExpr extends TranslatedNonConstantExpr {
private TranslatedConditionDecl getDecl() { result = getTranslatedConditionDecl(expr) } private TranslatedConditionDecl getDecl() { result = getTranslatedConditionDecl(expr) }
private TranslatedExpr getConditionExpr() { private TranslatedExpr getConditionExpr() {
result = getTranslatedExpr(expr.getVariableAccess().getFullyConverted()) result = getTranslatedExpr(expr.getExpr().getFullyConverted())
} }
} }

View File

@@ -2125,13 +2125,6 @@ class ChiInstruction extends Instruction {
*/ */
final Instruction getPartial() { result = this.getPartialOperand().getDef() } final Instruction getPartial() { result = this.getPartialOperand().getDef() }
/**
* Gets the bit range `[startBit, endBit)` updated by the partial operand of this `ChiInstruction`, relative to the start address of the total operand.
*/
final predicate getUpdatedInterval(int startBit, int endBit) {
Construction::getIntervalUpdatedByChi(this, startBit, endBit)
}
/** /**
* Holds if the `ChiPartialOperand` totally, but not exactly, overlaps with the `ChiTotalOperand`. * Holds if the `ChiPartialOperand` totally, but not exactly, overlaps with the `ChiTotalOperand`.
* This means that the `ChiPartialOperand` will not override the entire memory associated with the * This means that the `ChiPartialOperand` will not override the entire memory associated with the

View File

@@ -233,20 +233,6 @@ private module Cached {
) )
} }
/**
* Holds if the partial operand of this `ChiInstruction` updates the bit range
* `[startBitOffset, endBitOffset)` of the total operand.
*/
cached
predicate getIntervalUpdatedByChi(ChiInstruction chi, int startBitOffset, int endBitOffset) {
exists(Alias::MemoryLocation location, OldInstruction oldInstruction |
oldInstruction = getOldInstruction(chi.getPartial()) and
location = Alias::getResultMemoryLocation(oldInstruction) and
startBitOffset = Alias::getStartBitOffset(location) and
endBitOffset = Alias::getEndBitOffset(location)
)
}
/** /**
* Holds if `operand` totally overlaps with its definition and consumes the bit range * Holds if `operand` totally overlaps with its definition and consumes the bit range
* `[startBitOffset, endBitOffset)`. * `[startBitOffset, endBitOffset)`.

View File

@@ -1,6 +1,7 @@
import semmle.code.cpp.models.interfaces.DataFlow import semmle.code.cpp.models.interfaces.DataFlow
import semmle.code.cpp.models.interfaces.Taint import semmle.code.cpp.models.interfaces.Taint
import semmle.code.cpp.models.interfaces.Alias import semmle.code.cpp.models.interfaces.Alias
import semmle.code.cpp.models.interfaces.FlowOutBarrier
/** /**
* The standard function `swap`. A use of `swap` looks like this: * The standard function `swap`. A use of `swap` looks like this:
@@ -8,7 +9,7 @@ import semmle.code.cpp.models.interfaces.Alias
* std::swap(obj1, obj2) * std::swap(obj1, obj2)
* ``` * ```
*/ */
private class Swap extends DataFlowFunction { private class Swap extends DataFlowFunction, FlowOutBarrierFunction {
Swap() { this.hasQualifiedName(["std", "bsl"], "swap") } Swap() { this.hasQualifiedName(["std", "bsl"], "swap") }
override predicate hasDataFlow(FunctionInput input, FunctionOutput output) { override predicate hasDataFlow(FunctionInput input, FunctionOutput output) {
@@ -18,6 +19,8 @@ private class Swap extends DataFlowFunction {
input.isParameterDeref(1) and input.isParameterDeref(1) and
output.isParameterDeref(0) output.isParameterDeref(0)
} }
override predicate isFlowOutBarrier(FunctionInput input) { input.isParameterDeref([0, 1]) }
} }
/** /**
@@ -26,7 +29,9 @@ private class Swap extends DataFlowFunction {
* obj1.swap(obj2) * obj1.swap(obj2)
* ``` * ```
*/ */
private class MemberSwap extends TaintFunction, MemberFunction, AliasFunction { private class MemberSwap extends TaintFunction, MemberFunction, AliasFunction,
FlowOutBarrierFunction
{
MemberSwap() { MemberSwap() {
this.hasName("swap") and this.hasName("swap") and
this.getNumberOfParameters() = 1 and this.getNumberOfParameters() = 1 and
@@ -47,4 +52,8 @@ private class MemberSwap extends TaintFunction, MemberFunction, AliasFunction {
override predicate parameterEscapesOnlyViaReturn(int index) { index = 0 } override predicate parameterEscapesOnlyViaReturn(int index) { index = 0 }
override predicate parameterIsAlwaysReturned(int index) { index = 0 } override predicate parameterIsAlwaysReturned(int index) { index = 0 }
override predicate isFlowOutBarrier(FunctionInput input) {
input.isQualifierObject() or input.isParameterDeref(0)
}
} }

View File

@@ -0,0 +1,26 @@
/**
* Provides an abstract class for blocking flow out of functions. To use this
* QL library, create a QL class extending `FlowOutBarrierFunction` with a
* characteristic predicate that selects the function or set of functions you
* are modeling. Within that class, override the predicates provided by
* `FlowOutBarrierFunction` to match the flow within that function.
*/
import semmle.code.cpp.Function
import FunctionInputsAndOutputs
/**
* A library function for which flow should not continue after reaching one
* of its inputs.
*
* For example, since `std::swap(a, b)` swaps the values pointed to by `a`
* and `b` there should not be use-use flow out of `a` or `b`.
*/
abstract class FlowOutBarrierFunction extends Function {
/**
* Holds if use-use flow should not continue onwards after reaching
* the argument, qualifier, or buffer represented by `input`.
*/
pragma[nomagic]
abstract predicate isFlowOutBarrier(FunctionInput input);
}

View File

@@ -71,11 +71,11 @@ void test_pair()
sink(i.second); // $ MISSING: ast,ir sink(i.second); // $ MISSING: ast,ir
sink(i); // $ ast,ir sink(i); // $ ast,ir
sink(j.first); sink(j.first);
sink(j.second); // $ SPURIOUS: ast,ir sink(j.second); // $ SPURIOUS: ast
sink(j); // $ SPURIOUS: ast,ir sink(j); // $ SPURIOUS: ast
sink(k.first); sink(k.first);
sink(k.second); // $ SPURIOUS: ast,ir sink(k.second); // $ SPURIOUS: ast
sink(k); // $ SPURIOUS: ast,ir sink(k); // $ SPURIOUS: ast
sink(l.first); sink(l.first);
sink(l.second); // $ MISSING: ast,ir sink(l.second); // $ MISSING: ast,ir
sink(l); // $ ast,ir sink(l); // $ ast,ir
@@ -196,10 +196,10 @@ void test_map()
sink(m18); // $ ast,ir sink(m18); // $ ast,ir
m15.swap(m16); m15.swap(m16);
m17.swap(m18); m17.swap(m18);
sink(m15); // $ SPURIOUS: ast,ir sink(m15); // $ SPURIOUS: ast
sink(m16); // $ ast,ir sink(m16); // $ ast,ir
sink(m17); // $ ast,ir sink(m17); // $ ast,ir
sink(m18); // $ SPURIOUS: ast,ir sink(m18); // $ SPURIOUS: ast
// merge // merge
std::map<char *, char *> m19, m20, m21, m22; std::map<char *, char *> m19, m20, m21, m22;
@@ -345,10 +345,10 @@ void test_unordered_map()
sink(m18); // $ ast,ir sink(m18); // $ ast,ir
m15.swap(m16); m15.swap(m16);
m17.swap(m18); m17.swap(m18);
sink(m15); // $ SPURIOUS: ast,ir sink(m15); // $ SPURIOUS: ast
sink(m16); // $ ast,ir sink(m16); // $ ast,ir
sink(m17); // $ ast,ir sink(m17); // $ ast,ir
sink(m18); // $ SPURIOUS: ast,ir sink(m18); // $ SPURIOUS: ast
// merge // merge
std::unordered_map<char *, char *> m19, m20, m21, m22; std::unordered_map<char *, char *> m19, m20, m21, m22;

View File

@@ -81,10 +81,10 @@ void test_set()
sink(s15); // $ ast,ir sink(s15); // $ ast,ir
s12.swap(s13); s12.swap(s13);
s14.swap(s15); s14.swap(s15);
sink(s12); // $ SPURIOUS: ast,ir sink(s12); // $ SPURIOUS: ast
sink(s13); // $ ast,ir sink(s13); // $ ast,ir
sink(s14); // $ ast,ir sink(s14); // $ ast,ir
sink(s15); // $ SPURIOUS: ast,ir sink(s15); // $ SPURIOUS: ast
// merge // merge
std::set<char *> s16, s17, s18, s19; std::set<char *> s16, s17, s18, s19;
@@ -193,10 +193,10 @@ void test_unordered_set()
sink(s15); // $ ast,ir sink(s15); // $ ast,ir
s12.swap(s13); s12.swap(s13);
s14.swap(s15); s14.swap(s15);
sink(s12); // $ SPURIOUS: ast,ir sink(s12); // $ SPURIOUS: ast
sink(s13); // $ ast,ir sink(s13); // $ ast,ir
sink(s14); // $ ast,ir sink(s14); // $ ast,ir
sink(s15); // $ SPURIOUS: ast,ir sink(s15); // $ SPURIOUS: ast
// merge // merge
std::unordered_set<char *> s16, s17, s18, s19; std::unordered_set<char *> s16, s17, s18, s19;

View File

@@ -280,9 +280,9 @@ void test_string_swap() {
s4.swap(s3); s4.swap(s3);
sink(s1); // $ ast,ir sink(s1); // $ ast,ir
sink(s2); // $ SPURIOUS: ast,ir sink(s2); // $ SPURIOUS: ast
sink(s3); // $ ast,ir sink(s3); // $ ast,ir
sink(s4); // $ SPURIOUS: ast,ir sink(s4); // $ SPURIOUS: ast
} }
void test_string_clear() { void test_string_clear() {

View File

@@ -118,9 +118,9 @@ void test_stringstream_swap()
ss4.swap(ss3); ss4.swap(ss3);
sink(ss1); // $ ast,ir sink(ss1); // $ ast,ir
sink(ss2); // $ SPURIOUS: ast,ir sink(ss2); // $ SPURIOUS: ast
sink(ss3); // $ ast,ir sink(ss3); // $ ast,ir
sink(ss4); // $ SPURIOUS: ast,ir sink(ss4); // $ SPURIOUS: ast
} }
void test_stringstream_in() void test_stringstream_in()

View File

@@ -212,7 +212,7 @@ void test_swap() {
std::swap(x, y); std::swap(x, y);
sink(x); // $ SPURIOUS: ast,ir sink(x); // $ SPURIOUS: ast
sink(y); // $ ast,ir sink(y); // $ ast,ir
} }

View File

@@ -114,10 +114,10 @@ void test_vector_swap() {
v1.swap(v2); v1.swap(v2);
v3.swap(v4); v3.swap(v4);
sink(v1); // $ SPURIOUS: ast,ir sink(v1); // $ SPURIOUS: ast
sink(v2); // $ ast,ir sink(v2); // $ ast,ir
sink(v3); // $ ast,ir sink(v3); // $ ast,ir
sink(v4); // $ SPURIOUS: ast,ir sink(v4); // $ SPURIOUS: ast
} }
void test_vector_clear() { void test_vector_clear() {

View File

@@ -16132,6 +16132,31 @@ ir.cpp:
# 2112| getExpr(): [VariableAccess] end # 2112| getExpr(): [VariableAccess] end
# 2112| Type = [CharPointerType] char * # 2112| Type = [CharPointerType] char *
# 2112| ValueCategory = prvalue(load) # 2112| ValueCategory = prvalue(load)
# 2115| [CopyAssignmentOperator] HasOperatorBool& HasOperatorBool::operator=(HasOperatorBool const&)
# 2115| <params>:
#-----| getParameter(0): [Parameter] (unnamed parameter 0)
#-----| Type = [LValueReferenceType] const HasOperatorBool &
# 2115| [MoveAssignmentOperator] HasOperatorBool& HasOperatorBool::operator=(HasOperatorBool&&)
# 2115| <params>:
#-----| getParameter(0): [Parameter] (unnamed parameter 0)
#-----| Type = [RValueReferenceType] HasOperatorBool &&
# 2116| [ConversionOperator] bool HasOperatorBool::operator bool()
# 2116| <params>:
# 2119| [TopLevelFunction] void call_as_child_of_ConditionDeclExpr()
# 2119| <params>:
# 2119| getEntryPoint(): [BlockStmt] { ... }
# 2120| getStmt(0): [IfStmt] if (...) ...
# 2120| getCondition(): [ConditionDeclExpr] (condition decl)
# 2120| Type = [BoolType] bool
# 2120| ValueCategory = prvalue
# 2120| getChild(0): [FunctionCall] call to operator bool
# 2120| Type = [BoolType] bool
# 2120| ValueCategory = prvalue
# 2120| getQualifier(): [VariableAccess] b
# 2120| Type = [Struct] HasOperatorBool
# 2120| ValueCategory = prvalue(load)
# 2120| getThen(): [BlockStmt] { ... }
# 2121| getStmt(1): [ReturnStmt] return ...
perf-regression.cpp: perf-regression.cpp:
# 4| [CopyAssignmentOperator] Big& Big::operator=(Big const&) # 4| [CopyAssignmentOperator] Big& Big::operator=(Big const&)
# 4| <params>: # 4| <params>:

View File

@@ -12441,6 +12441,38 @@ ir.cpp:
# 2109| v2109_12(void) = AliasedUse : m2109_3 # 2109| v2109_12(void) = AliasedUse : m2109_3
# 2109| v2109_13(void) = ExitFunction : # 2109| v2109_13(void) = ExitFunction :
# 2119| void call_as_child_of_ConditionDeclExpr()
# 2119| Block 0
# 2119| v2119_1(void) = EnterFunction :
# 2119| m2119_2(unknown) = AliasedDefinition :
# 2119| m2119_3(unknown) = InitializeNonLocal :
# 2119| m2119_4(unknown) = Chi : total:m2119_2, partial:m2119_3
# 2120| r2120_1(glval<HasOperatorBool>) = VariableAddress[b] :
# 2120| r2120_2(HasOperatorBool) = Constant[0] :
# 2120| m2120_3(HasOperatorBool) = Store[b] : &:r2120_1, r2120_2
# 2120| r2120_4(glval<HasOperatorBool>) = VariableAddress[b] :
# 2120| r2120_5(glval<unknown>) = FunctionAddress[operator bool] :
# 2120| r2120_6(bool) = Call[operator bool] : func:r2120_5, this:r2120_4
# 2120| m2120_7(unknown) = ^CallSideEffect : ~m2119_4
# 2120| m2120_8(unknown) = Chi : total:m2119_4, partial:m2120_7
# 2120| v2120_9(void) = ^IndirectReadSideEffect[-1] : &:r2120_4, m2120_3
# 2120| m2120_10(HasOperatorBool) = ^IndirectMayWriteSideEffect[-1] : &:r2120_4
# 2120| m2120_11(HasOperatorBool) = Chi : total:m2120_3, partial:m2120_10
# 2120| r2120_12(bool) = CopyValue : r2120_6
# 2120| v2120_13(void) = ConditionalBranch : r2120_12
#-----| False -> Block 2
#-----| True -> Block 1
# 2120| Block 1
# 2120| v2120_14(void) = NoOp :
#-----| Goto -> Block 2
# 2121| Block 2
# 2121| v2121_1(void) = NoOp :
# 2119| v2119_5(void) = ReturnVoid :
# 2119| v2119_6(void) = AliasedUse : ~m2120_8
# 2119| v2119_7(void) = ExitFunction :
perf-regression.cpp: perf-regression.cpp:
# 6| void Big::Big() # 6| void Big::Big()
# 6| Block 0 # 6| Block 0

View File

@@ -12,7 +12,11 @@ unnecessaryPhiInstruction
memoryOperandDefinitionIsUnmodeled memoryOperandDefinitionIsUnmodeled
operandAcrossFunctions operandAcrossFunctions
instructionWithoutUniqueBlock instructionWithoutUniqueBlock
missingCanonicalLanguageType
multipleCanonicalLanguageTypes
containsLoopOfForwardEdges containsLoopOfForwardEdges
missingIRType
multipleIRTypes
lostReachability lostReachability
backEdgeCountMismatch backEdgeCountMismatch
useNotDominatedByDefinition useNotDominatedByDefinition
@@ -24,8 +28,4 @@ nonUniqueEnclosingIRFunction
fieldAddressOnNonPointer fieldAddressOnNonPointer
thisArgumentIsNonPointer thisArgumentIsNonPointer
nonUniqueIRVariable nonUniqueIRVariable
missingCanonicalLanguageType
multipleCanonicalLanguageTypes
missingIRType
multipleIRTypes
missingCppType missingCppType

View File

@@ -12,7 +12,11 @@ unnecessaryPhiInstruction
memoryOperandDefinitionIsUnmodeled memoryOperandDefinitionIsUnmodeled
operandAcrossFunctions operandAcrossFunctions
instructionWithoutUniqueBlock instructionWithoutUniqueBlock
missingCanonicalLanguageType
multipleCanonicalLanguageTypes
containsLoopOfForwardEdges containsLoopOfForwardEdges
missingIRType
multipleIRTypes
lostReachability lostReachability
backEdgeCountMismatch backEdgeCountMismatch
useNotDominatedByDefinition useNotDominatedByDefinition
@@ -24,8 +28,4 @@ nonUniqueEnclosingIRFunction
fieldAddressOnNonPointer fieldAddressOnNonPointer
thisArgumentIsNonPointer thisArgumentIsNonPointer
nonUniqueIRVariable nonUniqueIRVariable
missingCanonicalLanguageType
multipleCanonicalLanguageTypes
missingIRType
multipleIRTypes
missingCppType missingCppType

View File

@@ -2112,4 +2112,12 @@ char* test_strtod(char *s) {
return end; return end;
} }
struct HasOperatorBool {
operator bool();
};
void call_as_child_of_ConditionDeclExpr() {
if(HasOperatorBool b = HasOperatorBool()) {}
}
// semmle-extractor-options: -std=c++17 --clang // semmle-extractor-options: -std=c++17 --clang

View File

@@ -10070,6 +10070,23 @@
| ir.cpp:2112:10:2112:12 | Address | &:r2112_2 | | ir.cpp:2112:10:2112:12 | Address | &:r2112_2 |
| ir.cpp:2112:10:2112:12 | Load | m2111_11 | | ir.cpp:2112:10:2112:12 | Load | m2111_11 |
| ir.cpp:2112:10:2112:12 | StoreValue | r2112_3 | | ir.cpp:2112:10:2112:12 | StoreValue | r2112_3 |
| ir.cpp:2119:6:2119:39 | ChiPartial | partial:m2119_3 |
| ir.cpp:2119:6:2119:39 | ChiTotal | total:m2119_2 |
| ir.cpp:2119:6:2119:39 | SideEffect | ~m2120_8 |
| ir.cpp:2120:6:2120:42 | Address | &:r2120_1 |
| ir.cpp:2120:6:2120:42 | Condition | r2120_12 |
| ir.cpp:2120:22:2120:22 | Address | &:r2120_4 |
| ir.cpp:2120:22:2120:22 | Address | &:r2120_4 |
| ir.cpp:2120:22:2120:22 | Arg(this) | this:r2120_4 |
| ir.cpp:2120:22:2120:22 | CallTarget | func:r2120_5 |
| ir.cpp:2120:22:2120:22 | ChiPartial | partial:m2120_7 |
| ir.cpp:2120:22:2120:22 | ChiPartial | partial:m2120_10 |
| ir.cpp:2120:22:2120:22 | ChiTotal | total:m2119_4 |
| ir.cpp:2120:22:2120:22 | ChiTotal | total:m2120_3 |
| ir.cpp:2120:22:2120:22 | SideEffect | m2120_3 |
| ir.cpp:2120:22:2120:22 | SideEffect | ~m2119_4 |
| ir.cpp:2120:22:2120:22 | Unary | r2120_6 |
| ir.cpp:2120:25:2120:42 | StoreValue | r2120_2 |
| perf-regression.cpp:6:3:6:5 | Address | &:r6_5 | | perf-regression.cpp:6:3:6:5 | Address | &:r6_5 |
| perf-regression.cpp:6:3:6:5 | Address | &:r6_5 | | perf-regression.cpp:6:3:6:5 | Address | &:r6_5 |
| perf-regression.cpp:6:3:6:5 | Address | &:r6_7 | | perf-regression.cpp:6:3:6:5 | Address | &:r6_7 |

View File

@@ -11647,6 +11647,35 @@ ir.cpp:
# 2109| v2109_11(void) = AliasedUse : ~m? # 2109| v2109_11(void) = AliasedUse : ~m?
# 2109| v2109_12(void) = ExitFunction : # 2109| v2109_12(void) = ExitFunction :
# 2119| void call_as_child_of_ConditionDeclExpr()
# 2119| Block 0
# 2119| v2119_1(void) = EnterFunction :
# 2119| mu2119_2(unknown) = AliasedDefinition :
# 2119| mu2119_3(unknown) = InitializeNonLocal :
# 2120| r2120_1(glval<HasOperatorBool>) = VariableAddress[b] :
# 2120| r2120_2(HasOperatorBool) = Constant[0] :
# 2120| mu2120_3(HasOperatorBool) = Store[b] : &:r2120_1, r2120_2
# 2120| r2120_4(glval<HasOperatorBool>) = VariableAddress[b] :
# 2120| r2120_5(glval<unknown>) = FunctionAddress[operator bool] :
# 2120| r2120_6(bool) = Call[operator bool] : func:r2120_5, this:r2120_4
# 2120| mu2120_7(unknown) = ^CallSideEffect : ~m?
# 2120| v2120_8(void) = ^IndirectReadSideEffect[-1] : &:r2120_4, ~m?
# 2120| mu2120_9(HasOperatorBool) = ^IndirectMayWriteSideEffect[-1] : &:r2120_4
# 2120| r2120_10(bool) = CopyValue : r2120_6
# 2120| v2120_11(void) = ConditionalBranch : r2120_10
#-----| False -> Block 2
#-----| True -> Block 1
# 2120| Block 1
# 2120| v2120_12(void) = NoOp :
#-----| Goto -> Block 2
# 2121| Block 2
# 2121| v2121_1(void) = NoOp :
# 2119| v2119_4(void) = ReturnVoid :
# 2119| v2119_5(void) = AliasedUse : ~m?
# 2119| v2119_6(void) = ExitFunction :
perf-regression.cpp: perf-regression.cpp:
# 6| void Big::Big() # 6| void Big::Big()
# 6| Block 0 # 6| Block 0

View File

@@ -12,7 +12,11 @@ unnecessaryPhiInstruction
memoryOperandDefinitionIsUnmodeled memoryOperandDefinitionIsUnmodeled
operandAcrossFunctions operandAcrossFunctions
instructionWithoutUniqueBlock instructionWithoutUniqueBlock
missingCanonicalLanguageType
multipleCanonicalLanguageTypes
containsLoopOfForwardEdges containsLoopOfForwardEdges
missingIRType
multipleIRTypes
lostReachability lostReachability
backEdgeCountMismatch backEdgeCountMismatch
useNotDominatedByDefinition useNotDominatedByDefinition
@@ -24,8 +28,4 @@ nonUniqueEnclosingIRFunction
fieldAddressOnNonPointer fieldAddressOnNonPointer
thisArgumentIsNonPointer thisArgumentIsNonPointer
nonUniqueIRVariable nonUniqueIRVariable
missingCanonicalLanguageType
multipleCanonicalLanguageTypes
missingIRType
multipleIRTypes
missingCppType missingCppType

View File

@@ -12,7 +12,11 @@ unnecessaryPhiInstruction
memoryOperandDefinitionIsUnmodeled memoryOperandDefinitionIsUnmodeled
operandAcrossFunctions operandAcrossFunctions
instructionWithoutUniqueBlock instructionWithoutUniqueBlock
missingCanonicalLanguageType
multipleCanonicalLanguageTypes
containsLoopOfForwardEdges containsLoopOfForwardEdges
missingIRType
multipleIRTypes
lostReachability lostReachability
backEdgeCountMismatch backEdgeCountMismatch
useNotDominatedByDefinition useNotDominatedByDefinition
@@ -24,8 +28,4 @@ nonUniqueEnclosingIRFunction
fieldAddressOnNonPointer fieldAddressOnNonPointer
thisArgumentIsNonPointer thisArgumentIsNonPointer
nonUniqueIRVariable nonUniqueIRVariable
missingCanonicalLanguageType
multipleCanonicalLanguageTypes
missingIRType
multipleIRTypes
missingCppType missingCppType

View File

@@ -8,10 +8,6 @@ duplicateChiOperand
sideEffectWithoutPrimary sideEffectWithoutPrimary
instructionWithoutSuccessor instructionWithoutSuccessor
| VacuousDestructorCall.cpp:2:29:2:29 | InitializeIndirection: y | Instruction 'InitializeIndirection: y' has no successors in function '$@'. | VacuousDestructorCall.cpp:2:6:2:6 | void CallDestructor<int>(int, int*) | void CallDestructor<int>(int, int*) | | VacuousDestructorCall.cpp:2:29:2:29 | InitializeIndirection: y | Instruction 'InitializeIndirection: y' has no successors in function '$@'. | VacuousDestructorCall.cpp:2:6:2:6 | void CallDestructor<int>(int, int*) | void CallDestructor<int>(int, int*) |
| condition_decls.cpp:16:19:16:20 | Chi: call to BoxedInt | Instruction 'Chi: call to BoxedInt' has no successors in function '$@'. | condition_decls.cpp:15:6:15:17 | void if_decl_bind(int) | void if_decl_bind(int) |
| condition_decls.cpp:26:23:26:24 | Chi: call to BoxedInt | Instruction 'Chi: call to BoxedInt' has no successors in function '$@'. | condition_decls.cpp:25:6:25:21 | void switch_decl_bind(int) | void switch_decl_bind(int) |
| condition_decls.cpp:41:22:41:23 | Chi: call to BoxedInt | Instruction 'Chi: call to BoxedInt' has no successors in function '$@'. | condition_decls.cpp:40:6:40:20 | void while_decl_bind(int) | void while_decl_bind(int) |
| condition_decls.cpp:48:52:48:53 | Chi: call to BoxedInt | Instruction 'Chi: call to BoxedInt' has no successors in function '$@'. | condition_decls.cpp:47:6:47:18 | void for_decl_bind(int) | void for_decl_bind(int) |
| ms_try_mix.cpp:35:13:35:19 | ThrowValue: throw ... | Instruction 'ThrowValue: throw ...' has no successors in function '$@'. | ms_try_mix.cpp:29:6:29:19 | void ms_finally_mix(int) | void ms_finally_mix(int) | | ms_try_mix.cpp:35:13:35:19 | ThrowValue: throw ... | Instruction 'ThrowValue: throw ...' has no successors in function '$@'. | ms_try_mix.cpp:29:6:29:19 | void ms_finally_mix(int) | void ms_finally_mix(int) |
| ms_try_mix.cpp:53:5:53:11 | ThrowValue: throw ... | Instruction 'ThrowValue: throw ...' has no successors in function '$@'. | ms_try_mix.cpp:49:6:49:28 | void ms_empty_finally_at_end() | void ms_empty_finally_at_end() | | ms_try_mix.cpp:53:5:53:11 | ThrowValue: throw ... | Instruction 'ThrowValue: throw ...' has no successors in function '$@'. | ms_try_mix.cpp:49:6:49:28 | void ms_empty_finally_at_end() | void ms_empty_finally_at_end() |
| stmt_expr.cpp:27:5:27:15 | Store: ... = ... | Instruction 'Store: ... = ...' has no successors in function '$@'. | stmt_expr.cpp:21:13:21:13 | void stmtexpr::g(int) | void stmtexpr::g(int) | | stmt_expr.cpp:27:5:27:15 | Store: ... = ... | Instruction 'Store: ... = ...' has no successors in function '$@'. | stmt_expr.cpp:21:13:21:13 | void stmtexpr::g(int) | void stmtexpr::g(int) |
@@ -21,7 +17,11 @@ unnecessaryPhiInstruction
memoryOperandDefinitionIsUnmodeled memoryOperandDefinitionIsUnmodeled
operandAcrossFunctions operandAcrossFunctions
instructionWithoutUniqueBlock instructionWithoutUniqueBlock
missingCanonicalLanguageType
multipleCanonicalLanguageTypes
containsLoopOfForwardEdges containsLoopOfForwardEdges
missingIRType
multipleIRTypes
lostReachability lostReachability
backEdgeCountMismatch backEdgeCountMismatch
useNotDominatedByDefinition useNotDominatedByDefinition
@@ -36,8 +36,4 @@ thisArgumentIsNonPointer
| pointer_to_member.cpp:23:5:23:54 | Call: call to expression | Call instruction 'Call: call to expression' has a `this` argument operand that is not an address, in function '$@'. | pointer_to_member.cpp:14:5:14:9 | int usePM(int PM::*) | int usePM(int PM::*) | | pointer_to_member.cpp:23:5:23:54 | Call: call to expression | Call instruction 'Call: call to expression' has a `this` argument operand that is not an address, in function '$@'. | pointer_to_member.cpp:14:5:14:9 | int usePM(int PM::*) | int usePM(int PM::*) |
| pointer_to_member.cpp:24:5:24:49 | Call: call to expression | Call instruction 'Call: call to expression' has a `this` argument operand that is not an address, in function '$@'. | pointer_to_member.cpp:14:5:14:9 | int usePM(int PM::*) | int usePM(int PM::*) | | pointer_to_member.cpp:24:5:24:49 | Call: call to expression | Call instruction 'Call: call to expression' has a `this` argument operand that is not an address, in function '$@'. | pointer_to_member.cpp:14:5:14:9 | int usePM(int PM::*) | int usePM(int PM::*) |
nonUniqueIRVariable nonUniqueIRVariable
missingCanonicalLanguageType
multipleCanonicalLanguageTypes
missingIRType
multipleIRTypes
missingCppType missingCppType

View File

@@ -1,8 +1,4 @@
missingOperand missingOperand
| condition_decls.cpp:16:6:16:20 | CopyValue: (condition decl) | Instruction 'CopyValue' is missing an expected operand with tag 'Unary' in function '$@'. | condition_decls.cpp:15:6:15:17 | void if_decl_bind(int) | void if_decl_bind(int) |
| condition_decls.cpp:26:10:26:24 | CopyValue: (condition decl) | Instruction 'CopyValue' is missing an expected operand with tag 'Unary' in function '$@'. | condition_decls.cpp:25:6:25:21 | void switch_decl_bind(int) | void switch_decl_bind(int) |
| condition_decls.cpp:41:9:41:23 | CopyValue: (condition decl) | Instruction 'CopyValue' is missing an expected operand with tag 'Unary' in function '$@'. | condition_decls.cpp:40:6:40:20 | void while_decl_bind(int) | void while_decl_bind(int) |
| condition_decls.cpp:48:39:48:53 | CopyValue: (condition decl) | Instruction 'CopyValue' is missing an expected operand with tag 'Unary' in function '$@'. | condition_decls.cpp:47:6:47:18 | void for_decl_bind(int) | void for_decl_bind(int) |
| misc.c:125:5:125:11 | CopyValue: (statement expression) | Instruction 'CopyValue' is missing an expected operand with tag 'Unary' in function '$@'. | misc.c:97:6:97:10 | void misc3() | void misc3() | | misc.c:125:5:125:11 | CopyValue: (statement expression) | Instruction 'CopyValue' is missing an expected operand with tag 'Unary' in function '$@'. | misc.c:97:6:97:10 | void misc3() | void misc3() |
| try_catch.cpp:23:5:23:18 | CopyValue: (statement expression) | Instruction 'CopyValue' is missing an expected operand with tag 'Unary' in function '$@'. | try_catch.cpp:19:6:19:23 | void throw_from_nonstmt(int) | void throw_from_nonstmt(int) | | try_catch.cpp:23:5:23:18 | CopyValue: (statement expression) | Instruction 'CopyValue' is missing an expected operand with tag 'Unary' in function '$@'. | try_catch.cpp:19:6:19:23 | void throw_from_nonstmt(int) | void throw_from_nonstmt(int) |
unexpectedOperand unexpectedOperand
@@ -15,14 +11,6 @@ instructionWithoutSuccessor
| VacuousDestructorCall.cpp:2:29:2:29 | InitializeIndirection: y | Instruction 'InitializeIndirection: y' has no successors in function '$@'. | VacuousDestructorCall.cpp:2:6:2:6 | void CallDestructor<int>(int, int*) | void CallDestructor<int>(int, int*) | | VacuousDestructorCall.cpp:2:29:2:29 | InitializeIndirection: y | Instruction 'InitializeIndirection: y' has no successors in function '$@'. | VacuousDestructorCall.cpp:2:6:2:6 | void CallDestructor<int>(int, int*) | void CallDestructor<int>(int, int*) |
| VacuousDestructorCall.cpp:3:3:3:3 | VariableAddress: x | Instruction 'VariableAddress: x' has no successors in function '$@'. | VacuousDestructorCall.cpp:2:6:2:6 | void CallDestructor<int>(int, int*) | void CallDestructor<int>(int, int*) | | VacuousDestructorCall.cpp:3:3:3:3 | VariableAddress: x | Instruction 'VariableAddress: x' has no successors in function '$@'. | VacuousDestructorCall.cpp:2:6:2:6 | void CallDestructor<int>(int, int*) | void CallDestructor<int>(int, int*) |
| VacuousDestructorCall.cpp:4:3:4:3 | Load: y | Instruction 'Load: y' has no successors in function '$@'. | VacuousDestructorCall.cpp:2:6:2:6 | void CallDestructor<int>(int, int*) | void CallDestructor<int>(int, int*) | | VacuousDestructorCall.cpp:4:3:4:3 | Load: y | Instruction 'Load: y' has no successors in function '$@'. | VacuousDestructorCall.cpp:2:6:2:6 | void CallDestructor<int>(int, int*) | void CallDestructor<int>(int, int*) |
| condition_decls.cpp:16:19:16:20 | IndirectMayWriteSideEffect: call to BoxedInt | Instruction 'IndirectMayWriteSideEffect: call to BoxedInt' has no successors in function '$@'. | condition_decls.cpp:15:6:15:17 | void if_decl_bind(int) | void if_decl_bind(int) |
| condition_decls.cpp:26:19:26:20 | IndirectMayWriteSideEffect: bi | Instruction 'IndirectMayWriteSideEffect: bi' has no successors in function '$@'. | condition_decls.cpp:25:6:25:21 | void switch_decl_bind(int) | void switch_decl_bind(int) |
| condition_decls.cpp:26:23:26:24 | IndirectMayWriteSideEffect: call to BoxedInt | Instruction 'IndirectMayWriteSideEffect: call to BoxedInt' has no successors in function '$@'. | condition_decls.cpp:25:6:25:21 | void switch_decl_bind(int) | void switch_decl_bind(int) |
| condition_decls.cpp:41:22:41:23 | IndirectMayWriteSideEffect: call to BoxedInt | Instruction 'IndirectMayWriteSideEffect: call to BoxedInt' has no successors in function '$@'. | condition_decls.cpp:40:6:40:20 | void while_decl_bind(int) | void while_decl_bind(int) |
| condition_decls.cpp:48:52:48:53 | IndirectMayWriteSideEffect: call to BoxedInt | Instruction 'IndirectMayWriteSideEffect: call to BoxedInt' has no successors in function '$@'. | condition_decls.cpp:47:6:47:18 | void for_decl_bind(int) | void for_decl_bind(int) |
| file://:0:0:0:0 | CompareNE: (bool)... | Instruction 'CompareNE: (bool)...' has no successors in function '$@'. | condition_decls.cpp:15:6:15:17 | void if_decl_bind(int) | void if_decl_bind(int) |
| file://:0:0:0:0 | CompareNE: (bool)... | Instruction 'CompareNE: (bool)...' has no successors in function '$@'. | condition_decls.cpp:40:6:40:20 | void while_decl_bind(int) | void while_decl_bind(int) |
| file://:0:0:0:0 | CompareNE: (bool)... | Instruction 'CompareNE: (bool)...' has no successors in function '$@'. | condition_decls.cpp:47:6:47:18 | void for_decl_bind(int) | void for_decl_bind(int) |
| ms_try_mix.cpp:35:13:35:19 | ThrowValue: throw ... | Instruction 'ThrowValue: throw ...' has no successors in function '$@'. | ms_try_mix.cpp:29:6:29:19 | void ms_finally_mix(int) | void ms_finally_mix(int) | | ms_try_mix.cpp:35:13:35:19 | ThrowValue: throw ... | Instruction 'ThrowValue: throw ...' has no successors in function '$@'. | ms_try_mix.cpp:29:6:29:19 | void ms_finally_mix(int) | void ms_finally_mix(int) |
| ms_try_mix.cpp:53:5:53:11 | ThrowValue: throw ... | Instruction 'ThrowValue: throw ...' has no successors in function '$@'. | ms_try_mix.cpp:49:6:49:28 | void ms_empty_finally_at_end() | void ms_empty_finally_at_end() | | ms_try_mix.cpp:53:5:53:11 | ThrowValue: throw ... | Instruction 'ThrowValue: throw ...' has no successors in function '$@'. | ms_try_mix.cpp:49:6:49:28 | void ms_empty_finally_at_end() | void ms_empty_finally_at_end() |
| stmt_expr.cpp:27:5:27:15 | Store: ... = ... | Instruction 'Store: ... = ...' has no successors in function '$@'. | stmt_expr.cpp:21:13:21:13 | void stmtexpr::g(int) | void stmtexpr::g(int) | | stmt_expr.cpp:27:5:27:15 | Store: ... = ... | Instruction 'Store: ... = ...' has no successors in function '$@'. | stmt_expr.cpp:21:13:21:13 | void stmtexpr::g(int) | void stmtexpr::g(int) |

View File

@@ -8,10 +8,6 @@ duplicateChiOperand
sideEffectWithoutPrimary sideEffectWithoutPrimary
instructionWithoutSuccessor instructionWithoutSuccessor
| VacuousDestructorCall.cpp:2:29:2:29 | InitializeIndirection: y | Instruction 'InitializeIndirection: y' has no successors in function '$@'. | VacuousDestructorCall.cpp:2:6:2:6 | void CallDestructor<int>(int, int*) | void CallDestructor<int>(int, int*) | | VacuousDestructorCall.cpp:2:29:2:29 | InitializeIndirection: y | Instruction 'InitializeIndirection: y' has no successors in function '$@'. | VacuousDestructorCall.cpp:2:6:2:6 | void CallDestructor<int>(int, int*) | void CallDestructor<int>(int, int*) |
| condition_decls.cpp:16:19:16:20 | IndirectMayWriteSideEffect: call to BoxedInt | Instruction 'IndirectMayWriteSideEffect: call to BoxedInt' has no successors in function '$@'. | condition_decls.cpp:15:6:15:17 | void if_decl_bind(int) | void if_decl_bind(int) |
| condition_decls.cpp:26:23:26:24 | IndirectMayWriteSideEffect: call to BoxedInt | Instruction 'IndirectMayWriteSideEffect: call to BoxedInt' has no successors in function '$@'. | condition_decls.cpp:25:6:25:21 | void switch_decl_bind(int) | void switch_decl_bind(int) |
| condition_decls.cpp:41:22:41:23 | IndirectMayWriteSideEffect: call to BoxedInt | Instruction 'IndirectMayWriteSideEffect: call to BoxedInt' has no successors in function '$@'. | condition_decls.cpp:40:6:40:20 | void while_decl_bind(int) | void while_decl_bind(int) |
| condition_decls.cpp:48:52:48:53 | IndirectMayWriteSideEffect: call to BoxedInt | Instruction 'IndirectMayWriteSideEffect: call to BoxedInt' has no successors in function '$@'. | condition_decls.cpp:47:6:47:18 | void for_decl_bind(int) | void for_decl_bind(int) |
| ms_try_mix.cpp:35:13:35:19 | ThrowValue: throw ... | Instruction 'ThrowValue: throw ...' has no successors in function '$@'. | ms_try_mix.cpp:29:6:29:19 | void ms_finally_mix(int) | void ms_finally_mix(int) | | ms_try_mix.cpp:35:13:35:19 | ThrowValue: throw ... | Instruction 'ThrowValue: throw ...' has no successors in function '$@'. | ms_try_mix.cpp:29:6:29:19 | void ms_finally_mix(int) | void ms_finally_mix(int) |
| ms_try_mix.cpp:53:5:53:11 | ThrowValue: throw ... | Instruction 'ThrowValue: throw ...' has no successors in function '$@'. | ms_try_mix.cpp:49:6:49:28 | void ms_empty_finally_at_end() | void ms_empty_finally_at_end() | | ms_try_mix.cpp:53:5:53:11 | ThrowValue: throw ... | Instruction 'ThrowValue: throw ...' has no successors in function '$@'. | ms_try_mix.cpp:49:6:49:28 | void ms_empty_finally_at_end() | void ms_empty_finally_at_end() |
| stmt_expr.cpp:27:5:27:15 | Store: ... = ... | Instruction 'Store: ... = ...' has no successors in function '$@'. | stmt_expr.cpp:21:13:21:13 | void stmtexpr::g(int) | void stmtexpr::g(int) | | stmt_expr.cpp:27:5:27:15 | Store: ... = ... | Instruction 'Store: ... = ...' has no successors in function '$@'. | stmt_expr.cpp:21:13:21:13 | void stmtexpr::g(int) | void stmtexpr::g(int) |
@@ -21,7 +17,11 @@ unnecessaryPhiInstruction
memoryOperandDefinitionIsUnmodeled memoryOperandDefinitionIsUnmodeled
operandAcrossFunctions operandAcrossFunctions
instructionWithoutUniqueBlock instructionWithoutUniqueBlock
missingCanonicalLanguageType
multipleCanonicalLanguageTypes
containsLoopOfForwardEdges containsLoopOfForwardEdges
missingIRType
multipleIRTypes
lostReachability lostReachability
backEdgeCountMismatch backEdgeCountMismatch
useNotDominatedByDefinition useNotDominatedByDefinition
@@ -36,8 +36,4 @@ thisArgumentIsNonPointer
| pointer_to_member.cpp:23:5:23:54 | Call: call to expression | Call instruction 'Call: call to expression' has a `this` argument operand that is not an address, in function '$@'. | pointer_to_member.cpp:14:5:14:9 | int usePM(int PM::*) | int usePM(int PM::*) | | pointer_to_member.cpp:23:5:23:54 | Call: call to expression | Call instruction 'Call: call to expression' has a `this` argument operand that is not an address, in function '$@'. | pointer_to_member.cpp:14:5:14:9 | int usePM(int PM::*) | int usePM(int PM::*) |
| pointer_to_member.cpp:24:5:24:49 | Call: call to expression | Call instruction 'Call: call to expression' has a `this` argument operand that is not an address, in function '$@'. | pointer_to_member.cpp:14:5:14:9 | int usePM(int PM::*) | int usePM(int PM::*) | | pointer_to_member.cpp:24:5:24:49 | Call: call to expression | Call instruction 'Call: call to expression' has a `this` argument operand that is not an address, in function '$@'. | pointer_to_member.cpp:14:5:14:9 | int usePM(int PM::*) | int usePM(int PM::*) |
nonUniqueIRVariable nonUniqueIRVariable
missingCanonicalLanguageType
multipleCanonicalLanguageTypes
missingIRType
multipleIRTypes
missingCppType missingCppType

View File

@@ -6,6 +6,9 @@ version: 1.22.1
column_kind: "utf16" column_kind: "utf16"
extra_env_vars: extra_env_vars:
DOTNET_GENERATE_ASPNET_CERTIFICATE: "false" DOTNET_GENERATE_ASPNET_CERTIFICATE: "false"
build_modes:
- autobuild
- manual
github_api_languages: github_api_languages:
- C# - C#
scc_languages: scc_languages:

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,3 @@
description: Remove `compilation_info`.
compatibility: backwards
compilation_info.rel: delete

View File

@@ -133,6 +133,17 @@ namespace Semmle.Extraction.CSharp.DependencyFetching
logger.LogInfo($"{conflictedReferences,align} resolved assembly conflicts"); logger.LogInfo($"{conflictedReferences,align} resolved assembly conflicts");
logger.LogInfo($"{dotnetFrameworkVersionVariantCount,align} restored .NET framework variants"); logger.LogInfo($"{dotnetFrameworkVersionVariantCount,align} restored .NET framework variants");
logger.LogInfo($"Build analysis completed in {DateTime.Now - startTime}"); logger.LogInfo($"Build analysis completed in {DateTime.Now - startTime}");
CompilationInfos.AddRange([
("Source files on filesystem", nonGeneratedSources.Count.ToString()),
("Source files generated", generatedSources.Count.ToString()),
("Solution files on filesystem", allSolutions.Count.ToString()),
("Project files on filesystem", allProjects.Count.ToString()),
("Resolved references", usedReferences.Keys.Count.ToString()),
("Unresolved references", unresolvedReferences.Count.ToString()),
("Resolved assembly conflicts", conflictedReferences.ToString()),
("Restored .NET framework variants", dotnetFrameworkVersionVariantCount.ToString()),
]);
} }
private HashSet<string> AddFrameworkDlls(HashSet<string> dllPaths) private HashSet<string> AddFrameworkDlls(HashSet<string> dllPaths)
@@ -151,7 +162,13 @@ namespace Semmle.Extraction.CSharp.DependencyFetching
try try
{ {
var nuget = new NugetPackages(sourceDir.FullName, legacyPackageDirectory, logger); var nuget = new NugetPackages(sourceDir.FullName, legacyPackageDirectory, logger);
nuget.InstallPackages(); var count = nuget.InstallPackages();
if (nuget.PackageCount > 0)
{
CompilationInfos.Add(("packages.config files", nuget.PackageCount.ToString()));
CompilationInfos.Add(("Successfully restored packages.config files", count.ToString()));
}
var nugetPackageDlls = legacyPackageDirectory.DirInfo.GetFiles("*.dll", new EnumerationOptions { RecurseSubdirectories = true }); var nugetPackageDlls = legacyPackageDirectory.DirInfo.GetFiles("*.dll", new EnumerationOptions { RecurseSubdirectories = true });
var nugetPackageDllPaths = nugetPackageDlls.Select(f => f.FullName).ToHashSet(); var nugetPackageDllPaths = nugetPackageDlls.Select(f => f.FullName).ToHashSet();
@@ -629,6 +646,11 @@ namespace Semmle.Extraction.CSharp.DependencyFetching
/// </summary> /// </summary>
public IEnumerable<string> UnresolvedReferences => unresolvedReferences.Select(r => r.Key); public IEnumerable<string> UnresolvedReferences => unresolvedReferences.Select(r => r.Key);
/// <summary>
/// List of `(key, value)` tuples, that are stored in the DB for telemetry purposes.
/// </summary>
public List<(string, string)> CompilationInfos { get; } = new List<(string, string)>();
/// <summary> /// <summary>
/// Record that a particular reference couldn't be resolved. /// Record that a particular reference couldn't be resolved.
/// Note that this records at most one project file per missing reference. /// Note that this records at most one project file per missing reference.
@@ -699,15 +721,22 @@ namespace Semmle.Extraction.CSharp.DependencyFetching
/// <param name="solutions">A list of paths to solution files.</param> /// <param name="solutions">A list of paths to solution files.</param>
private IEnumerable<string> RestoreSolutions(IEnumerable<string> solutions, out IEnumerable<string> assets) private IEnumerable<string> RestoreSolutions(IEnumerable<string> solutions, out IEnumerable<string> assets)
{ {
var successCount = 0;
var assetFiles = new List<string>(); var assetFiles = new List<string>();
var projects = solutions.SelectMany(solution => var projects = solutions.SelectMany(solution =>
{ {
logger.LogInfo($"Restoring solution {solution}..."); logger.LogInfo($"Restoring solution {solution}...");
var res = dotnet.Restore(new(solution, packageDirectory.DirInfo.FullName, ForceDotnetRefAssemblyFetching: true)); var res = dotnet.Restore(new(solution, packageDirectory.DirInfo.FullName, ForceDotnetRefAssemblyFetching: true));
if (res.Success)
{
successCount++;
}
assetFiles.AddRange(res.AssetsFilePaths); assetFiles.AddRange(res.AssetsFilePaths);
return res.RestoredProjects; return res.RestoredProjects;
}); }).ToList();
assets = assetFiles; assets = assetFiles;
CompilationInfos.Add(("Successfully restored solution files", successCount.ToString()));
CompilationInfos.Add(("Restored projects through solution files", projects.Count.ToString()));
return projects; return projects;
} }
@@ -719,14 +748,24 @@ namespace Semmle.Extraction.CSharp.DependencyFetching
/// <param name="projects">A list of paths to project files.</param> /// <param name="projects">A list of paths to project files.</param>
private void RestoreProjects(IEnumerable<string> projects, out IEnumerable<string> assets) private void RestoreProjects(IEnumerable<string> projects, out IEnumerable<string> assets)
{ {
var successCount = 0;
var assetFiles = new List<string>(); var assetFiles = new List<string>();
var sync = new object();
Parallel.ForEach(projects, new ParallelOptions { MaxDegreeOfParallelism = options.Threads }, project => Parallel.ForEach(projects, new ParallelOptions { MaxDegreeOfParallelism = options.Threads }, project =>
{ {
logger.LogInfo($"Restoring project {project}..."); logger.LogInfo($"Restoring project {project}...");
var res = dotnet.Restore(new(project, packageDirectory.DirInfo.FullName, ForceDotnetRefAssemblyFetching: true)); var res = dotnet.Restore(new(project, packageDirectory.DirInfo.FullName, ForceDotnetRefAssemblyFetching: true));
lock (sync)
{
if (res.Success)
{
successCount++;
}
assetFiles.AddRange(res.AssetsFilePaths); assetFiles.AddRange(res.AssetsFilePaths);
}
}); });
assets = assetFiles; assets = assetFiles;
CompilationInfos.Add(("Successfully restored project files", successCount.ToString()));
} }
private void DownloadMissingPackages(List<FileInfo> allFiles, ISet<string> dllPaths) private void DownloadMissingPackages(List<FileInfo> allFiles, ISet<string> dllPaths)
@@ -767,6 +806,11 @@ namespace Semmle.Extraction.CSharp.DependencyFetching
logger.LogInfo($"Using nuget.config file {nugetConfig}."); logger.LogInfo($"Using nuget.config file {nugetConfig}.");
} }
CompilationInfos.Add(("Fallback nuget restore", notYetDownloadedPackages.Count.ToString()));
var successCount = 0;
var sync = new object();
Parallel.ForEach(notYetDownloadedPackages, new ParallelOptions { MaxDegreeOfParallelism = options.Threads }, package => Parallel.ForEach(notYetDownloadedPackages, new ParallelOptions { MaxDegreeOfParallelism = options.Threads }, package =>
{ {
logger.LogInfo($"Restoring package {package}..."); logger.LogInfo($"Restoring package {package}...");
@@ -797,10 +841,18 @@ namespace Semmle.Extraction.CSharp.DependencyFetching
if (!res.Success) if (!res.Success)
{ {
logger.LogInfo($"Failed to restore nuget package {package}"); logger.LogInfo($"Failed to restore nuget package {package}");
return;
} }
} }
lock (sync)
{
successCount++;
}
}); });
CompilationInfos.Add(("Successfully ran fallback nuget restore", successCount.ToString()));
dllPaths.Add(missingPackageDirectory.DirInfo.FullName); dllPaths.Add(missingPackageDirectory.DirInfo.FullName);
} }

View File

@@ -22,6 +22,8 @@ namespace Semmle.Extraction.CSharp.DependencyFetching
/// </summary> /// </summary>
private readonly FileInfo[] packageFiles; private readonly FileInfo[] packageFiles;
public int PackageCount => packageFiles.Length;
/// <summary> /// <summary>
/// The computed packages directory. /// The computed packages directory.
/// This will be in the Temp location /// This will be in the Temp location
@@ -105,7 +107,7 @@ namespace Semmle.Extraction.CSharp.DependencyFetching
/// Restore all files in a specified package. /// Restore all files in a specified package.
/// </summary> /// </summary>
/// <param name="package">The package file.</param> /// <param name="package">The package file.</param>
private void RestoreNugetPackage(string package) private bool TryRestoreNugetPackage(string package)
{ {
logger.LogInfo($"Restoring file {package}..."); logger.LogInfo($"Restoring file {package}...");
@@ -141,22 +143,21 @@ namespace Semmle.Extraction.CSharp.DependencyFetching
if (exitCode != 0) if (exitCode != 0)
{ {
logger.LogError($"Command {pi.FileName} {pi.Arguments} failed with exit code {exitCode}"); logger.LogError($"Command {pi.FileName} {pi.Arguments} failed with exit code {exitCode}");
return false;
} }
else else
{ {
logger.LogInfo($"Restored file {package}"); logger.LogInfo($"Restored file {package}");
return true;
} }
} }
/// <summary> /// <summary>
/// Download the packages to the temp folder. /// Download the packages to the temp folder.
/// </summary> /// </summary>
public void InstallPackages() public int InstallPackages()
{ {
foreach (var package in packageFiles) return packageFiles.Count(package => TryRestoreNugetPackage(package.FullName));
{
RestoreNugetPackage(package.FullName);
}
} }
} }
} }

View File

@@ -5,6 +5,7 @@ using System.Diagnostics;
using System.Linq; using System.Linq;
using Microsoft.CodeAnalysis; using Microsoft.CodeAnalysis;
using Microsoft.CodeAnalysis.CSharp; using Microsoft.CodeAnalysis.CSharp;
using Semmle.Extraction.CSharp.DependencyFetching;
using Semmle.Util; using Semmle.Util;
using Semmle.Util.Logging; using Semmle.Util.Logging;
@@ -12,7 +13,6 @@ namespace Semmle.Extraction.CSharp.Standalone
{ {
public static class Extractor public static class Extractor
{ {
private static IEnumerable<Action> GetResolvedReferencesStandalone(IEnumerable<string> referencePaths, BlockingCollection<MetadataReference> references) private static IEnumerable<Action> GetResolvedReferencesStandalone(IEnumerable<string> referencePaths, BlockingCollection<MetadataReference> references)
{ {
return referencePaths.Select<string, Action>(path => () => return referencePaths.Select<string, Action>(path => () =>
@@ -24,8 +24,7 @@ namespace Semmle.Extraction.CSharp.Standalone
private static void AnalyseStandalone( private static void AnalyseStandalone(
StandaloneAnalyser analyser, StandaloneAnalyser analyser,
IEnumerable<string> sources, ExtractionInput extractionInput,
IEnumerable<string> referencePaths,
CommonOptions options, CommonOptions options,
IProgressMonitor progressMonitor, IProgressMonitor progressMonitor,
Stopwatch stopwatch) Stopwatch stopwatch)
@@ -35,12 +34,12 @@ namespace Semmle.Extraction.CSharp.Standalone
try try
{ {
CSharp.Extractor.Analyse(stopwatch, analyser, options, CSharp.Extractor.Analyse(stopwatch, analyser, options,
references => GetResolvedReferencesStandalone(referencePaths, references), references => GetResolvedReferencesStandalone(extractionInput.References, references),
(analyser, syntaxTrees) => CSharp.Extractor.ReadSyntaxTrees(sources, analyser, null, null, syntaxTrees), (analyser, syntaxTrees) => CSharp.Extractor.ReadSyntaxTrees(extractionInput.Sources, analyser, null, null, syntaxTrees),
(syntaxTrees, references) => CSharpCompilation.Create( (syntaxTrees, references) => CSharpCompilation.Create(
output.Name, syntaxTrees, references, new CSharpCompilationOptions(OutputKind.ConsoleApplication, allowUnsafe: true) output.Name, syntaxTrees, references, new CSharpCompilationOptions(OutputKind.ConsoleApplication, allowUnsafe: true)
), ),
(compilation, options) => analyser.Initialize(output.FullName, compilation, options), (compilation, options) => analyser.Initialize(output.FullName, extractionInput.CompilationInfos, compilation, options),
_ => { }, _ => { },
() => () =>
{ {
@@ -73,8 +72,7 @@ namespace Semmle.Extraction.CSharp.Standalone
} }
private static void ExtractStandalone( private static void ExtractStandalone(
IEnumerable<string> sources, ExtractionInput extractionInput,
IEnumerable<string> referencePaths,
IProgressMonitor pm, IProgressMonitor pm,
ILogger logger, ILogger logger,
CommonOptions options) CommonOptions options)
@@ -88,7 +86,7 @@ namespace Semmle.Extraction.CSharp.Standalone
using var analyser = new StandaloneAnalyser(pm, logger, false, pathTransformer); using var analyser = new StandaloneAnalyser(pm, logger, false, pathTransformer);
try try
{ {
AnalyseStandalone(analyser, sources, referencePaths, options, pm, stopwatch); AnalyseStandalone(analyser, extractionInput, options, pm, stopwatch);
} }
catch (Exception ex) // lgtm[cs/catch-of-all-exceptions] catch (Exception ex) // lgtm[cs/catch-of-all-exceptions]
{ {
@@ -131,6 +129,8 @@ namespace Semmle.Extraction.CSharp.Standalone
} }
} }
public record ExtractionInput(IEnumerable<string> Sources, IEnumerable<string> References, IEnumerable<(string, string)> CompilationInfos);
public static ExitCode Run(Options options) public static ExitCode Run(Options options)
{ {
var stopwatch = new Stopwatch(); var stopwatch = new Stopwatch();
@@ -138,10 +138,9 @@ namespace Semmle.Extraction.CSharp.Standalone
using var logger = new ConsoleLogger(options.Verbosity, logThreadId: true); using var logger = new ConsoleLogger(options.Verbosity, logThreadId: true);
logger.Log(Severity.Info, "Extracting C# in buildless mode"); logger.Log(Severity.Info, "Extracting C# in buildless mode");
using var a = new Analysis(logger, options); using var dependencyManager = new DependencyManager(options.SrcDir, options.Dependencies, logger);
var sourceFileCount = a.Extraction.Sources.Count;
if (sourceFileCount == 0) if (!dependencyManager.AllSourceFiles.Any())
{ {
logger.Log(Severity.Error, "No source files found"); logger.Log(Severity.Error, "No source files found");
return ExitCode.Errors; return ExitCode.Errors;
@@ -152,8 +151,7 @@ namespace Semmle.Extraction.CSharp.Standalone
logger.Log(Severity.Info, ""); logger.Log(Severity.Info, "");
logger.Log(Severity.Info, "Extracting..."); logger.Log(Severity.Info, "Extracting...");
ExtractStandalone( ExtractStandalone(
a.Extraction.Sources, new ExtractionInput(dependencyManager.AllSourceFiles, dependencyManager.ReferenceFiles, dependencyManager.CompilationInfos),
a.References,
new ExtractionProgress(logger), new ExtractionProgress(logger),
fileLogger, fileLogger,
options); options);

View File

@@ -5,48 +5,6 @@ using Semmle.Extraction.CSharp.DependencyFetching;
namespace Semmle.Extraction.CSharp.Standalone namespace Semmle.Extraction.CSharp.Standalone
{ {
/// <summary>
/// One independent run of the extractor.
/// </summary>
internal class Extraction
{
public Extraction(string directory)
{
Directory = directory;
}
public string Directory { get; }
public List<string> Sources { get; } = new List<string>();
};
/// <summary>
/// Searches for source/references and creates separate extractions.
/// </summary>
internal sealed class Analysis : IDisposable
{
public Analysis(ILogger logger, Options options)
{
dependencyManager = new DependencyManager(options.SrcDir, options.Dependencies, logger);
References = dependencyManager.ReferenceFiles;
Extraction = new Extraction(options.SrcDir);
Extraction.Sources.AddRange(dependencyManager.AllSourceFiles);
}
public IEnumerable<string> References { get; }
/// <summary>
/// The extraction configuration.
/// </summary>
public Extraction Extraction { get; }
private readonly DependencyManager dependencyManager;
public void Dispose()
{
dependencyManager.Dispose();
}
};
public class Program public class Program
{ {
public static int Main(string[] args) public static int Main(string[] args)

View File

@@ -6,6 +6,7 @@ using System.Linq;
using System.Threading.Tasks; using System.Threading.Tasks;
using Microsoft.CodeAnalysis; using Microsoft.CodeAnalysis;
using Microsoft.CodeAnalysis.CSharp; using Microsoft.CodeAnalysis.CSharp;
using Semmle.Util;
using Semmle.Util.Logging; using Semmle.Util.Logging;
using Semmle.Extraction.CSharp.Populators; using Semmle.Extraction.CSharp.Populators;
@@ -240,6 +241,8 @@ namespace Semmle.Extraction.CSharp
var cx = new Context(extractor, compilation.Clone(), trapWriter, new AssemblyScope(assembly, assemblyPath), addAssemblyTrapPrefix); var cx = new Context(extractor, compilation.Clone(), trapWriter, new AssemblyScope(assembly, assemblyPath), addAssemblyTrapPrefix);
compilationEntity = Entities.Compilation.Create(cx); compilationEntity = Entities.Compilation.Create(cx);
extractor.CompilationInfos.ForEach(ci => trapWriter.Writer.compilation_info(compilationEntity, ci.key, ci.value));
} }
catch (Exception ex) // lgtm[cs/catch-of-all-exceptions] catch (Exception ex) // lgtm[cs/catch-of-all-exceptions]
{ {

View File

@@ -13,10 +13,10 @@ namespace Semmle.Extraction.CSharp
{ {
} }
public void Initialize(string outputPath, CSharpCompilation compilationIn, CommonOptions options) public void Initialize(string outputPath, IEnumerable<(string, string)> compilationInfos, CSharpCompilation compilationIn, CommonOptions options)
{ {
compilation = compilationIn; compilation = compilationIn;
extractor = new StandaloneExtractor(outputPath, Logger, PathTransformer, options); extractor = new StandaloneExtractor(outputPath, compilationInfos, Logger, PathTransformer, options);
this.options = options; this.options = options;
LogExtractorInfo(Extraction.Extractor.Version); LogExtractorInfo(Extraction.Extractor.Version);
SetReferencePaths(); SetReferencePaths();

View File

@@ -71,6 +71,9 @@ namespace Semmle.Extraction.CSharp
internal static void compilation_expanded_args(this TextWriter trapFile, Compilation compilation, int index, string arg) => internal static void compilation_expanded_args(this TextWriter trapFile, Compilation compilation, int index, string arg) =>
trapFile.WriteTuple("compilation_expanded_args", compilation, index, arg); trapFile.WriteTuple("compilation_expanded_args", compilation, index, arg);
internal static void compilation_info(this TextWriter trapFile, Compilation compilation, string infoKey, string infoValue) =>
trapFile.WriteTuple("compilation_info", compilation, infoKey, infoValue);
internal static void compilation_compiling_files(this TextWriter trapFile, Compilation compilation, int index, Extraction.Entities.File file) => internal static void compilation_compiling_files(this TextWriter trapFile, Compilation compilation, int index, Extraction.Entities.File file) =>
trapFile.WriteTuple("compilation_compiling_files", compilation, index, file); trapFile.WriteTuple("compilation_compiling_files", compilation, index, file);

View File

@@ -1,6 +1,8 @@
using System.Collections.Generic; using System.Collections.Generic;
using Semmle.Util.Logging; using Semmle.Util.Logging;
using CompilationInfo = (string key, string value);
namespace Semmle.Extraction namespace Semmle.Extraction
{ {
/// <summary> /// <summary>
@@ -10,17 +12,19 @@ namespace Semmle.Extraction
{ {
public abstract ExtractorMode Mode { get; } public abstract ExtractorMode Mode { get; }
public string OutputPath { get; } public string OutputPath { get; }
public IEnumerable<CompilationInfo> CompilationInfos { get; }
/// <summary> /// <summary>
/// Creates a new extractor instance for one compilation unit. /// Creates a new extractor instance for one compilation unit.
/// </summary> /// </summary>
/// <param name="logger">The object used for logging.</param> /// <param name="logger">The object used for logging.</param>
/// <param name="pathTransformer">The object used for path transformations.</param> /// <param name="pathTransformer">The object used for path transformations.</param>
protected Extractor(string outputPath, ILogger logger, PathTransformer pathTransformer) protected Extractor(string outputPath, IEnumerable<CompilationInfo> compilationInfos, ILogger logger, PathTransformer pathTransformer)
{ {
OutputPath = outputPath; OutputPath = outputPath;
Logger = logger; Logger = logger;
PathTransformer = pathTransformer; PathTransformer = pathTransformer;
CompilationInfos = compilationInfos;
} }
// Limit the number of error messages in the log file // Limit the number of error messages in the log file

View File

@@ -1,3 +1,4 @@
using System.Collections.Generic;
using Semmle.Util.Logging; using Semmle.Util.Logging;
namespace Semmle.Extraction namespace Semmle.Extraction
@@ -11,7 +12,7 @@ namespace Semmle.Extraction
/// </summary> /// </summary>
/// <param name="logger">The object used for logging.</param> /// <param name="logger">The object used for logging.</param>
/// <param name="pathTransformer">The object used for path transformations.</param> /// <param name="pathTransformer">The object used for path transformations.</param>
public StandaloneExtractor(string outputPath, ILogger logger, PathTransformer pathTransformer, CommonOptions options) : base(outputPath, logger, pathTransformer) public StandaloneExtractor(string outputPath, IEnumerable<(string, string)> compilationInfos, ILogger logger, PathTransformer pathTransformer, CommonOptions options) : base(outputPath, compilationInfos, logger, pathTransformer)
{ {
Mode = ExtractorMode.Standalone; Mode = ExtractorMode.Standalone;
if (options.QlTest) if (options.QlTest)

View File

@@ -1,3 +1,4 @@
using System.Linq;
using Semmle.Util.Logging; using Semmle.Util.Logging;
namespace Semmle.Extraction namespace Semmle.Extraction
@@ -12,7 +13,7 @@ namespace Semmle.Extraction
/// <param name="outputPath">The name of the output DLL/EXE, or null if not specified (standalone extraction).</param> /// <param name="outputPath">The name of the output DLL/EXE, or null if not specified (standalone extraction).</param>
/// <param name="logger">The object used for logging.</param> /// <param name="logger">The object used for logging.</param>
/// <param name="pathTransformer">The object used for path transformations.</param> /// <param name="pathTransformer">The object used for path transformations.</param>
public TracingExtractor(string outputPath, ILogger logger, PathTransformer pathTransformer, CommonOptions options) : base(outputPath, logger, pathTransformer) public TracingExtractor(string outputPath, ILogger logger, PathTransformer pathTransformer, CommonOptions options) : base(outputPath, Enumerable.Empty<(string, string)>(), logger, pathTransformer)
{ {
Mode = ExtractorMode.None; Mode = ExtractorMode.None;
if (options.QlTest) if (options.QlTest)

View File

@@ -0,0 +1,6 @@
---
category: minorAnalysis
---
* Added a new database relation to store key-value pairs corresponding to compilations. The new relation is used in
buildless mode to surface information related to dependency fetching.

View File

@@ -12,6 +12,8 @@ extensions:
- ["System.Collections.Immutable", "IImmutableSet<T>", True, "Add", "(T)", "", "Argument[0]", "Argument[this].Element", "value", "manual"] - ["System.Collections.Immutable", "IImmutableSet<T>", True, "Add", "(T)", "", "Argument[0]", "Argument[this].Element", "value", "manual"]
- ["System.Collections.Immutable", "IImmutableSet<T>", True, "Clear", "()", "", "Argument[this].WithoutElement", "ReturnValue", "value", "manual"] - ["System.Collections.Immutable", "IImmutableSet<T>", True, "Clear", "()", "", "Argument[this].WithoutElement", "ReturnValue", "value", "manual"]
- ["System.Collections.Immutable", "IImmutableStack<T>", True, "Clear", "()", "", "Argument[this].WithoutElement", "ReturnValue", "value", "manual"] - ["System.Collections.Immutable", "IImmutableStack<T>", True, "Clear", "()", "", "Argument[this].WithoutElement", "ReturnValue", "value", "manual"]
- ["System.Collections.Immutable", "ImmutableArray", False, "ToImmutableArray<T>", "(System.Span<T>)", "", "Argument[0].Element", "ReturnValue.Element", "value", "manual"]
- ["System.Collections.Immutable", "ImmutableArray", False, "ToImmutableArray<T>", "(System.ReadOnlySpan<T>)", "", "Argument[0].Element", "ReturnValue.Element", "value", "manual"]
- ["System.Collections.Immutable", "ImmutableArray<T>+Builder", False, "AddRange", "(System.Collections.Generic.IEnumerable<T>)", "", "Argument[0].Element", "Argument[this].Element", "value", "manual"] - ["System.Collections.Immutable", "ImmutableArray<T>+Builder", False, "AddRange", "(System.Collections.Generic.IEnumerable<T>)", "", "Argument[0].Element", "Argument[this].Element", "value", "manual"]
- ["System.Collections.Immutable", "ImmutableArray<T>+Builder", False, "AddRange", "(System.Collections.Immutable.ImmutableArray<T>)", "", "Argument[0].Element", "Argument[this].Element", "value", "manual"] - ["System.Collections.Immutable", "ImmutableArray<T>+Builder", False, "AddRange", "(System.Collections.Immutable.ImmutableArray<T>)", "", "Argument[0].Element", "Argument[this].Element", "value", "manual"]
- ["System.Collections.Immutable", "ImmutableArray<T>+Builder", False, "AddRange", "(System.Collections.Immutable.ImmutableArray<T>+Builder)", "", "Argument[0].Element", "Argument[this].Element", "value", "manual"] - ["System.Collections.Immutable", "ImmutableArray<T>+Builder", False, "AddRange", "(System.Collections.Immutable.ImmutableArray<T>+Builder)", "", "Argument[0].Element", "Argument[this].Element", "value", "manual"]

View File

@@ -29,15 +29,15 @@ extensions:
- ["System.Linq", "Enumerable", False, "Concat<TSource>", "(System.Collections.Generic.IEnumerable<TSource>,System.Collections.Generic.IEnumerable<TSource>)", "", "Argument[0].Element", "ReturnValue.Element", "value", "manual"] - ["System.Linq", "Enumerable", False, "Concat<TSource>", "(System.Collections.Generic.IEnumerable<TSource>,System.Collections.Generic.IEnumerable<TSource>)", "", "Argument[0].Element", "ReturnValue.Element", "value", "manual"]
- ["System.Linq", "Enumerable", False, "Concat<TSource>", "(System.Collections.Generic.IEnumerable<TSource>,System.Collections.Generic.IEnumerable<TSource>)", "", "Argument[1].Element", "ReturnValue.Element", "value", "manual"] - ["System.Linq", "Enumerable", False, "Concat<TSource>", "(System.Collections.Generic.IEnumerable<TSource>,System.Collections.Generic.IEnumerable<TSource>)", "", "Argument[1].Element", "ReturnValue.Element", "value", "manual"]
- ["System.Linq", "Enumerable", False, "Count<TSource>", "(System.Collections.Generic.IEnumerable<TSource>,System.Func<TSource,System.Boolean>)", "", "Argument[0].Element", "Argument[1].Parameter[0]", "value", "manual"] - ["System.Linq", "Enumerable", False, "Count<TSource>", "(System.Collections.Generic.IEnumerable<TSource>,System.Func<TSource,System.Boolean>)", "", "Argument[0].Element", "Argument[1].Parameter[0]", "value", "manual"]
- ["System.Linq", "Enumerable", False, "DefaultIfEmpty<TSource>", "(System.Collections.Generic.IEnumerable<TSource>)", "", "Argument[0].Element", "ReturnValue", "value", "manual"] - ["System.Linq", "Enumerable", False, "DefaultIfEmpty<TSource>", "(System.Collections.Generic.IEnumerable<TSource>)", "", "Argument[0].Element", "ReturnValue.Element", "value", "manual"]
- ["System.Linq", "Enumerable", False, "DefaultIfEmpty<TSource>", "(System.Collections.Generic.IEnumerable<TSource>,TSource)", "", "Argument[0].Element", "ReturnValue", "value", "manual"] - ["System.Linq", "Enumerable", False, "DefaultIfEmpty<TSource>", "(System.Collections.Generic.IEnumerable<TSource>,TSource)", "", "Argument[0].Element", "ReturnValue.Element", "value", "manual"]
- ["System.Linq", "Enumerable", False, "DefaultIfEmpty<TSource>", "(System.Collections.Generic.IEnumerable<TSource>,TSource)", "", "Argument[1]", "ReturnValue", "value", "manual"] - ["System.Linq", "Enumerable", False, "DefaultIfEmpty<TSource>", "(System.Collections.Generic.IEnumerable<TSource>,TSource)", "", "Argument[1]", "ReturnValue.Element", "value", "manual"]
- ["System.Linq", "Enumerable", False, "Distinct<TSource>", "(System.Collections.Generic.IEnumerable<TSource>)", "", "Argument[0].Element", "ReturnValue.Element", "value", "manual"] - ["System.Linq", "Enumerable", False, "Distinct<TSource>", "(System.Collections.Generic.IEnumerable<TSource>)", "", "Argument[0].Element", "ReturnValue.Element", "value", "manual"]
- ["System.Linq", "Enumerable", False, "Distinct<TSource>", "(System.Collections.Generic.IEnumerable<TSource>,System.Collections.Generic.IEqualityComparer<TSource>)", "", "Argument[0].Element", "ReturnValue.Element", "value", "manual"] - ["System.Linq", "Enumerable", False, "Distinct<TSource>", "(System.Collections.Generic.IEnumerable<TSource>,System.Collections.Generic.IEqualityComparer<TSource>)", "", "Argument[0].Element", "ReturnValue.Element", "value", "manual"]
- ["System.Linq", "Enumerable", False, "ElementAt<TSource>", "(System.Collections.Generic.IEnumerable<TSource>,System.Int32)", "", "Argument[0].Element", "ReturnValue", "value", "manual"] - ["System.Linq", "Enumerable", False, "ElementAt<TSource>", "(System.Collections.Generic.IEnumerable<TSource>,System.Int32)", "", "Argument[0].Element", "ReturnValue", "value", "manual"]
- ["System.Linq", "Enumerable", False, "ElementAtOrDefault<TSource>", "(System.Collections.Generic.IEnumerable<TSource>,System.Int32)", "", "Argument[0].Element", "ReturnValue", "value", "manual"] - ["System.Linq", "Enumerable", False, "ElementAtOrDefault<TSource>", "(System.Collections.Generic.IEnumerable<TSource>,System.Int32)", "", "Argument[0].Element", "ReturnValue", "value", "manual"]
- ["System.Linq", "Enumerable", False, "Except<TSource>", "(System.Collections.Generic.IEnumerable<TSource>,System.Collections.Generic.IEnumerable<TSource>)", "", "Argument[0].Element", "ReturnValue", "value", "manual"] - ["System.Linq", "Enumerable", False, "Except<TSource>", "(System.Collections.Generic.IEnumerable<TSource>,System.Collections.Generic.IEnumerable<TSource>)", "", "Argument[0].Element", "ReturnValue.Element", "value", "manual"]
- ["System.Linq", "Enumerable", False, "Except<TSource>", "(System.Collections.Generic.IEnumerable<TSource>,System.Collections.Generic.IEnumerable<TSource>,System.Collections.Generic.IEqualityComparer<TSource>)", "", "Argument[0].Element", "ReturnValue", "value", "manual"] - ["System.Linq", "Enumerable", False, "Except<TSource>", "(System.Collections.Generic.IEnumerable<TSource>,System.Collections.Generic.IEnumerable<TSource>,System.Collections.Generic.IEqualityComparer<TSource>)", "", "Argument[0].Element", "ReturnValue.Element", "value", "manual"]
- ["System.Linq", "Enumerable", False, "First<TSource>", "(System.Collections.Generic.IEnumerable<TSource>)", "", "Argument[0].Element", "ReturnValue", "value", "manual"] - ["System.Linq", "Enumerable", False, "First<TSource>", "(System.Collections.Generic.IEnumerable<TSource>)", "", "Argument[0].Element", "ReturnValue", "value", "manual"]
- ["System.Linq", "Enumerable", False, "First<TSource>", "(System.Collections.Generic.IEnumerable<TSource>,System.Func<TSource,System.Boolean>)", "", "Argument[0].Element", "Argument[1].Parameter[0]", "value", "manual"] - ["System.Linq", "Enumerable", False, "First<TSource>", "(System.Collections.Generic.IEnumerable<TSource>,System.Func<TSource,System.Boolean>)", "", "Argument[0].Element", "Argument[1].Parameter[0]", "value", "manual"]
- ["System.Linq", "Enumerable", False, "First<TSource>", "(System.Collections.Generic.IEnumerable<TSource>,System.Func<TSource,System.Boolean>)", "", "Argument[0].Element", "ReturnValue", "value", "manual"] - ["System.Linq", "Enumerable", False, "First<TSource>", "(System.Collections.Generic.IEnumerable<TSource>,System.Func<TSource,System.Boolean>)", "", "Argument[0].Element", "ReturnValue", "value", "manual"]
@@ -250,17 +250,17 @@ extensions:
- ["System.Linq", "ParallelEnumerable", False, "Concat<TSource>", "(System.Linq.ParallelQuery<TSource>,System.Linq.ParallelQuery<TSource>)", "", "Argument[0].Element", "ReturnValue.Element", "value", "manual"] - ["System.Linq", "ParallelEnumerable", False, "Concat<TSource>", "(System.Linq.ParallelQuery<TSource>,System.Linq.ParallelQuery<TSource>)", "", "Argument[0].Element", "ReturnValue.Element", "value", "manual"]
- ["System.Linq", "ParallelEnumerable", False, "Concat<TSource>", "(System.Linq.ParallelQuery<TSource>,System.Linq.ParallelQuery<TSource>)", "", "Argument[1].Element", "ReturnValue.Element", "value", "manual"] - ["System.Linq", "ParallelEnumerable", False, "Concat<TSource>", "(System.Linq.ParallelQuery<TSource>,System.Linq.ParallelQuery<TSource>)", "", "Argument[1].Element", "ReturnValue.Element", "value", "manual"]
- ["System.Linq", "ParallelEnumerable", False, "Count<TSource>", "(System.Linq.ParallelQuery<TSource>,System.Func<TSource,System.Boolean>)", "", "Argument[0].Element", "Argument[1].Parameter[0]", "value", "manual"] - ["System.Linq", "ParallelEnumerable", False, "Count<TSource>", "(System.Linq.ParallelQuery<TSource>,System.Func<TSource,System.Boolean>)", "", "Argument[0].Element", "Argument[1].Parameter[0]", "value", "manual"]
- ["System.Linq", "ParallelEnumerable", False, "DefaultIfEmpty<TSource>", "(System.Linq.ParallelQuery<TSource>)", "", "Argument[0].Element", "ReturnValue", "value", "manual"] - ["System.Linq", "ParallelEnumerable", False, "DefaultIfEmpty<TSource>", "(System.Linq.ParallelQuery<TSource>)", "", "Argument[0].Element", "ReturnValue.Element", "value", "manual"]
- ["System.Linq", "ParallelEnumerable", False, "DefaultIfEmpty<TSource>", "(System.Linq.ParallelQuery<TSource>,TSource)", "", "Argument[0].Element", "ReturnValue", "value", "manual"] - ["System.Linq", "ParallelEnumerable", False, "DefaultIfEmpty<TSource>", "(System.Linq.ParallelQuery<TSource>,TSource)", "", "Argument[0].Element", "ReturnValue.Element", "value", "manual"]
- ["System.Linq", "ParallelEnumerable", False, "DefaultIfEmpty<TSource>", "(System.Linq.ParallelQuery<TSource>,TSource)", "", "Argument[1]", "ReturnValue", "value", "manual"] - ["System.Linq", "ParallelEnumerable", False, "DefaultIfEmpty<TSource>", "(System.Linq.ParallelQuery<TSource>,TSource)", "", "Argument[1]", "ReturnValue.Element", "value", "manual"]
- ["System.Linq", "ParallelEnumerable", False, "Distinct<TSource>", "(System.Linq.ParallelQuery<TSource>)", "", "Argument[0].Element", "ReturnValue.Element", "value", "manual"] - ["System.Linq", "ParallelEnumerable", False, "Distinct<TSource>", "(System.Linq.ParallelQuery<TSource>)", "", "Argument[0].Element", "ReturnValue.Element", "value", "manual"]
- ["System.Linq", "ParallelEnumerable", False, "Distinct<TSource>", "(System.Linq.ParallelQuery<TSource>,System.Collections.Generic.IEqualityComparer<TSource>)", "", "Argument[0].Element", "ReturnValue.Element", "value", "manual"] - ["System.Linq", "ParallelEnumerable", False, "Distinct<TSource>", "(System.Linq.ParallelQuery<TSource>,System.Collections.Generic.IEqualityComparer<TSource>)", "", "Argument[0].Element", "ReturnValue.Element", "value", "manual"]
- ["System.Linq", "ParallelEnumerable", False, "ElementAt<TSource>", "(System.Linq.ParallelQuery<TSource>,System.Int32)", "", "Argument[0].Element", "ReturnValue", "value", "manual"] - ["System.Linq", "ParallelEnumerable", False, "ElementAt<TSource>", "(System.Linq.ParallelQuery<TSource>,System.Int32)", "", "Argument[0].Element", "ReturnValue", "value", "manual"]
- ["System.Linq", "ParallelEnumerable", False, "ElementAtOrDefault<TSource>", "(System.Linq.ParallelQuery<TSource>,System.Int32)", "", "Argument[0].Element", "ReturnValue", "value", "manual"] - ["System.Linq", "ParallelEnumerable", False, "ElementAtOrDefault<TSource>", "(System.Linq.ParallelQuery<TSource>,System.Int32)", "", "Argument[0].Element", "ReturnValue", "value", "manual"]
- ["System.Linq", "ParallelEnumerable", False, "Except<TSource>", "(System.Linq.ParallelQuery<TSource>,System.Collections.Generic.IEnumerable<TSource>)", "", "Argument[0].Element", "ReturnValue", "value", "manual"] - ["System.Linq", "ParallelEnumerable", False, "Except<TSource>", "(System.Linq.ParallelQuery<TSource>,System.Collections.Generic.IEnumerable<TSource>)", "", "Argument[0].Element", "ReturnValue.Element", "value", "manual"]
- ["System.Linq", "ParallelEnumerable", False, "Except<TSource>", "(System.Linq.ParallelQuery<TSource>,System.Collections.Generic.IEnumerable<TSource>,System.Collections.Generic.IEqualityComparer<TSource>)", "", "Argument[0].Element", "ReturnValue", "value", "manual"] - ["System.Linq", "ParallelEnumerable", False, "Except<TSource>", "(System.Linq.ParallelQuery<TSource>,System.Collections.Generic.IEnumerable<TSource>,System.Collections.Generic.IEqualityComparer<TSource>)", "", "Argument[0].Element", "ReturnValue.Element", "value", "manual"]
- ["System.Linq", "ParallelEnumerable", False, "Except<TSource>", "(System.Linq.ParallelQuery<TSource>,System.Linq.ParallelQuery<TSource>)", "", "Argument[0].Element", "ReturnValue", "value", "manual"] - ["System.Linq", "ParallelEnumerable", False, "Except<TSource>", "(System.Linq.ParallelQuery<TSource>,System.Linq.ParallelQuery<TSource>)", "", "Argument[0].Element", "ReturnValue.Element", "value", "manual"]
- ["System.Linq", "ParallelEnumerable", False, "Except<TSource>", "(System.Linq.ParallelQuery<TSource>,System.Linq.ParallelQuery<TSource>,System.Collections.Generic.IEqualityComparer<TSource>)", "", "Argument[0].Element", "ReturnValue", "value", "manual"] - ["System.Linq", "ParallelEnumerable", False, "Except<TSource>", "(System.Linq.ParallelQuery<TSource>,System.Linq.ParallelQuery<TSource>,System.Collections.Generic.IEqualityComparer<TSource>)", "", "Argument[0].Element", "ReturnValue.Element", "value", "manual"]
- ["System.Linq", "ParallelEnumerable", False, "First<TSource>", "(System.Linq.ParallelQuery<TSource>)", "", "Argument[0].Element", "ReturnValue", "value", "manual"] - ["System.Linq", "ParallelEnumerable", False, "First<TSource>", "(System.Linq.ParallelQuery<TSource>)", "", "Argument[0].Element", "ReturnValue", "value", "manual"]
- ["System.Linq", "ParallelEnumerable", False, "First<TSource>", "(System.Linq.ParallelQuery<TSource>,System.Func<TSource,System.Boolean>)", "", "Argument[0].Element", "Argument[1].Parameter[0]", "value", "manual"] - ["System.Linq", "ParallelEnumerable", False, "First<TSource>", "(System.Linq.ParallelQuery<TSource>,System.Func<TSource,System.Boolean>)", "", "Argument[0].Element", "Argument[1].Parameter[0]", "value", "manual"]
- ["System.Linq", "ParallelEnumerable", False, "First<TSource>", "(System.Linq.ParallelQuery<TSource>,System.Func<TSource,System.Boolean>)", "", "Argument[0].Element", "ReturnValue", "value", "manual"] - ["System.Linq", "ParallelEnumerable", False, "First<TSource>", "(System.Linq.ParallelQuery<TSource>,System.Func<TSource,System.Boolean>)", "", "Argument[0].Element", "ReturnValue", "value", "manual"]
@@ -496,15 +496,15 @@ extensions:
- ["System.Linq", "Queryable", False, "Concat<TSource>", "(System.Linq.IQueryable<TSource>,System.Collections.Generic.IEnumerable<TSource>)", "", "Argument[0].Element", "ReturnValue.Element", "value", "manual"] - ["System.Linq", "Queryable", False, "Concat<TSource>", "(System.Linq.IQueryable<TSource>,System.Collections.Generic.IEnumerable<TSource>)", "", "Argument[0].Element", "ReturnValue.Element", "value", "manual"]
- ["System.Linq", "Queryable", False, "Concat<TSource>", "(System.Linq.IQueryable<TSource>,System.Collections.Generic.IEnumerable<TSource>)", "", "Argument[1].Element", "ReturnValue.Element", "value", "manual"] - ["System.Linq", "Queryable", False, "Concat<TSource>", "(System.Linq.IQueryable<TSource>,System.Collections.Generic.IEnumerable<TSource>)", "", "Argument[1].Element", "ReturnValue.Element", "value", "manual"]
- ["System.Linq", "Queryable", False, "Count<TSource>", "(System.Linq.IQueryable<TSource>,System.Linq.Expressions.Expression<System.Func<TSource,System.Boolean>>)", "", "Argument[0].Element", "Argument[1].Parameter[0]", "value", "manual"] - ["System.Linq", "Queryable", False, "Count<TSource>", "(System.Linq.IQueryable<TSource>,System.Linq.Expressions.Expression<System.Func<TSource,System.Boolean>>)", "", "Argument[0].Element", "Argument[1].Parameter[0]", "value", "manual"]
- ["System.Linq", "Queryable", False, "DefaultIfEmpty<TSource>", "(System.Linq.IQueryable<TSource>)", "", "Argument[0].Element", "ReturnValue", "value", "manual"] - ["System.Linq", "Queryable", False, "DefaultIfEmpty<TSource>", "(System.Linq.IQueryable<TSource>)", "", "Argument[0].Element", "ReturnValue.Element", "value", "manual"]
- ["System.Linq", "Queryable", False, "DefaultIfEmpty<TSource>", "(System.Linq.IQueryable<TSource>,TSource)", "", "Argument[0].Element", "ReturnValue", "value", "manual"] - ["System.Linq", "Queryable", False, "DefaultIfEmpty<TSource>", "(System.Linq.IQueryable<TSource>,TSource)", "", "Argument[0].Element", "ReturnValue.Element", "value", "manual"]
- ["System.Linq", "Queryable", False, "DefaultIfEmpty<TSource>", "(System.Linq.IQueryable<TSource>,TSource)", "", "Argument[1]", "ReturnValue", "value", "manual"] - ["System.Linq", "Queryable", False, "DefaultIfEmpty<TSource>", "(System.Linq.IQueryable<TSource>,TSource)", "", "Argument[1]", "ReturnValue.Element", "value", "manual"]
- ["System.Linq", "Queryable", False, "Distinct<TSource>", "(System.Linq.IQueryable<TSource>)", "", "Argument[0].Element", "ReturnValue.Element", "value", "manual"] - ["System.Linq", "Queryable", False, "Distinct<TSource>", "(System.Linq.IQueryable<TSource>)", "", "Argument[0].Element", "ReturnValue.Element", "value", "manual"]
- ["System.Linq", "Queryable", False, "Distinct<TSource>", "(System.Linq.IQueryable<TSource>,System.Collections.Generic.IEqualityComparer<TSource>)", "", "Argument[0].Element", "ReturnValue.Element", "value", "manual"] - ["System.Linq", "Queryable", False, "Distinct<TSource>", "(System.Linq.IQueryable<TSource>,System.Collections.Generic.IEqualityComparer<TSource>)", "", "Argument[0].Element", "ReturnValue.Element", "value", "manual"]
- ["System.Linq", "Queryable", False, "ElementAt<TSource>", "(System.Linq.IQueryable<TSource>,System.Int32)", "", "Argument[0].Element", "ReturnValue", "value", "manual"] - ["System.Linq", "Queryable", False, "ElementAt<TSource>", "(System.Linq.IQueryable<TSource>,System.Int32)", "", "Argument[0].Element", "ReturnValue", "value", "manual"]
- ["System.Linq", "Queryable", False, "ElementAtOrDefault<TSource>", "(System.Linq.IQueryable<TSource>,System.Int32)", "", "Argument[0].Element", "ReturnValue", "value", "manual"] - ["System.Linq", "Queryable", False, "ElementAtOrDefault<TSource>", "(System.Linq.IQueryable<TSource>,System.Int32)", "", "Argument[0].Element", "ReturnValue", "value", "manual"]
- ["System.Linq", "Queryable", False, "Except<TSource>", "(System.Linq.IQueryable<TSource>,System.Collections.Generic.IEnumerable<TSource>)", "", "Argument[0].Element", "ReturnValue", "value", "manual"] - ["System.Linq", "Queryable", False, "Except<TSource>", "(System.Linq.IQueryable<TSource>,System.Collections.Generic.IEnumerable<TSource>)", "", "Argument[0].Element", "ReturnValue.Element", "value", "manual"]
- ["System.Linq", "Queryable", False, "Except<TSource>", "(System.Linq.IQueryable<TSource>,System.Collections.Generic.IEnumerable<TSource>,System.Collections.Generic.IEqualityComparer<TSource>)", "", "Argument[0].Element", "ReturnValue", "value", "manual"] - ["System.Linq", "Queryable", False, "Except<TSource>", "(System.Linq.IQueryable<TSource>,System.Collections.Generic.IEnumerable<TSource>,System.Collections.Generic.IEqualityComparer<TSource>)", "", "Argument[0].Element", "ReturnValue.Element", "value", "manual"]
- ["System.Linq", "Queryable", False, "First<TSource>", "(System.Linq.IQueryable<TSource>)", "", "Argument[0].Element", "ReturnValue", "value", "manual"] - ["System.Linq", "Queryable", False, "First<TSource>", "(System.Linq.IQueryable<TSource>)", "", "Argument[0].Element", "ReturnValue", "value", "manual"]
- ["System.Linq", "Queryable", False, "First<TSource>", "(System.Linq.IQueryable<TSource>,System.Linq.Expressions.Expression<System.Func<TSource,System.Boolean>>)", "", "Argument[0].Element", "Argument[1].Parameter[0]", "value", "manual"] - ["System.Linq", "Queryable", False, "First<TSource>", "(System.Linq.IQueryable<TSource>,System.Linq.Expressions.Expression<System.Func<TSource,System.Boolean>>)", "", "Argument[0].Element", "Argument[1].Parameter[0]", "value", "manual"]
- ["System.Linq", "Queryable", False, "First<TSource>", "(System.Linq.IQueryable<TSource>,System.Linq.Expressions.Expression<System.Func<TSource,System.Boolean>>)", "", "Argument[0].Element", "ReturnValue", "value", "manual"] - ["System.Linq", "Queryable", False, "First<TSource>", "(System.Linq.IQueryable<TSource>,System.Linq.Expressions.Expression<System.Func<TSource,System.Boolean>>)", "", "Argument[0].Element", "ReturnValue", "value", "manual"]

View File

@@ -374,12 +374,37 @@ extensions:
- ["System", "Lazy<T>", False, "Lazy", "(System.Func<T>,System.Boolean)", "", "Argument[0].ReturnValue", "Argument[this].Property[System.Lazy`1.Value]", "value", "manual"] - ["System", "Lazy<T>", False, "Lazy", "(System.Func<T>,System.Boolean)", "", "Argument[0].ReturnValue", "Argument[this].Property[System.Lazy`1.Value]", "value", "manual"]
- ["System", "Lazy<T>", False, "Lazy", "(System.Func<T>,System.Threading.LazyThreadSafetyMode)", "", "Argument[0].ReturnValue", "Argument[this].Property[System.Lazy`1.Value]", "value", "manual"] - ["System", "Lazy<T>", False, "Lazy", "(System.Func<T>,System.Threading.LazyThreadSafetyMode)", "", "Argument[0].ReturnValue", "Argument[this].Property[System.Lazy`1.Value]", "value", "manual"]
- ["System", "Lazy<T>", False, "get_Value", "()", "", "Argument[this]", "ReturnValue", "taint", "manual"] - ["System", "Lazy<T>", False, "get_Value", "()", "", "Argument[this]", "ReturnValue", "taint", "manual"]
- ["System", "MemoryExtensions", False, "Replace<T>", "(System.Span<T>,T,T)", "", "Argument[2]", "Argument[0].Element", "value", "manual"]
- ["System", "MemoryExtensions", False, "Replace<T>", "(System.ReadOnlySpan<T>,System.Span<T>,T,T)", "", "Argument[0].Element", "Argument[1].Element", "value", "manual"]
- ["System", "MemoryExtensions", False, "Replace<T>", "(System.ReadOnlySpan<T>,System.Span<T>,T,T)", "", "Argument[3]", "Argument[1].Element", "value", "manual"]
- ["System", "Nullable<T>", False, "GetValueOrDefault", "()", "", "Argument[this].Property[System.Nullable`1.Value]", "ReturnValue", "value", "manual"] - ["System", "Nullable<T>", False, "GetValueOrDefault", "()", "", "Argument[this].Property[System.Nullable`1.Value]", "ReturnValue", "value", "manual"]
- ["System", "Nullable<T>", False, "GetValueOrDefault", "(T)", "", "Argument[0]", "ReturnValue", "value", "manual"] - ["System", "Nullable<T>", False, "GetValueOrDefault", "(T)", "", "Argument[0]", "ReturnValue", "value", "manual"]
- ["System", "Nullable<T>", False, "GetValueOrDefault", "(T)", "", "Argument[this].Property[System.Nullable`1.Value]", "ReturnValue", "value", "manual"] - ["System", "Nullable<T>", False, "GetValueOrDefault", "(T)", "", "Argument[this].Property[System.Nullable`1.Value]", "ReturnValue", "value", "manual"]
- ["System", "Nullable<T>", False, "Nullable", "(T)", "", "Argument[0]", "Argument[this].Property[System.Nullable`1.Value]", "value", "manual"] - ["System", "Nullable<T>", False, "Nullable", "(T)", "", "Argument[0]", "Argument[this].Property[System.Nullable`1.Value]", "value", "manual"]
- ["System", "Nullable<T>", False, "get_HasValue", "()", "", "Argument[this].Property[System.Nullable`1.Value]", "ReturnValue", "taint", "manual"] - ["System", "Nullable<T>", False, "get_HasValue", "()", "", "Argument[this].Property[System.Nullable`1.Value]", "ReturnValue", "taint", "manual"]
- ["System", "Nullable<T>", False, "get_Value", "()", "", "Argument[this]", "ReturnValue", "taint", "manual"] - ["System", "Nullable<T>", False, "get_Value", "()", "", "Argument[this]", "ReturnValue", "taint", "manual"]
- ["System", "ReadOnlySpan<T>", False, "CopyTo", "(System.Span<T>)", "", "Argument[this].Element", "Argument[0].Element", "value", "manual"]
- ["System", "ReadOnlySpan<T>", False, "get_Item", "(System.Int32)", "", "Argument[this].Element", "ReturnValue", "value", "manual"]
- ["System", "ReadOnlySpan<T>", False, "GetPinnableReference", "()", "", "Argument[this].Element", "ReturnValue", "value", "manual"]
- ["System", "ReadOnlySpan<T>", False, "Slice", "(System.Int32)", "", "Argument[this].Element", "ReturnValue.Element", "value", "manual"]
- ["System", "ReadOnlySpan<T>", False, "Slice", "(System.Int32,System.Int32)", "", "Argument[this].Element", "ReturnValue.Element", "value", "manual"]
- ["System", "ReadOnlySpan<T>", False, "ReadOnlySpan", "(T)", "", "Argument[0]", "Argument[this].Element", "value", "manual"]
- ["System", "ReadOnlySpan<T>", False, "ReadOnlySpan", "(T[])", "", "Argument[0].Element", "Argument[this].Element", "value", "manual"]
- ["System", "ReadOnlySpan<T>", False, "ReadOnlySpan", "(T[],System.Int32,System.Int32)", "", "Argument[0].Element", "Argument[this].Element", "value", "manual"]
- ["System", "ReadOnlySpan<T>", False, "ToArray", "()", "", "Argument[this].Element", "ReturnValue.Element", "value", "manual"]
- ["System", "ReadOnlySpan<T>", False, "TryCopyTo", "(System.Span<T>)", "", "Argument[this].Element", "Argument[0].Element", "value", "manual"]
- ["System", "Span<T>", False, "Clear", "()", "", "Argument[this].WithoutElement", "Argument[this]", "value", "manual"]
- ["System", "Span<T>", False, "CopyTo", "(System.Span<T>)", "", "Argument[this].Element", "Argument[0].Element", "value", "manual"]
- ["System", "Span<T>", False, "Fill", "(T)", "", "Argument[0]", "Argument[this].Element", "value", "manual"]
- ["System", "Span<T>", False, "get_Item", "(System.Int32)", "", "Argument[this].Element", "ReturnValue", "value", "manual"]
- ["System", "Span<T>", False, "GetPinnableReference", "()", "", "Argument[this].Element", "ReturnValue", "value", "manual"]
- ["System", "Span<T>", False, "Slice", "(System.Int32)", "", "Argument[this].Element", "ReturnValue.Element", "value", "manual"]
- ["System", "Span<T>", False, "Slice", "(System.Int32,System.Int32)", "", "Argument[this].Element", "ReturnValue.Element", "value", "manual"]
- ["System", "Span<T>", False, "Span", "(T)", "", "Argument[0]", "Argument[this].Element", "value", "manual"]
- ["System", "Span<T>", False, "Span", "(T[])", "", "Argument[0].Element", "Argument[this].Element", "value", "manual"]
- ["System", "Span<T>", False, "Span", "(T[],System.Int32,System.Int32)", "", "Argument[0].Element", "Argument[this].Element", "value", "manual"]
- ["System", "Span<T>", False, "ToArray", "()", "", "Argument[this].Element", "ReturnValue.Element", "value", "manual"]
- ["System", "Span<T>", False, "TryCopyTo", "(System.Span<T>)", "", "Argument[this].Element", "Argument[0].Element", "value", "manual"]
- ["System", "String", False, "Clone", "()", "", "Argument[this]", "ReturnValue", "value", "manual"] - ["System", "String", False, "Clone", "()", "", "Argument[this]", "ReturnValue", "value", "manual"]
- ["System", "String", False, "Concat", "(System.Collections.Generic.IEnumerable<System.String>)", "", "Argument[0].Element", "ReturnValue", "taint", "manual"] - ["System", "String", False, "Concat", "(System.Collections.Generic.IEnumerable<System.String>)", "", "Argument[0].Element", "ReturnValue", "taint", "manual"]
- ["System", "String", False, "Concat", "(System.Object)", "", "Argument[0]", "ReturnValue", "taint", "manual"] - ["System", "String", False, "Concat", "(System.Object)", "", "Argument[0]", "ReturnValue", "taint", "manual"]

View File

@@ -83,4 +83,9 @@ class Compilation extends @compilation {
/** Gets the elapsed seconds for the entire extractor process. */ /** Gets the elapsed seconds for the entire extractor process. */
float getElapsedSeconds() { compilation_finished(this, _, result) } float getElapsedSeconds() { compilation_finished(this, _, result) }
/**
* Gets the piece of compilation information with the given key, if any.
*/
string getInfo(string key) { compilation_info(this, key, result) }
} }

View File

@@ -24,6 +24,12 @@ compilations(
string cwd : string ref string cwd : string ref
); );
compilation_info(
int id : @compilation ref,
string info_key: string ref,
string info_value: string ref
)
/** /**
* The arguments that were passed to the extractor for a compiler * The arguments that were passed to the extractor for a compiler
* invocation. If `id` is for the compiler invocation * invocation. If `id` is for the compiler invocation

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,2 @@
description: Add `compilation_info`.
compatibility: backwards

View File

@@ -9,6 +9,17 @@
import csharp import csharp
import semmle.code.csharp.commons.Diagnostics import semmle.code.csharp.commons.Diagnostics
predicate compilationInfo(string key, float value) {
exists(Compilation c, string infoKey, string infoValue | infoValue = c.getInfo(infoKey) |
key = infoKey and
value = infoValue.toFloat()
or
not exists(infoValue.toFloat()) and
key = infoKey + ": " + infoValue and
value = 1
)
}
predicate fileCount(string key, int value) { predicate fileCount(string key, int value) {
key = "Number of files" and key = "Number of files" and
value = strictcount(File f) value = strictcount(File f)
@@ -177,6 +188,7 @@ predicate analyzerAssemblies(string key, float value) {
from string key, float value from string key, float value
where where
( (
compilationInfo(key, value) or
fileCount(key, value) or fileCount(key, value) or
fileCountByExtension(key, value) or fileCountByExtension(key, value) or
totalNumberOfLines(key, value) or totalNumberOfLines(key, value) or

View File

@@ -2125,13 +2125,6 @@ class ChiInstruction extends Instruction {
*/ */
final Instruction getPartial() { result = this.getPartialOperand().getDef() } final Instruction getPartial() { result = this.getPartialOperand().getDef() }
/**
* Gets the bit range `[startBit, endBit)` updated by the partial operand of this `ChiInstruction`, relative to the start address of the total operand.
*/
final predicate getUpdatedInterval(int startBit, int endBit) {
Construction::getIntervalUpdatedByChi(this, startBit, endBit)
}
/** /**
* Holds if the `ChiPartialOperand` totally, but not exactly, overlaps with the `ChiTotalOperand`. * Holds if the `ChiPartialOperand` totally, but not exactly, overlaps with the `ChiTotalOperand`.
* This means that the `ChiPartialOperand` will not override the entire memory associated with the * This means that the `ChiPartialOperand` will not override the entire memory associated with the

View File

@@ -216,13 +216,6 @@ private module Cached {
result = getMemoryOperandDefinition(instr, _, _) result = getMemoryOperandDefinition(instr, _, _)
} }
/**
* Holds if the partial operand of this `ChiInstruction` updates the bit range
* `[startBitOffset, endBitOffset)` of the total operand.
*/
cached
predicate getIntervalUpdatedByChi(ChiInstruction chi, int startBit, int endBit) { none() }
/** /**
* Holds if the operand totally overlaps with its definition and consumes the * Holds if the operand totally overlaps with its definition and consumes the
* bit range `[startBitOffset, endBitOffset)`. * bit range `[startBitOffset, endBitOffset)`.

View File

@@ -2125,13 +2125,6 @@ class ChiInstruction extends Instruction {
*/ */
final Instruction getPartial() { result = this.getPartialOperand().getDef() } final Instruction getPartial() { result = this.getPartialOperand().getDef() }
/**
* Gets the bit range `[startBit, endBit)` updated by the partial operand of this `ChiInstruction`, relative to the start address of the total operand.
*/
final predicate getUpdatedInterval(int startBit, int endBit) {
Construction::getIntervalUpdatedByChi(this, startBit, endBit)
}
/** /**
* Holds if the `ChiPartialOperand` totally, but not exactly, overlaps with the `ChiTotalOperand`. * Holds if the `ChiPartialOperand` totally, but not exactly, overlaps with the `ChiTotalOperand`.
* This means that the `ChiPartialOperand` will not override the entire memory associated with the * This means that the `ChiPartialOperand` will not override the entire memory associated with the

View File

@@ -233,20 +233,6 @@ private module Cached {
) )
} }
/**
* Holds if the partial operand of this `ChiInstruction` updates the bit range
* `[startBitOffset, endBitOffset)` of the total operand.
*/
cached
predicate getIntervalUpdatedByChi(ChiInstruction chi, int startBitOffset, int endBitOffset) {
exists(Alias::MemoryLocation location, OldInstruction oldInstruction |
oldInstruction = getOldInstruction(chi.getPartial()) and
location = Alias::getResultMemoryLocation(oldInstruction) and
startBitOffset = Alias::getStartBitOffset(location) and
endBitOffset = Alias::getEndBitOffset(location)
)
}
/** /**
* Holds if `operand` totally overlaps with its definition and consumes the bit range * Holds if `operand` totally overlaps with its definition and consumes the bit range
* `[startBitOffset, endBitOffset)`. * `[startBitOffset, endBitOffset)`.

View File

@@ -481,4 +481,40 @@ public class CollectionFlow
IntegerCollection ic1 = [.. ic0]; IntegerCollection ic1 = [.. ic0];
Sink(ic1.Payload); // No flow Sink(ic1.Payload); // No flow
} }
public void SpanConstructorFlow()
{
var a = new A();
Span<A> span = new Span<A>(ref a);
Sink(span[0]); // flow
}
public void SpanToArrayFlow()
{
var a = new A();
Span<A> span = new Span<A>(ref a);
var arr = span.ToArray();
Sink(arr[0]); // flow
}
public void SpanFillFlow(Span<A> target)
{
var a = new A();
target.Fill(a);
Sink(target[0]); // flow
}
public void SpanCopyToFlow(Span<A> target)
{
var source = new Span<A>(new[] { new A() });
source.CopyTo(target);
Sink(target[0]); // flow
}
public void ReadOnlySpanConstructorFlow()
{
var a = new A();
ReadOnlySpan<A> span = new ReadOnlySpan<A>(new[] { a });
Sink(span[0]); // flow
}
} }

View File

@@ -246,6 +246,33 @@ edges
| CollectionFlow.cs:448:21:448:21 | access to local variable a : A | CollectionFlow.cs:448:20:448:22 | [...] : A[] [element] : A | | CollectionFlow.cs:448:21:448:21 | access to local variable a : A | CollectionFlow.cs:448:20:448:22 | [...] : A[] [element] : A |
| CollectionFlow.cs:449:22:449:28 | .. access to local variable temp : A[] [element] : A | CollectionFlow.cs:450:14:450:18 | access to local variable array : A[] [element] : A | | CollectionFlow.cs:449:22:449:28 | .. access to local variable temp : A[] [element] : A | CollectionFlow.cs:450:14:450:18 | access to local variable array : A[] [element] : A |
| CollectionFlow.cs:450:14:450:18 | access to local variable array : A[] [element] : A | CollectionFlow.cs:450:14:450:21 | access to array element | | CollectionFlow.cs:450:14:450:18 | access to local variable array : A[] [element] : A | CollectionFlow.cs:450:14:450:21 | access to array element |
| CollectionFlow.cs:487:17:487:23 | object creation of type A : A | CollectionFlow.cs:488:40:488:40 | access to local variable a : A |
| CollectionFlow.cs:488:24:488:41 | object creation of type Span<A> : Span<T> [element] : A | CollectionFlow.cs:489:14:489:17 | access to local variable span : Span<T> [element] : A |
| CollectionFlow.cs:488:40:488:40 | access to local variable a : A | CollectionFlow.cs:488:24:488:41 | object creation of type Span<A> : Span<T> [element] : A |
| CollectionFlow.cs:489:14:489:17 | access to local variable span : Span<T> [element] : A | CollectionFlow.cs:489:14:489:20 | access to indexer |
| CollectionFlow.cs:494:17:494:23 | object creation of type A : A | CollectionFlow.cs:495:40:495:40 | access to local variable a : A |
| CollectionFlow.cs:495:24:495:41 | object creation of type Span<A> : Span<T> [element] : A | CollectionFlow.cs:496:19:496:22 | access to local variable span : Span<T> [element] : A |
| CollectionFlow.cs:495:40:495:40 | access to local variable a : A | CollectionFlow.cs:495:24:495:41 | object creation of type Span<A> : Span<T> [element] : A |
| CollectionFlow.cs:496:19:496:22 | access to local variable span : Span<T> [element] : A | CollectionFlow.cs:496:19:496:32 | call to method ToArray : T[] [element] : A |
| CollectionFlow.cs:496:19:496:32 | call to method ToArray : T[] [element] : A | CollectionFlow.cs:497:14:497:16 | access to local variable arr : T[] [element] : A |
| CollectionFlow.cs:497:14:497:16 | access to local variable arr : T[] [element] : A | CollectionFlow.cs:497:14:497:19 | access to array element |
| CollectionFlow.cs:502:17:502:23 | object creation of type A : A | CollectionFlow.cs:503:21:503:21 | access to local variable a : A |
| CollectionFlow.cs:503:9:503:14 | [post] access to parameter target : Span<T> [element] : A | CollectionFlow.cs:504:14:504:19 | access to parameter target : Span<T> [element] : A |
| CollectionFlow.cs:503:21:503:21 | access to local variable a : A | CollectionFlow.cs:503:9:503:14 | [post] access to parameter target : Span<T> [element] : A |
| CollectionFlow.cs:504:14:504:19 | access to parameter target : Span<T> [element] : A | CollectionFlow.cs:504:14:504:22 | access to indexer |
| CollectionFlow.cs:509:22:509:51 | object creation of type Span<A> : Span<T> [element] : A | CollectionFlow.cs:510:9:510:14 | access to local variable source : Span<T> [element] : A |
| CollectionFlow.cs:509:34:509:50 | array creation of type A[] : null [element] : A | CollectionFlow.cs:509:22:509:51 | object creation of type Span<A> : Span<T> [element] : A |
| CollectionFlow.cs:509:40:509:50 | { ..., ... } : null [element] : A | CollectionFlow.cs:509:34:509:50 | array creation of type A[] : null [element] : A |
| CollectionFlow.cs:509:42:509:48 | object creation of type A : A | CollectionFlow.cs:509:40:509:50 | { ..., ... } : null [element] : A |
| CollectionFlow.cs:510:9:510:14 | access to local variable source : Span<T> [element] : A | CollectionFlow.cs:510:23:510:28 | [post] access to parameter target : Span<T> [element] : A |
| CollectionFlow.cs:510:23:510:28 | [post] access to parameter target : Span<T> [element] : A | CollectionFlow.cs:511:14:511:19 | access to parameter target : Span<T> [element] : A |
| CollectionFlow.cs:511:14:511:19 | access to parameter target : Span<T> [element] : A | CollectionFlow.cs:511:14:511:22 | access to indexer |
| CollectionFlow.cs:516:17:516:23 | object creation of type A : A | CollectionFlow.cs:517:60:517:60 | access to local variable a : A |
| CollectionFlow.cs:517:32:517:63 | object creation of type ReadOnlySpan<A> : ReadOnlySpan<T> [element] : A | CollectionFlow.cs:518:14:518:17 | access to local variable span : ReadOnlySpan<T> [element] : A |
| CollectionFlow.cs:517:52:517:62 | array creation of type A[] : null [element] : A | CollectionFlow.cs:517:32:517:63 | object creation of type ReadOnlySpan<A> : ReadOnlySpan<T> [element] : A |
| CollectionFlow.cs:517:58:517:62 | { ..., ... } : null [element] : A | CollectionFlow.cs:517:52:517:62 | array creation of type A[] : null [element] : A |
| CollectionFlow.cs:517:60:517:60 | access to local variable a : A | CollectionFlow.cs:517:58:517:62 | { ..., ... } : null [element] : A |
| CollectionFlow.cs:518:14:518:17 | access to local variable span : ReadOnlySpan<T> [element] : A | CollectionFlow.cs:518:14:518:20 | access to indexer |
nodes nodes
| CollectionFlow.cs:14:40:14:41 | ts : A[] [element] : A | semmle.label | ts : A[] [element] : A | | CollectionFlow.cs:14:40:14:41 | ts : A[] [element] : A | semmle.label | ts : A[] [element] : A |
| CollectionFlow.cs:14:40:14:41 | ts : null [element] : A | semmle.label | ts : null [element] : A | | CollectionFlow.cs:14:40:14:41 | ts : null [element] : A | semmle.label | ts : null [element] : A |
@@ -497,6 +524,38 @@ nodes
| CollectionFlow.cs:449:22:449:28 | .. access to local variable temp : A[] [element] : A | semmle.label | .. access to local variable temp : A[] [element] : A | | CollectionFlow.cs:449:22:449:28 | .. access to local variable temp : A[] [element] : A | semmle.label | .. access to local variable temp : A[] [element] : A |
| CollectionFlow.cs:450:14:450:18 | access to local variable array : A[] [element] : A | semmle.label | access to local variable array : A[] [element] : A | | CollectionFlow.cs:450:14:450:18 | access to local variable array : A[] [element] : A | semmle.label | access to local variable array : A[] [element] : A |
| CollectionFlow.cs:450:14:450:21 | access to array element | semmle.label | access to array element | | CollectionFlow.cs:450:14:450:21 | access to array element | semmle.label | access to array element |
| CollectionFlow.cs:487:17:487:23 | object creation of type A : A | semmle.label | object creation of type A : A |
| CollectionFlow.cs:488:24:488:41 | object creation of type Span<A> : Span<T> [element] : A | semmle.label | object creation of type Span<A> : Span<T> [element] : A |
| CollectionFlow.cs:488:40:488:40 | access to local variable a : A | semmle.label | access to local variable a : A |
| CollectionFlow.cs:489:14:489:17 | access to local variable span : Span<T> [element] : A | semmle.label | access to local variable span : Span<T> [element] : A |
| CollectionFlow.cs:489:14:489:20 | access to indexer | semmle.label | access to indexer |
| CollectionFlow.cs:494:17:494:23 | object creation of type A : A | semmle.label | object creation of type A : A |
| CollectionFlow.cs:495:24:495:41 | object creation of type Span<A> : Span<T> [element] : A | semmle.label | object creation of type Span<A> : Span<T> [element] : A |
| CollectionFlow.cs:495:40:495:40 | access to local variable a : A | semmle.label | access to local variable a : A |
| CollectionFlow.cs:496:19:496:22 | access to local variable span : Span<T> [element] : A | semmle.label | access to local variable span : Span<T> [element] : A |
| CollectionFlow.cs:496:19:496:32 | call to method ToArray : T[] [element] : A | semmle.label | call to method ToArray : T[] [element] : A |
| CollectionFlow.cs:497:14:497:16 | access to local variable arr : T[] [element] : A | semmle.label | access to local variable arr : T[] [element] : A |
| CollectionFlow.cs:497:14:497:19 | access to array element | semmle.label | access to array element |
| CollectionFlow.cs:502:17:502:23 | object creation of type A : A | semmle.label | object creation of type A : A |
| CollectionFlow.cs:503:9:503:14 | [post] access to parameter target : Span<T> [element] : A | semmle.label | [post] access to parameter target : Span<T> [element] : A |
| CollectionFlow.cs:503:21:503:21 | access to local variable a : A | semmle.label | access to local variable a : A |
| CollectionFlow.cs:504:14:504:19 | access to parameter target : Span<T> [element] : A | semmle.label | access to parameter target : Span<T> [element] : A |
| CollectionFlow.cs:504:14:504:22 | access to indexer | semmle.label | access to indexer |
| CollectionFlow.cs:509:22:509:51 | object creation of type Span<A> : Span<T> [element] : A | semmle.label | object creation of type Span<A> : Span<T> [element] : A |
| CollectionFlow.cs:509:34:509:50 | array creation of type A[] : null [element] : A | semmle.label | array creation of type A[] : null [element] : A |
| CollectionFlow.cs:509:40:509:50 | { ..., ... } : null [element] : A | semmle.label | { ..., ... } : null [element] : A |
| CollectionFlow.cs:509:42:509:48 | object creation of type A : A | semmle.label | object creation of type A : A |
| CollectionFlow.cs:510:9:510:14 | access to local variable source : Span<T> [element] : A | semmle.label | access to local variable source : Span<T> [element] : A |
| CollectionFlow.cs:510:23:510:28 | [post] access to parameter target : Span<T> [element] : A | semmle.label | [post] access to parameter target : Span<T> [element] : A |
| CollectionFlow.cs:511:14:511:19 | access to parameter target : Span<T> [element] : A | semmle.label | access to parameter target : Span<T> [element] : A |
| CollectionFlow.cs:511:14:511:22 | access to indexer | semmle.label | access to indexer |
| CollectionFlow.cs:516:17:516:23 | object creation of type A : A | semmle.label | object creation of type A : A |
| CollectionFlow.cs:517:32:517:63 | object creation of type ReadOnlySpan<A> : ReadOnlySpan<T> [element] : A | semmle.label | object creation of type ReadOnlySpan<A> : ReadOnlySpan<T> [element] : A |
| CollectionFlow.cs:517:52:517:62 | array creation of type A[] : null [element] : A | semmle.label | array creation of type A[] : null [element] : A |
| CollectionFlow.cs:517:58:517:62 | { ..., ... } : null [element] : A | semmle.label | { ..., ... } : null [element] : A |
| CollectionFlow.cs:517:60:517:60 | access to local variable a : A | semmle.label | access to local variable a : A |
| CollectionFlow.cs:518:14:518:17 | access to local variable span : ReadOnlySpan<T> [element] : A | semmle.label | access to local variable span : ReadOnlySpan<T> [element] : A |
| CollectionFlow.cs:518:14:518:20 | access to indexer | semmle.label | access to indexer |
subpaths subpaths
| CollectionFlow.cs:44:20:44:22 | access to local variable as : null [element] : A | CollectionFlow.cs:22:34:22:35 | ts : null [element] : A | CollectionFlow.cs:22:41:22:45 | access to array element : A | CollectionFlow.cs:44:14:44:23 | call to method First<A> | | CollectionFlow.cs:44:20:44:22 | access to local variable as : null [element] : A | CollectionFlow.cs:22:34:22:35 | ts : null [element] : A | CollectionFlow.cs:22:41:22:45 | access to array element : A | CollectionFlow.cs:44:14:44:23 | call to method First<A> |
| CollectionFlow.cs:62:20:62:23 | access to field 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:62:14:62:24 | call to method First<A> | | CollectionFlow.cs:62:20:62:23 | access to field 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:62:14:62:24 | call to method First<A> |
@@ -581,3 +640,8 @@ subpaths
| CollectionFlow.cs:427:17:427:23 | object creation of type A : A | CollectionFlow.cs:427:17:427:23 | object creation of type A : A | CollectionFlow.cs:429:14:429:21 | access to array element | $@ | CollectionFlow.cs:429:14:429:21 | access to array element | access to array element | | CollectionFlow.cs:427:17:427:23 | object creation of type A : A | CollectionFlow.cs:427:17:427:23 | object creation of type A : A | CollectionFlow.cs:429:14:429:21 | access to array element | $@ | CollectionFlow.cs:429:14:429:21 | access to array element | access to array element |
| CollectionFlow.cs:434:17:434:23 | object creation of type A : A | CollectionFlow.cs:434:17:434:23 | object creation of type A : A | CollectionFlow.cs:436:14:436:17 | access to indexer | $@ | CollectionFlow.cs:436:14:436:17 | access to indexer | access to indexer | | CollectionFlow.cs:434:17:434:23 | object creation of type A : A | CollectionFlow.cs:434:17:434:23 | object creation of type A : A | CollectionFlow.cs:436:14:436:17 | access to indexer | $@ | CollectionFlow.cs:436:14:436:17 | access to indexer | access to indexer |
| CollectionFlow.cs:447:17:447:23 | object creation of type A : A | CollectionFlow.cs:447:17:447:23 | object creation of type A : A | CollectionFlow.cs:450:14:450:21 | access to array element | $@ | CollectionFlow.cs:450:14:450:21 | access to array element | access to array element | | CollectionFlow.cs:447:17:447:23 | object creation of type A : A | CollectionFlow.cs:447:17:447:23 | object creation of type A : A | CollectionFlow.cs:450:14:450:21 | access to array element | $@ | CollectionFlow.cs:450:14:450:21 | access to array element | access to array element |
| CollectionFlow.cs:487:17:487:23 | object creation of type A : A | CollectionFlow.cs:487:17:487:23 | object creation of type A : A | CollectionFlow.cs:489:14:489:20 | access to indexer | $@ | CollectionFlow.cs:489:14:489:20 | access to indexer | access to indexer |
| CollectionFlow.cs:494:17:494:23 | object creation of type A : A | CollectionFlow.cs:494:17:494:23 | object creation of type A : A | CollectionFlow.cs:497:14:497:19 | access to array element | $@ | CollectionFlow.cs:497:14:497:19 | access to array element | access to array element |
| CollectionFlow.cs:502:17:502:23 | object creation of type A : A | CollectionFlow.cs:502:17:502:23 | object creation of type A : A | CollectionFlow.cs:504:14:504:22 | access to indexer | $@ | CollectionFlow.cs:504:14:504:22 | access to indexer | access to indexer |
| CollectionFlow.cs:509:42:509:48 | object creation of type A : A | CollectionFlow.cs:509:42:509:48 | object creation of type A : A | CollectionFlow.cs:511:14:511:22 | access to indexer | $@ | CollectionFlow.cs:511:14:511:22 | access to indexer | access to indexer |
| CollectionFlow.cs:516:17:516:23 | object creation of type A : A | CollectionFlow.cs:516:17:516:23 | object creation of type A : A | CollectionFlow.cs:518:14:518:20 | access to indexer | $@ | CollectionFlow.cs:518:14:518:20 | access to indexer | access to indexer |

View File

@@ -5137,6 +5137,8 @@ summary
| System.Collections.Immutable;ImmutableArray;false;CreateRange<TSource,TArg,TResult>;(System.Collections.Immutable.ImmutableArray<TSource>,System.Int32,System.Int32,System.Func<TSource,TArg,TResult>,TArg);;Argument[3];Argument[3].Parameter[delegate-self];value;hq-generated | | System.Collections.Immutable;ImmutableArray;false;CreateRange<TSource,TArg,TResult>;(System.Collections.Immutable.ImmutableArray<TSource>,System.Int32,System.Int32,System.Func<TSource,TArg,TResult>,TArg);;Argument[3];Argument[3].Parameter[delegate-self];value;hq-generated |
| System.Collections.Immutable;ImmutableArray;false;CreateRange<TSource,TResult>;(System.Collections.Immutable.ImmutableArray<TSource>,System.Func<TSource,TResult>);;Argument[1];Argument[1].Parameter[delegate-self];value;hq-generated | | System.Collections.Immutable;ImmutableArray;false;CreateRange<TSource,TResult>;(System.Collections.Immutable.ImmutableArray<TSource>,System.Func<TSource,TResult>);;Argument[1];Argument[1].Parameter[delegate-self];value;hq-generated |
| System.Collections.Immutable;ImmutableArray;false;CreateRange<TSource,TResult>;(System.Collections.Immutable.ImmutableArray<TSource>,System.Int32,System.Int32,System.Func<TSource,TResult>);;Argument[3];Argument[3].Parameter[delegate-self];value;hq-generated | | System.Collections.Immutable;ImmutableArray;false;CreateRange<TSource,TResult>;(System.Collections.Immutable.ImmutableArray<TSource>,System.Int32,System.Int32,System.Func<TSource,TResult>);;Argument[3];Argument[3].Parameter[delegate-self];value;hq-generated |
| System.Collections.Immutable;ImmutableArray;false;ToImmutableArray<T>;(System.ReadOnlySpan<T>);;Argument[0].Element;ReturnValue.Element;value;manual |
| System.Collections.Immutable;ImmutableArray;false;ToImmutableArray<T>;(System.Span<T>);;Argument[0].Element;ReturnValue.Element;value;manual |
| System.Collections.Immutable;ImmutableArray;false;ToImmutableArray<TSource>;(System.Collections.Generic.IEnumerable<TSource>);;Argument[0].Element;ReturnValue;taint;df-generated | | System.Collections.Immutable;ImmutableArray;false;ToImmutableArray<TSource>;(System.Collections.Generic.IEnumerable<TSource>);;Argument[0].Element;ReturnValue;taint;df-generated |
| System.Collections.Immutable;ImmutableArray<T>+Builder;false;Add;(T);;Argument[0];Argument[this].Element;value;manual | | System.Collections.Immutable;ImmutableArray<T>+Builder;false;Add;(T);;Argument[0];Argument[this].Element;value;manual |
| System.Collections.Immutable;ImmutableArray<T>+Builder;false;AddRange;(System.Collections.Generic.IEnumerable<T>);;Argument[0].Element;Argument[this].Element;value;manual | | System.Collections.Immutable;ImmutableArray<T>+Builder;false;AddRange;(System.Collections.Generic.IEnumerable<T>);;Argument[0].Element;Argument[this].Element;value;manual |
@@ -9803,9 +9805,9 @@ summary
| System.Linq;Enumerable;false;Concat<TSource>;(System.Collections.Generic.IEnumerable<TSource>,System.Collections.Generic.IEnumerable<TSource>);;Argument[1].Element;ReturnValue.Element;value;manual | | System.Linq;Enumerable;false;Concat<TSource>;(System.Collections.Generic.IEnumerable<TSource>,System.Collections.Generic.IEnumerable<TSource>);;Argument[1].Element;ReturnValue.Element;value;manual |
| System.Linq;Enumerable;false;Count<TSource>;(System.Collections.Generic.IEnumerable<TSource>,System.Func<TSource,System.Boolean>);;Argument[0].Element;Argument[1].Parameter[0];value;manual | | System.Linq;Enumerable;false;Count<TSource>;(System.Collections.Generic.IEnumerable<TSource>,System.Func<TSource,System.Boolean>);;Argument[0].Element;Argument[1].Parameter[0];value;manual |
| System.Linq;Enumerable;false;Count<TSource>;(System.Collections.Generic.IEnumerable<TSource>,System.Func<TSource,System.Boolean>);;Argument[1];Argument[1].Parameter[delegate-self];value;manual | | System.Linq;Enumerable;false;Count<TSource>;(System.Collections.Generic.IEnumerable<TSource>,System.Func<TSource,System.Boolean>);;Argument[1];Argument[1].Parameter[delegate-self];value;manual |
| System.Linq;Enumerable;false;DefaultIfEmpty<TSource>;(System.Collections.Generic.IEnumerable<TSource>);;Argument[0].Element;ReturnValue;value;manual | | System.Linq;Enumerable;false;DefaultIfEmpty<TSource>;(System.Collections.Generic.IEnumerable<TSource>);;Argument[0].Element;ReturnValue.Element;value;manual |
| System.Linq;Enumerable;false;DefaultIfEmpty<TSource>;(System.Collections.Generic.IEnumerable<TSource>,TSource);;Argument[0].Element;ReturnValue;value;manual | | System.Linq;Enumerable;false;DefaultIfEmpty<TSource>;(System.Collections.Generic.IEnumerable<TSource>,TSource);;Argument[0].Element;ReturnValue.Element;value;manual |
| System.Linq;Enumerable;false;DefaultIfEmpty<TSource>;(System.Collections.Generic.IEnumerable<TSource>,TSource);;Argument[1];ReturnValue;value;manual | | System.Linq;Enumerable;false;DefaultIfEmpty<TSource>;(System.Collections.Generic.IEnumerable<TSource>,TSource);;Argument[1];ReturnValue.Element;value;manual |
| System.Linq;Enumerable;false;Distinct<TSource>;(System.Collections.Generic.IEnumerable<TSource>);;Argument[0].Element;ReturnValue.Element;value;manual | | System.Linq;Enumerable;false;Distinct<TSource>;(System.Collections.Generic.IEnumerable<TSource>);;Argument[0].Element;ReturnValue.Element;value;manual |
| System.Linq;Enumerable;false;Distinct<TSource>;(System.Collections.Generic.IEnumerable<TSource>,System.Collections.Generic.IEqualityComparer<TSource>);;Argument[0].Element;ReturnValue.Element;value;manual | | System.Linq;Enumerable;false;Distinct<TSource>;(System.Collections.Generic.IEnumerable<TSource>,System.Collections.Generic.IEqualityComparer<TSource>);;Argument[0].Element;ReturnValue.Element;value;manual |
| System.Linq;Enumerable;false;DistinctBy<TSource,TKey>;(System.Collections.Generic.IEnumerable<TSource>,System.Func<TSource,TKey>);;Argument[1];Argument[1].Parameter[delegate-self];value;hq-generated | | System.Linq;Enumerable;false;DistinctBy<TSource,TKey>;(System.Collections.Generic.IEnumerable<TSource>,System.Func<TSource,TKey>);;Argument[1];Argument[1].Parameter[delegate-self];value;hq-generated |
@@ -9814,8 +9816,8 @@ summary
| System.Linq;Enumerable;false;ElementAt<TSource>;(System.Collections.Generic.IEnumerable<TSource>,System.Int32);;Argument[0].Element;ReturnValue;value;manual | | System.Linq;Enumerable;false;ElementAt<TSource>;(System.Collections.Generic.IEnumerable<TSource>,System.Int32);;Argument[0].Element;ReturnValue;value;manual |
| System.Linq;Enumerable;false;ElementAtOrDefault<TSource>;(System.Collections.Generic.IEnumerable<TSource>,System.Index);;Argument[0].Element;ReturnValue;taint;df-generated | | System.Linq;Enumerable;false;ElementAtOrDefault<TSource>;(System.Collections.Generic.IEnumerable<TSource>,System.Index);;Argument[0].Element;ReturnValue;taint;df-generated |
| System.Linq;Enumerable;false;ElementAtOrDefault<TSource>;(System.Collections.Generic.IEnumerable<TSource>,System.Int32);;Argument[0].Element;ReturnValue;value;manual | | System.Linq;Enumerable;false;ElementAtOrDefault<TSource>;(System.Collections.Generic.IEnumerable<TSource>,System.Int32);;Argument[0].Element;ReturnValue;value;manual |
| System.Linq;Enumerable;false;Except<TSource>;(System.Collections.Generic.IEnumerable<TSource>,System.Collections.Generic.IEnumerable<TSource>);;Argument[0].Element;ReturnValue;value;manual | | System.Linq;Enumerable;false;Except<TSource>;(System.Collections.Generic.IEnumerable<TSource>,System.Collections.Generic.IEnumerable<TSource>);;Argument[0].Element;ReturnValue.Element;value;manual |
| System.Linq;Enumerable;false;Except<TSource>;(System.Collections.Generic.IEnumerable<TSource>,System.Collections.Generic.IEnumerable<TSource>,System.Collections.Generic.IEqualityComparer<TSource>);;Argument[0].Element;ReturnValue;value;manual | | System.Linq;Enumerable;false;Except<TSource>;(System.Collections.Generic.IEnumerable<TSource>,System.Collections.Generic.IEnumerable<TSource>,System.Collections.Generic.IEqualityComparer<TSource>);;Argument[0].Element;ReturnValue.Element;value;manual |
| System.Linq;Enumerable;false;ExceptBy<TSource,TKey>;(System.Collections.Generic.IEnumerable<TSource>,System.Collections.Generic.IEnumerable<TKey>,System.Func<TSource,TKey>);;Argument[2];Argument[2].Parameter[delegate-self];value;hq-generated | | System.Linq;Enumerable;false;ExceptBy<TSource,TKey>;(System.Collections.Generic.IEnumerable<TSource>,System.Collections.Generic.IEnumerable<TKey>,System.Func<TSource,TKey>);;Argument[2];Argument[2].Parameter[delegate-self];value;hq-generated |
| System.Linq;Enumerable;false;ExceptBy<TSource,TKey>;(System.Collections.Generic.IEnumerable<TSource>,System.Collections.Generic.IEnumerable<TKey>,System.Func<TSource,TKey>,System.Collections.Generic.IEqualityComparer<TKey>);;Argument[2];Argument[2].Parameter[delegate-self];value;hq-generated | | System.Linq;Enumerable;false;ExceptBy<TSource,TKey>;(System.Collections.Generic.IEnumerable<TSource>,System.Collections.Generic.IEnumerable<TKey>,System.Func<TSource,TKey>,System.Collections.Generic.IEqualityComparer<TKey>);;Argument[2];Argument[2].Parameter[delegate-self];value;hq-generated |
| System.Linq;Enumerable;false;First<TSource>;(System.Collections.Generic.IEnumerable<TSource>);;Argument[0].Element;ReturnValue;value;manual | | System.Linq;Enumerable;false;First<TSource>;(System.Collections.Generic.IEnumerable<TSource>);;Argument[0].Element;ReturnValue;value;manual |
@@ -10238,17 +10240,17 @@ summary
| System.Linq;ParallelEnumerable;false;Concat<TSource>;(System.Linq.ParallelQuery<TSource>,System.Linq.ParallelQuery<TSource>);;Argument[1].Element;ReturnValue.Element;value;manual | | System.Linq;ParallelEnumerable;false;Concat<TSource>;(System.Linq.ParallelQuery<TSource>,System.Linq.ParallelQuery<TSource>);;Argument[1].Element;ReturnValue.Element;value;manual |
| System.Linq;ParallelEnumerable;false;Count<TSource>;(System.Linq.ParallelQuery<TSource>,System.Func<TSource,System.Boolean>);;Argument[0].Element;Argument[1].Parameter[0];value;manual | | System.Linq;ParallelEnumerable;false;Count<TSource>;(System.Linq.ParallelQuery<TSource>,System.Func<TSource,System.Boolean>);;Argument[0].Element;Argument[1].Parameter[0];value;manual |
| System.Linq;ParallelEnumerable;false;Count<TSource>;(System.Linq.ParallelQuery<TSource>,System.Func<TSource,System.Boolean>);;Argument[1];Argument[1].Parameter[delegate-self];value;manual | | System.Linq;ParallelEnumerable;false;Count<TSource>;(System.Linq.ParallelQuery<TSource>,System.Func<TSource,System.Boolean>);;Argument[1];Argument[1].Parameter[delegate-self];value;manual |
| System.Linq;ParallelEnumerable;false;DefaultIfEmpty<TSource>;(System.Linq.ParallelQuery<TSource>);;Argument[0].Element;ReturnValue;value;manual | | System.Linq;ParallelEnumerable;false;DefaultIfEmpty<TSource>;(System.Linq.ParallelQuery<TSource>);;Argument[0].Element;ReturnValue.Element;value;manual |
| System.Linq;ParallelEnumerable;false;DefaultIfEmpty<TSource>;(System.Linq.ParallelQuery<TSource>,TSource);;Argument[0].Element;ReturnValue;value;manual | | System.Linq;ParallelEnumerable;false;DefaultIfEmpty<TSource>;(System.Linq.ParallelQuery<TSource>,TSource);;Argument[0].Element;ReturnValue.Element;value;manual |
| System.Linq;ParallelEnumerable;false;DefaultIfEmpty<TSource>;(System.Linq.ParallelQuery<TSource>,TSource);;Argument[1];ReturnValue;value;manual | | System.Linq;ParallelEnumerable;false;DefaultIfEmpty<TSource>;(System.Linq.ParallelQuery<TSource>,TSource);;Argument[1];ReturnValue.Element;value;manual |
| System.Linq;ParallelEnumerable;false;Distinct<TSource>;(System.Linq.ParallelQuery<TSource>);;Argument[0].Element;ReturnValue.Element;value;manual | | System.Linq;ParallelEnumerable;false;Distinct<TSource>;(System.Linq.ParallelQuery<TSource>);;Argument[0].Element;ReturnValue.Element;value;manual |
| System.Linq;ParallelEnumerable;false;Distinct<TSource>;(System.Linq.ParallelQuery<TSource>,System.Collections.Generic.IEqualityComparer<TSource>);;Argument[0].Element;ReturnValue.Element;value;manual | | System.Linq;ParallelEnumerable;false;Distinct<TSource>;(System.Linq.ParallelQuery<TSource>,System.Collections.Generic.IEqualityComparer<TSource>);;Argument[0].Element;ReturnValue.Element;value;manual |
| System.Linq;ParallelEnumerable;false;ElementAt<TSource>;(System.Linq.ParallelQuery<TSource>,System.Int32);;Argument[0].Element;ReturnValue;value;manual | | System.Linq;ParallelEnumerable;false;ElementAt<TSource>;(System.Linq.ParallelQuery<TSource>,System.Int32);;Argument[0].Element;ReturnValue;value;manual |
| System.Linq;ParallelEnumerable;false;ElementAtOrDefault<TSource>;(System.Linq.ParallelQuery<TSource>,System.Int32);;Argument[0].Element;ReturnValue;value;manual | | System.Linq;ParallelEnumerable;false;ElementAtOrDefault<TSource>;(System.Linq.ParallelQuery<TSource>,System.Int32);;Argument[0].Element;ReturnValue;value;manual |
| System.Linq;ParallelEnumerable;false;Except<TSource>;(System.Linq.ParallelQuery<TSource>,System.Collections.Generic.IEnumerable<TSource>);;Argument[0].Element;ReturnValue;value;manual | | System.Linq;ParallelEnumerable;false;Except<TSource>;(System.Linq.ParallelQuery<TSource>,System.Collections.Generic.IEnumerable<TSource>);;Argument[0].Element;ReturnValue.Element;value;manual |
| System.Linq;ParallelEnumerable;false;Except<TSource>;(System.Linq.ParallelQuery<TSource>,System.Collections.Generic.IEnumerable<TSource>,System.Collections.Generic.IEqualityComparer<TSource>);;Argument[0].Element;ReturnValue;value;manual | | System.Linq;ParallelEnumerable;false;Except<TSource>;(System.Linq.ParallelQuery<TSource>,System.Collections.Generic.IEnumerable<TSource>,System.Collections.Generic.IEqualityComparer<TSource>);;Argument[0].Element;ReturnValue.Element;value;manual |
| System.Linq;ParallelEnumerable;false;Except<TSource>;(System.Linq.ParallelQuery<TSource>,System.Linq.ParallelQuery<TSource>);;Argument[0].Element;ReturnValue;value;manual | | System.Linq;ParallelEnumerable;false;Except<TSource>;(System.Linq.ParallelQuery<TSource>,System.Linq.ParallelQuery<TSource>);;Argument[0].Element;ReturnValue.Element;value;manual |
| System.Linq;ParallelEnumerable;false;Except<TSource>;(System.Linq.ParallelQuery<TSource>,System.Linq.ParallelQuery<TSource>,System.Collections.Generic.IEqualityComparer<TSource>);;Argument[0].Element;ReturnValue;value;manual | | System.Linq;ParallelEnumerable;false;Except<TSource>;(System.Linq.ParallelQuery<TSource>,System.Linq.ParallelQuery<TSource>,System.Collections.Generic.IEqualityComparer<TSource>);;Argument[0].Element;ReturnValue.Element;value;manual |
| System.Linq;ParallelEnumerable;false;First<TSource>;(System.Linq.ParallelQuery<TSource>);;Argument[0].Element;ReturnValue;value;manual | | System.Linq;ParallelEnumerable;false;First<TSource>;(System.Linq.ParallelQuery<TSource>);;Argument[0].Element;ReturnValue;value;manual |
| System.Linq;ParallelEnumerable;false;First<TSource>;(System.Linq.ParallelQuery<TSource>,System.Func<TSource,System.Boolean>);;Argument[0].Element;Argument[1].Parameter[0];value;manual | | System.Linq;ParallelEnumerable;false;First<TSource>;(System.Linq.ParallelQuery<TSource>,System.Func<TSource,System.Boolean>);;Argument[0].Element;Argument[1].Parameter[0];value;manual |
| System.Linq;ParallelEnumerable;false;First<TSource>;(System.Linq.ParallelQuery<TSource>,System.Func<TSource,System.Boolean>);;Argument[0].Element;ReturnValue;value;manual | | System.Linq;ParallelEnumerable;false;First<TSource>;(System.Linq.ParallelQuery<TSource>,System.Func<TSource,System.Boolean>);;Argument[0].Element;ReturnValue;value;manual |
@@ -10624,17 +10626,17 @@ summary
| System.Linq;Queryable;false;Concat<TSource>;(System.Linq.IQueryable<TSource>,System.Collections.Generic.IEnumerable<TSource>);;Argument[1].Element;ReturnValue.Element;value;manual | | System.Linq;Queryable;false;Concat<TSource>;(System.Linq.IQueryable<TSource>,System.Collections.Generic.IEnumerable<TSource>);;Argument[1].Element;ReturnValue.Element;value;manual |
| System.Linq;Queryable;false;Count<TSource>;(System.Linq.IQueryable<TSource>,System.Linq.Expressions.Expression<System.Func<TSource,System.Boolean>>);;Argument[0].Element;Argument[1].Parameter[0];value;manual | | System.Linq;Queryable;false;Count<TSource>;(System.Linq.IQueryable<TSource>,System.Linq.Expressions.Expression<System.Func<TSource,System.Boolean>>);;Argument[0].Element;Argument[1].Parameter[0];value;manual |
| System.Linq;Queryable;false;Count<TSource>;(System.Linq.IQueryable<TSource>,System.Linq.Expressions.Expression<System.Func<TSource,System.Boolean>>);;Argument[1];Argument[1].Parameter[delegate-self];value;manual | | System.Linq;Queryable;false;Count<TSource>;(System.Linq.IQueryable<TSource>,System.Linq.Expressions.Expression<System.Func<TSource,System.Boolean>>);;Argument[1];Argument[1].Parameter[delegate-self];value;manual |
| System.Linq;Queryable;false;DefaultIfEmpty<TSource>;(System.Linq.IQueryable<TSource>);;Argument[0].Element;ReturnValue;value;manual | | System.Linq;Queryable;false;DefaultIfEmpty<TSource>;(System.Linq.IQueryable<TSource>);;Argument[0].Element;ReturnValue.Element;value;manual |
| System.Linq;Queryable;false;DefaultIfEmpty<TSource>;(System.Linq.IQueryable<TSource>,TSource);;Argument[0].Element;ReturnValue;value;manual | | System.Linq;Queryable;false;DefaultIfEmpty<TSource>;(System.Linq.IQueryable<TSource>,TSource);;Argument[0].Element;ReturnValue.Element;value;manual |
| System.Linq;Queryable;false;DefaultIfEmpty<TSource>;(System.Linq.IQueryable<TSource>,TSource);;Argument[1];ReturnValue;value;manual | | System.Linq;Queryable;false;DefaultIfEmpty<TSource>;(System.Linq.IQueryable<TSource>,TSource);;Argument[1];ReturnValue.Element;value;manual |
| System.Linq;Queryable;false;Distinct<TSource>;(System.Linq.IQueryable<TSource>);;Argument[0].Element;ReturnValue.Element;value;manual | | System.Linq;Queryable;false;Distinct<TSource>;(System.Linq.IQueryable<TSource>);;Argument[0].Element;ReturnValue.Element;value;manual |
| System.Linq;Queryable;false;Distinct<TSource>;(System.Linq.IQueryable<TSource>,System.Collections.Generic.IEqualityComparer<TSource>);;Argument[0].Element;ReturnValue.Element;value;manual | | System.Linq;Queryable;false;Distinct<TSource>;(System.Linq.IQueryable<TSource>,System.Collections.Generic.IEqualityComparer<TSource>);;Argument[0].Element;ReturnValue.Element;value;manual |
| System.Linq;Queryable;false;DistinctBy<TSource,TKey>;(System.Linq.IQueryable<TSource>,System.Linq.Expressions.Expression<System.Func<TSource,TKey>>);;Argument[1];Argument[1].Parameter[delegate-self];value;hq-generated | | System.Linq;Queryable;false;DistinctBy<TSource,TKey>;(System.Linq.IQueryable<TSource>,System.Linq.Expressions.Expression<System.Func<TSource,TKey>>);;Argument[1];Argument[1].Parameter[delegate-self];value;hq-generated |
| System.Linq;Queryable;false;DistinctBy<TSource,TKey>;(System.Linq.IQueryable<TSource>,System.Linq.Expressions.Expression<System.Func<TSource,TKey>>,System.Collections.Generic.IEqualityComparer<TKey>);;Argument[1];Argument[1].Parameter[delegate-self];value;hq-generated | | System.Linq;Queryable;false;DistinctBy<TSource,TKey>;(System.Linq.IQueryable<TSource>,System.Linq.Expressions.Expression<System.Func<TSource,TKey>>,System.Collections.Generic.IEqualityComparer<TKey>);;Argument[1];Argument[1].Parameter[delegate-self];value;hq-generated |
| System.Linq;Queryable;false;ElementAt<TSource>;(System.Linq.IQueryable<TSource>,System.Int32);;Argument[0].Element;ReturnValue;value;manual | | System.Linq;Queryable;false;ElementAt<TSource>;(System.Linq.IQueryable<TSource>,System.Int32);;Argument[0].Element;ReturnValue;value;manual |
| System.Linq;Queryable;false;ElementAtOrDefault<TSource>;(System.Linq.IQueryable<TSource>,System.Int32);;Argument[0].Element;ReturnValue;value;manual | | System.Linq;Queryable;false;ElementAtOrDefault<TSource>;(System.Linq.IQueryable<TSource>,System.Int32);;Argument[0].Element;ReturnValue;value;manual |
| System.Linq;Queryable;false;Except<TSource>;(System.Linq.IQueryable<TSource>,System.Collections.Generic.IEnumerable<TSource>);;Argument[0].Element;ReturnValue;value;manual | | System.Linq;Queryable;false;Except<TSource>;(System.Linq.IQueryable<TSource>,System.Collections.Generic.IEnumerable<TSource>);;Argument[0].Element;ReturnValue.Element;value;manual |
| System.Linq;Queryable;false;Except<TSource>;(System.Linq.IQueryable<TSource>,System.Collections.Generic.IEnumerable<TSource>,System.Collections.Generic.IEqualityComparer<TSource>);;Argument[0].Element;ReturnValue;value;manual | | System.Linq;Queryable;false;Except<TSource>;(System.Linq.IQueryable<TSource>,System.Collections.Generic.IEnumerable<TSource>,System.Collections.Generic.IEqualityComparer<TSource>);;Argument[0].Element;ReturnValue.Element;value;manual |
| System.Linq;Queryable;false;ExceptBy<TSource,TKey>;(System.Linq.IQueryable<TSource>,System.Collections.Generic.IEnumerable<TKey>,System.Linq.Expressions.Expression<System.Func<TSource,TKey>>);;Argument[2];Argument[2].Parameter[delegate-self];value;hq-generated | | System.Linq;Queryable;false;ExceptBy<TSource,TKey>;(System.Linq.IQueryable<TSource>,System.Collections.Generic.IEnumerable<TKey>,System.Linq.Expressions.Expression<System.Func<TSource,TKey>>);;Argument[2];Argument[2].Parameter[delegate-self];value;hq-generated |
| System.Linq;Queryable;false;ExceptBy<TSource,TKey>;(System.Linq.IQueryable<TSource>,System.Collections.Generic.IEnumerable<TKey>,System.Linq.Expressions.Expression<System.Func<TSource,TKey>>,System.Collections.Generic.IEqualityComparer<TKey>);;Argument[2];Argument[2].Parameter[delegate-self];value;hq-generated | | System.Linq;Queryable;false;ExceptBy<TSource,TKey>;(System.Linq.IQueryable<TSource>,System.Collections.Generic.IEnumerable<TKey>,System.Linq.Expressions.Expression<System.Func<TSource,TKey>>,System.Collections.Generic.IEqualityComparer<TKey>);;Argument[2];Argument[2].Parameter[delegate-self];value;hq-generated |
| System.Linq;Queryable;false;First<TSource>;(System.Linq.IQueryable<TSource>);;Argument[0].Element;ReturnValue;value;manual | | System.Linq;Queryable;false;First<TSource>;(System.Linq.IQueryable<TSource>);;Argument[0].Element;ReturnValue;value;manual |
@@ -17709,6 +17711,9 @@ summary
| System;MemoryExtensions;false;AsMemory<T>;(T[],System.Range);;Argument[0].Element;ReturnValue;taint;df-generated | | System;MemoryExtensions;false;AsMemory<T>;(T[],System.Range);;Argument[0].Element;ReturnValue;taint;df-generated |
| System;MemoryExtensions;false;EnumerateLines;(System.ReadOnlySpan<System.Char>);;Argument[0];ReturnValue;taint;df-generated | | System;MemoryExtensions;false;EnumerateLines;(System.ReadOnlySpan<System.Char>);;Argument[0];ReturnValue;taint;df-generated |
| System;MemoryExtensions;false;EnumerateRunes;(System.ReadOnlySpan<System.Char>);;Argument[0];ReturnValue;taint;df-generated | | System;MemoryExtensions;false;EnumerateRunes;(System.ReadOnlySpan<System.Char>);;Argument[0];ReturnValue;taint;df-generated |
| System;MemoryExtensions;false;Replace<T>;(System.ReadOnlySpan<T>,System.Span<T>,T,T);;Argument[0].Element;Argument[1].Element;value;manual |
| System;MemoryExtensions;false;Replace<T>;(System.ReadOnlySpan<T>,System.Span<T>,T,T);;Argument[3];Argument[1].Element;value;manual |
| System;MemoryExtensions;false;Replace<T>;(System.Span<T>,T,T);;Argument[2];Argument[0].Element;value;manual |
| System;MemoryExtensions;false;Sort<T>;(System.Span<T>,System.Comparison<T>);;Argument[1];Argument[1].Parameter[delegate-self];value;hq-generated | | System;MemoryExtensions;false;Sort<T>;(System.Span<T>,System.Comparison<T>);;Argument[1];Argument[1].Parameter[delegate-self];value;hq-generated |
| System;MemoryExtensions;false;Sort<TKey,TValue>;(System.Span<TKey>,System.Span<TValue>,System.Comparison<TKey>);;Argument[2];Argument[2].Parameter[delegate-self];value;hq-generated | | System;MemoryExtensions;false;Sort<TKey,TValue>;(System.Span<TKey>,System.Span<TValue>,System.Comparison<TKey>);;Argument[2];Argument[2].Parameter[delegate-self];value;hq-generated |
| System;MemoryExtensions;false;Trim;(System.Memory<System.Char>);;Argument[0];ReturnValue;taint;df-generated | | System;MemoryExtensions;false;Trim;(System.Memory<System.Char>);;Argument[0];ReturnValue;taint;df-generated |
@@ -17785,7 +17790,17 @@ summary
| System;ReadOnlyMemory<T>;false;Slice;(System.Int32);;Argument[this];ReturnValue;taint;df-generated | | System;ReadOnlyMemory<T>;false;Slice;(System.Int32);;Argument[this];ReturnValue;taint;df-generated |
| System;ReadOnlyMemory<T>;false;Slice;(System.Int32,System.Int32);;Argument[this];ReturnValue;taint;df-generated | | System;ReadOnlyMemory<T>;false;Slice;(System.Int32,System.Int32);;Argument[this];ReturnValue;taint;df-generated |
| System;ReadOnlyMemory<T>;false;ToString;();;Argument[this];ReturnValue;taint;df-generated | | System;ReadOnlyMemory<T>;false;ToString;();;Argument[this];ReturnValue;taint;df-generated |
| System;ReadOnlySpan<T>;false;CopyTo;(System.Span<T>);;Argument[this].Element;Argument[0].Element;value;manual |
| System;ReadOnlySpan<T>;false;GetEnumerator;();;Argument[this];ReturnValue;taint;df-generated | | System;ReadOnlySpan<T>;false;GetEnumerator;();;Argument[this];ReturnValue;taint;df-generated |
| System;ReadOnlySpan<T>;false;GetPinnableReference;();;Argument[this].Element;ReturnValue;value;manual |
| System;ReadOnlySpan<T>;false;ReadOnlySpan;(T);;Argument[0];Argument[this].Element;value;manual |
| System;ReadOnlySpan<T>;false;ReadOnlySpan;(T[]);;Argument[0].Element;Argument[this].Element;value;manual |
| System;ReadOnlySpan<T>;false;ReadOnlySpan;(T[],System.Int32,System.Int32);;Argument[0].Element;Argument[this].Element;value;manual |
| System;ReadOnlySpan<T>;false;Slice;(System.Int32);;Argument[this].Element;ReturnValue.Element;value;manual |
| System;ReadOnlySpan<T>;false;Slice;(System.Int32,System.Int32);;Argument[this].Element;ReturnValue.Element;value;manual |
| System;ReadOnlySpan<T>;false;ToArray;();;Argument[this].Element;ReturnValue.Element;value;manual |
| System;ReadOnlySpan<T>;false;TryCopyTo;(System.Span<T>);;Argument[this].Element;Argument[0].Element;value;manual |
| System;ReadOnlySpan<T>;false;get_Item;(System.Int32);;Argument[this].Element;ReturnValue;value;manual |
| System;ResolveEventHandler;false;BeginInvoke;(System.Object,System.ResolveEventArgs,System.AsyncCallback,System.Object);;Argument[2];Argument[2].Parameter[delegate-self];value;hq-generated | | System;ResolveEventHandler;false;BeginInvoke;(System.Object,System.ResolveEventArgs,System.AsyncCallback,System.Object);;Argument[2];Argument[2].Parameter[delegate-self];value;hq-generated |
| System;RuntimeFieldHandle;false;FromIntPtr;(System.IntPtr);;Argument[0];ReturnValue;taint;df-generated | | System;RuntimeFieldHandle;false;FromIntPtr;(System.IntPtr);;Argument[0];ReturnValue;taint;df-generated |
| System;RuntimeFieldHandle;false;ToIntPtr;(System.RuntimeFieldHandle);;Argument[0];ReturnValue;taint;df-generated | | System;RuntimeFieldHandle;false;ToIntPtr;(System.RuntimeFieldHandle);;Argument[0];ReturnValue;taint;df-generated |
@@ -17833,7 +17848,19 @@ summary
| System;Single;false;ToString;(System.IFormatProvider);;Argument[0];ReturnValue;taint;df-generated | | System;Single;false;ToString;(System.IFormatProvider);;Argument[0];ReturnValue;taint;df-generated |
| System;Single;false;ToString;(System.String,System.IFormatProvider);;Argument[1];ReturnValue;taint;df-generated | | System;Single;false;ToString;(System.String,System.IFormatProvider);;Argument[1];ReturnValue;taint;df-generated |
| System;Single;false;ToType;(System.Type,System.IFormatProvider);;Argument[1];ReturnValue;taint;df-generated | | System;Single;false;ToType;(System.Type,System.IFormatProvider);;Argument[1];ReturnValue;taint;df-generated |
| System;Span<T>;false;Clear;();;Argument[this].WithoutElement;Argument[this];value;manual |
| System;Span<T>;false;CopyTo;(System.Span<T>);;Argument[this].Element;Argument[0].Element;value;manual |
| System;Span<T>;false;Fill;(T);;Argument[0];Argument[this].Element;value;manual |
| System;Span<T>;false;GetEnumerator;();;Argument[this];ReturnValue;taint;df-generated | | System;Span<T>;false;GetEnumerator;();;Argument[this];ReturnValue;taint;df-generated |
| System;Span<T>;false;GetPinnableReference;();;Argument[this].Element;ReturnValue;value;manual |
| System;Span<T>;false;Slice;(System.Int32);;Argument[this].Element;ReturnValue.Element;value;manual |
| System;Span<T>;false;Slice;(System.Int32,System.Int32);;Argument[this].Element;ReturnValue.Element;value;manual |
| System;Span<T>;false;Span;(T);;Argument[0];Argument[this].Element;value;manual |
| System;Span<T>;false;Span;(T[]);;Argument[0].Element;Argument[this].Element;value;manual |
| System;Span<T>;false;Span;(T[],System.Int32,System.Int32);;Argument[0].Element;Argument[this].Element;value;manual |
| System;Span<T>;false;ToArray;();;Argument[this].Element;ReturnValue.Element;value;manual |
| System;Span<T>;false;TryCopyTo;(System.Span<T>);;Argument[this].Element;Argument[0].Element;value;manual |
| System;Span<T>;false;get_Item;(System.Int32);;Argument[this].Element;ReturnValue;value;manual |
| System;String;false;Clone;();;Argument[this];ReturnValue;value;manual | | System;String;false;Clone;();;Argument[this];ReturnValue;value;manual |
| System;String;false;Concat;(System.Collections.Generic.IEnumerable<System.String>);;Argument[0].Element;ReturnValue;taint;manual | | System;String;false;Concat;(System.Collections.Generic.IEnumerable<System.String>);;Argument[0].Element;ReturnValue;taint;manual |
| System;String;false;Concat;(System.Object);;Argument[0];ReturnValue;taint;manual | | System;String;false;Concat;(System.Object);;Argument[0];ReturnValue;taint;manual |

View File

@@ -4425,6 +4425,8 @@ summary
| System.Collections.Immutable;ImmutableArray;false;CreateRange<TSource,TArg,TResult>;(System.Collections.Immutable.ImmutableArray<TSource>,System.Int32,System.Int32,System.Func<TSource,TArg,TResult>,TArg);;Argument[3];Argument[3].Parameter[delegate-self];value;hq-generated | | System.Collections.Immutable;ImmutableArray;false;CreateRange<TSource,TArg,TResult>;(System.Collections.Immutable.ImmutableArray<TSource>,System.Int32,System.Int32,System.Func<TSource,TArg,TResult>,TArg);;Argument[3];Argument[3].Parameter[delegate-self];value;hq-generated |
| System.Collections.Immutable;ImmutableArray;false;CreateRange<TSource,TResult>;(System.Collections.Immutable.ImmutableArray<TSource>,System.Func<TSource,TResult>);;Argument[1];Argument[1].Parameter[delegate-self];value;hq-generated | | System.Collections.Immutable;ImmutableArray;false;CreateRange<TSource,TResult>;(System.Collections.Immutable.ImmutableArray<TSource>,System.Func<TSource,TResult>);;Argument[1];Argument[1].Parameter[delegate-self];value;hq-generated |
| System.Collections.Immutable;ImmutableArray;false;CreateRange<TSource,TResult>;(System.Collections.Immutable.ImmutableArray<TSource>,System.Int32,System.Int32,System.Func<TSource,TResult>);;Argument[3];Argument[3].Parameter[delegate-self];value;hq-generated | | System.Collections.Immutable;ImmutableArray;false;CreateRange<TSource,TResult>;(System.Collections.Immutable.ImmutableArray<TSource>,System.Int32,System.Int32,System.Func<TSource,TResult>);;Argument[3];Argument[3].Parameter[delegate-self];value;hq-generated |
| System.Collections.Immutable;ImmutableArray;false;ToImmutableArray<T>;(System.ReadOnlySpan<T>);;Argument[0].Element;ReturnValue.Element;value;manual |
| System.Collections.Immutable;ImmutableArray;false;ToImmutableArray<T>;(System.Span<T>);;Argument[0].Element;ReturnValue.Element;value;manual |
| System.Collections.Immutable;ImmutableArray;false;ToImmutableArray<TSource>;(System.Collections.Generic.IEnumerable<TSource>);;Argument[0].Element;ReturnValue;taint;df-generated | | System.Collections.Immutable;ImmutableArray;false;ToImmutableArray<TSource>;(System.Collections.Generic.IEnumerable<TSource>);;Argument[0].Element;ReturnValue;taint;df-generated |
| System.Collections.Immutable;ImmutableArray<T>+Builder;false;AddRange;(System.Collections.Generic.IEnumerable<T>);;Argument[0].Element;Argument[this].Element;value;manual | | System.Collections.Immutable;ImmutableArray<T>+Builder;false;AddRange;(System.Collections.Generic.IEnumerable<T>);;Argument[0].Element;Argument[this].Element;value;manual |
| System.Collections.Immutable;ImmutableArray<T>+Builder;false;AddRange;(System.Collections.Immutable.ImmutableArray<T>);;Argument[0].Element;Argument[this].Element;value;manual | | System.Collections.Immutable;ImmutableArray<T>+Builder;false;AddRange;(System.Collections.Immutable.ImmutableArray<T>);;Argument[0].Element;Argument[this].Element;value;manual |
@@ -8181,9 +8183,9 @@ summary
| System.Linq;Enumerable;false;Concat<TSource>;(System.Collections.Generic.IEnumerable<TSource>,System.Collections.Generic.IEnumerable<TSource>);;Argument[1].Element;ReturnValue.Element;value;manual | | System.Linq;Enumerable;false;Concat<TSource>;(System.Collections.Generic.IEnumerable<TSource>,System.Collections.Generic.IEnumerable<TSource>);;Argument[1].Element;ReturnValue.Element;value;manual |
| System.Linq;Enumerable;false;Count<TSource>;(System.Collections.Generic.IEnumerable<TSource>,System.Func<TSource,System.Boolean>);;Argument[0].Element;Argument[1].Parameter[0];value;manual | | System.Linq;Enumerable;false;Count<TSource>;(System.Collections.Generic.IEnumerable<TSource>,System.Func<TSource,System.Boolean>);;Argument[0].Element;Argument[1].Parameter[0];value;manual |
| System.Linq;Enumerable;false;Count<TSource>;(System.Collections.Generic.IEnumerable<TSource>,System.Func<TSource,System.Boolean>);;Argument[1];Argument[1].Parameter[delegate-self];value;manual | | System.Linq;Enumerable;false;Count<TSource>;(System.Collections.Generic.IEnumerable<TSource>,System.Func<TSource,System.Boolean>);;Argument[1];Argument[1].Parameter[delegate-self];value;manual |
| System.Linq;Enumerable;false;DefaultIfEmpty<TSource>;(System.Collections.Generic.IEnumerable<TSource>);;Argument[0].Element;ReturnValue;value;manual | | System.Linq;Enumerable;false;DefaultIfEmpty<TSource>;(System.Collections.Generic.IEnumerable<TSource>);;Argument[0].Element;ReturnValue.Element;value;manual |
| System.Linq;Enumerable;false;DefaultIfEmpty<TSource>;(System.Collections.Generic.IEnumerable<TSource>,TSource);;Argument[0].Element;ReturnValue;value;manual | | System.Linq;Enumerable;false;DefaultIfEmpty<TSource>;(System.Collections.Generic.IEnumerable<TSource>,TSource);;Argument[0].Element;ReturnValue.Element;value;manual |
| System.Linq;Enumerable;false;DefaultIfEmpty<TSource>;(System.Collections.Generic.IEnumerable<TSource>,TSource);;Argument[1];ReturnValue;value;manual | | System.Linq;Enumerable;false;DefaultIfEmpty<TSource>;(System.Collections.Generic.IEnumerable<TSource>,TSource);;Argument[1];ReturnValue.Element;value;manual |
| System.Linq;Enumerable;false;Distinct<TSource>;(System.Collections.Generic.IEnumerable<TSource>);;Argument[0].Element;ReturnValue.Element;value;manual | | System.Linq;Enumerable;false;Distinct<TSource>;(System.Collections.Generic.IEnumerable<TSource>);;Argument[0].Element;ReturnValue.Element;value;manual |
| System.Linq;Enumerable;false;Distinct<TSource>;(System.Collections.Generic.IEnumerable<TSource>,System.Collections.Generic.IEqualityComparer<TSource>);;Argument[0].Element;ReturnValue.Element;value;manual | | System.Linq;Enumerable;false;Distinct<TSource>;(System.Collections.Generic.IEnumerable<TSource>,System.Collections.Generic.IEqualityComparer<TSource>);;Argument[0].Element;ReturnValue.Element;value;manual |
| System.Linq;Enumerable;false;DistinctBy<TSource,TKey>;(System.Collections.Generic.IEnumerable<TSource>,System.Func<TSource,TKey>);;Argument[1];Argument[1].Parameter[delegate-self];value;hq-generated | | System.Linq;Enumerable;false;DistinctBy<TSource,TKey>;(System.Collections.Generic.IEnumerable<TSource>,System.Func<TSource,TKey>);;Argument[1];Argument[1].Parameter[delegate-self];value;hq-generated |
@@ -8192,8 +8194,8 @@ summary
| System.Linq;Enumerable;false;ElementAt<TSource>;(System.Collections.Generic.IEnumerable<TSource>,System.Int32);;Argument[0].Element;ReturnValue;value;manual | | System.Linq;Enumerable;false;ElementAt<TSource>;(System.Collections.Generic.IEnumerable<TSource>,System.Int32);;Argument[0].Element;ReturnValue;value;manual |
| System.Linq;Enumerable;false;ElementAtOrDefault<TSource>;(System.Collections.Generic.IEnumerable<TSource>,System.Index);;Argument[0].Element;ReturnValue;taint;df-generated | | System.Linq;Enumerable;false;ElementAtOrDefault<TSource>;(System.Collections.Generic.IEnumerable<TSource>,System.Index);;Argument[0].Element;ReturnValue;taint;df-generated |
| System.Linq;Enumerable;false;ElementAtOrDefault<TSource>;(System.Collections.Generic.IEnumerable<TSource>,System.Int32);;Argument[0].Element;ReturnValue;value;manual | | System.Linq;Enumerable;false;ElementAtOrDefault<TSource>;(System.Collections.Generic.IEnumerable<TSource>,System.Int32);;Argument[0].Element;ReturnValue;value;manual |
| System.Linq;Enumerable;false;Except<TSource>;(System.Collections.Generic.IEnumerable<TSource>,System.Collections.Generic.IEnumerable<TSource>);;Argument[0].Element;ReturnValue;value;manual | | System.Linq;Enumerable;false;Except<TSource>;(System.Collections.Generic.IEnumerable<TSource>,System.Collections.Generic.IEnumerable<TSource>);;Argument[0].Element;ReturnValue.Element;value;manual |
| System.Linq;Enumerable;false;Except<TSource>;(System.Collections.Generic.IEnumerable<TSource>,System.Collections.Generic.IEnumerable<TSource>,System.Collections.Generic.IEqualityComparer<TSource>);;Argument[0].Element;ReturnValue;value;manual | | System.Linq;Enumerable;false;Except<TSource>;(System.Collections.Generic.IEnumerable<TSource>,System.Collections.Generic.IEnumerable<TSource>,System.Collections.Generic.IEqualityComparer<TSource>);;Argument[0].Element;ReturnValue.Element;value;manual |
| System.Linq;Enumerable;false;ExceptBy<TSource,TKey>;(System.Collections.Generic.IEnumerable<TSource>,System.Collections.Generic.IEnumerable<TKey>,System.Func<TSource,TKey>);;Argument[2];Argument[2].Parameter[delegate-self];value;hq-generated | | System.Linq;Enumerable;false;ExceptBy<TSource,TKey>;(System.Collections.Generic.IEnumerable<TSource>,System.Collections.Generic.IEnumerable<TKey>,System.Func<TSource,TKey>);;Argument[2];Argument[2].Parameter[delegate-self];value;hq-generated |
| System.Linq;Enumerable;false;ExceptBy<TSource,TKey>;(System.Collections.Generic.IEnumerable<TSource>,System.Collections.Generic.IEnumerable<TKey>,System.Func<TSource,TKey>,System.Collections.Generic.IEqualityComparer<TKey>);;Argument[2];Argument[2].Parameter[delegate-self];value;hq-generated | | System.Linq;Enumerable;false;ExceptBy<TSource,TKey>;(System.Collections.Generic.IEnumerable<TSource>,System.Collections.Generic.IEnumerable<TKey>,System.Func<TSource,TKey>,System.Collections.Generic.IEqualityComparer<TKey>);;Argument[2];Argument[2].Parameter[delegate-self];value;hq-generated |
| System.Linq;Enumerable;false;First<TSource>;(System.Collections.Generic.IEnumerable<TSource>);;Argument[0].Element;ReturnValue;value;manual | | System.Linq;Enumerable;false;First<TSource>;(System.Collections.Generic.IEnumerable<TSource>);;Argument[0].Element;ReturnValue;value;manual |
@@ -8613,17 +8615,17 @@ summary
| System.Linq;ParallelEnumerable;false;Concat<TSource>;(System.Linq.ParallelQuery<TSource>,System.Linq.ParallelQuery<TSource>);;Argument[1].Element;ReturnValue.Element;value;manual | | System.Linq;ParallelEnumerable;false;Concat<TSource>;(System.Linq.ParallelQuery<TSource>,System.Linq.ParallelQuery<TSource>);;Argument[1].Element;ReturnValue.Element;value;manual |
| System.Linq;ParallelEnumerable;false;Count<TSource>;(System.Linq.ParallelQuery<TSource>,System.Func<TSource,System.Boolean>);;Argument[0].Element;Argument[1].Parameter[0];value;manual | | System.Linq;ParallelEnumerable;false;Count<TSource>;(System.Linq.ParallelQuery<TSource>,System.Func<TSource,System.Boolean>);;Argument[0].Element;Argument[1].Parameter[0];value;manual |
| System.Linq;ParallelEnumerable;false;Count<TSource>;(System.Linq.ParallelQuery<TSource>,System.Func<TSource,System.Boolean>);;Argument[1];Argument[1].Parameter[delegate-self];value;manual | | System.Linq;ParallelEnumerable;false;Count<TSource>;(System.Linq.ParallelQuery<TSource>,System.Func<TSource,System.Boolean>);;Argument[1];Argument[1].Parameter[delegate-self];value;manual |
| System.Linq;ParallelEnumerable;false;DefaultIfEmpty<TSource>;(System.Linq.ParallelQuery<TSource>);;Argument[0].Element;ReturnValue;value;manual | | System.Linq;ParallelEnumerable;false;DefaultIfEmpty<TSource>;(System.Linq.ParallelQuery<TSource>);;Argument[0].Element;ReturnValue.Element;value;manual |
| System.Linq;ParallelEnumerable;false;DefaultIfEmpty<TSource>;(System.Linq.ParallelQuery<TSource>,TSource);;Argument[0].Element;ReturnValue;value;manual | | System.Linq;ParallelEnumerable;false;DefaultIfEmpty<TSource>;(System.Linq.ParallelQuery<TSource>,TSource);;Argument[0].Element;ReturnValue.Element;value;manual |
| System.Linq;ParallelEnumerable;false;DefaultIfEmpty<TSource>;(System.Linq.ParallelQuery<TSource>,TSource);;Argument[1];ReturnValue;value;manual | | System.Linq;ParallelEnumerable;false;DefaultIfEmpty<TSource>;(System.Linq.ParallelQuery<TSource>,TSource);;Argument[1];ReturnValue.Element;value;manual |
| System.Linq;ParallelEnumerable;false;Distinct<TSource>;(System.Linq.ParallelQuery<TSource>);;Argument[0].Element;ReturnValue.Element;value;manual | | System.Linq;ParallelEnumerable;false;Distinct<TSource>;(System.Linq.ParallelQuery<TSource>);;Argument[0].Element;ReturnValue.Element;value;manual |
| System.Linq;ParallelEnumerable;false;Distinct<TSource>;(System.Linq.ParallelQuery<TSource>,System.Collections.Generic.IEqualityComparer<TSource>);;Argument[0].Element;ReturnValue.Element;value;manual | | System.Linq;ParallelEnumerable;false;Distinct<TSource>;(System.Linq.ParallelQuery<TSource>,System.Collections.Generic.IEqualityComparer<TSource>);;Argument[0].Element;ReturnValue.Element;value;manual |
| System.Linq;ParallelEnumerable;false;ElementAt<TSource>;(System.Linq.ParallelQuery<TSource>,System.Int32);;Argument[0].Element;ReturnValue;value;manual | | System.Linq;ParallelEnumerable;false;ElementAt<TSource>;(System.Linq.ParallelQuery<TSource>,System.Int32);;Argument[0].Element;ReturnValue;value;manual |
| System.Linq;ParallelEnumerable;false;ElementAtOrDefault<TSource>;(System.Linq.ParallelQuery<TSource>,System.Int32);;Argument[0].Element;ReturnValue;value;manual | | System.Linq;ParallelEnumerable;false;ElementAtOrDefault<TSource>;(System.Linq.ParallelQuery<TSource>,System.Int32);;Argument[0].Element;ReturnValue;value;manual |
| System.Linq;ParallelEnumerable;false;Except<TSource>;(System.Linq.ParallelQuery<TSource>,System.Collections.Generic.IEnumerable<TSource>);;Argument[0].Element;ReturnValue;value;manual | | System.Linq;ParallelEnumerable;false;Except<TSource>;(System.Linq.ParallelQuery<TSource>,System.Collections.Generic.IEnumerable<TSource>);;Argument[0].Element;ReturnValue.Element;value;manual |
| System.Linq;ParallelEnumerable;false;Except<TSource>;(System.Linq.ParallelQuery<TSource>,System.Collections.Generic.IEnumerable<TSource>,System.Collections.Generic.IEqualityComparer<TSource>);;Argument[0].Element;ReturnValue;value;manual | | System.Linq;ParallelEnumerable;false;Except<TSource>;(System.Linq.ParallelQuery<TSource>,System.Collections.Generic.IEnumerable<TSource>,System.Collections.Generic.IEqualityComparer<TSource>);;Argument[0].Element;ReturnValue.Element;value;manual |
| System.Linq;ParallelEnumerable;false;Except<TSource>;(System.Linq.ParallelQuery<TSource>,System.Linq.ParallelQuery<TSource>);;Argument[0].Element;ReturnValue;value;manual | | System.Linq;ParallelEnumerable;false;Except<TSource>;(System.Linq.ParallelQuery<TSource>,System.Linq.ParallelQuery<TSource>);;Argument[0].Element;ReturnValue.Element;value;manual |
| System.Linq;ParallelEnumerable;false;Except<TSource>;(System.Linq.ParallelQuery<TSource>,System.Linq.ParallelQuery<TSource>,System.Collections.Generic.IEqualityComparer<TSource>);;Argument[0].Element;ReturnValue;value;manual | | System.Linq;ParallelEnumerable;false;Except<TSource>;(System.Linq.ParallelQuery<TSource>,System.Linq.ParallelQuery<TSource>,System.Collections.Generic.IEqualityComparer<TSource>);;Argument[0].Element;ReturnValue.Element;value;manual |
| System.Linq;ParallelEnumerable;false;First<TSource>;(System.Linq.ParallelQuery<TSource>);;Argument[0].Element;ReturnValue;value;manual | | System.Linq;ParallelEnumerable;false;First<TSource>;(System.Linq.ParallelQuery<TSource>);;Argument[0].Element;ReturnValue;value;manual |
| System.Linq;ParallelEnumerable;false;First<TSource>;(System.Linq.ParallelQuery<TSource>,System.Func<TSource,System.Boolean>);;Argument[0].Element;Argument[1].Parameter[0];value;manual | | System.Linq;ParallelEnumerable;false;First<TSource>;(System.Linq.ParallelQuery<TSource>,System.Func<TSource,System.Boolean>);;Argument[0].Element;Argument[1].Parameter[0];value;manual |
| System.Linq;ParallelEnumerable;false;First<TSource>;(System.Linq.ParallelQuery<TSource>,System.Func<TSource,System.Boolean>);;Argument[0].Element;ReturnValue;value;manual | | System.Linq;ParallelEnumerable;false;First<TSource>;(System.Linq.ParallelQuery<TSource>,System.Func<TSource,System.Boolean>);;Argument[0].Element;ReturnValue;value;manual |
@@ -8997,17 +8999,17 @@ summary
| System.Linq;Queryable;false;Concat<TSource>;(System.Linq.IQueryable<TSource>,System.Collections.Generic.IEnumerable<TSource>);;Argument[1].Element;ReturnValue.Element;value;manual | | System.Linq;Queryable;false;Concat<TSource>;(System.Linq.IQueryable<TSource>,System.Collections.Generic.IEnumerable<TSource>);;Argument[1].Element;ReturnValue.Element;value;manual |
| System.Linq;Queryable;false;Count<TSource>;(System.Linq.IQueryable<TSource>,System.Linq.Expressions.Expression<System.Func<TSource,System.Boolean>>);;Argument[0].Element;Argument[1].Parameter[0];value;manual | | System.Linq;Queryable;false;Count<TSource>;(System.Linq.IQueryable<TSource>,System.Linq.Expressions.Expression<System.Func<TSource,System.Boolean>>);;Argument[0].Element;Argument[1].Parameter[0];value;manual |
| System.Linq;Queryable;false;Count<TSource>;(System.Linq.IQueryable<TSource>,System.Linq.Expressions.Expression<System.Func<TSource,System.Boolean>>);;Argument[1];Argument[1].Parameter[delegate-self];value;manual | | System.Linq;Queryable;false;Count<TSource>;(System.Linq.IQueryable<TSource>,System.Linq.Expressions.Expression<System.Func<TSource,System.Boolean>>);;Argument[1];Argument[1].Parameter[delegate-self];value;manual |
| System.Linq;Queryable;false;DefaultIfEmpty<TSource>;(System.Linq.IQueryable<TSource>);;Argument[0].Element;ReturnValue;value;manual | | System.Linq;Queryable;false;DefaultIfEmpty<TSource>;(System.Linq.IQueryable<TSource>);;Argument[0].Element;ReturnValue.Element;value;manual |
| System.Linq;Queryable;false;DefaultIfEmpty<TSource>;(System.Linq.IQueryable<TSource>,TSource);;Argument[0].Element;ReturnValue;value;manual | | System.Linq;Queryable;false;DefaultIfEmpty<TSource>;(System.Linq.IQueryable<TSource>,TSource);;Argument[0].Element;ReturnValue.Element;value;manual |
| System.Linq;Queryable;false;DefaultIfEmpty<TSource>;(System.Linq.IQueryable<TSource>,TSource);;Argument[1];ReturnValue;value;manual | | System.Linq;Queryable;false;DefaultIfEmpty<TSource>;(System.Linq.IQueryable<TSource>,TSource);;Argument[1];ReturnValue.Element;value;manual |
| System.Linq;Queryable;false;Distinct<TSource>;(System.Linq.IQueryable<TSource>);;Argument[0].Element;ReturnValue.Element;value;manual | | System.Linq;Queryable;false;Distinct<TSource>;(System.Linq.IQueryable<TSource>);;Argument[0].Element;ReturnValue.Element;value;manual |
| System.Linq;Queryable;false;Distinct<TSource>;(System.Linq.IQueryable<TSource>,System.Collections.Generic.IEqualityComparer<TSource>);;Argument[0].Element;ReturnValue.Element;value;manual | | System.Linq;Queryable;false;Distinct<TSource>;(System.Linq.IQueryable<TSource>,System.Collections.Generic.IEqualityComparer<TSource>);;Argument[0].Element;ReturnValue.Element;value;manual |
| System.Linq;Queryable;false;DistinctBy<TSource,TKey>;(System.Linq.IQueryable<TSource>,System.Linq.Expressions.Expression<System.Func<TSource,TKey>>);;Argument[1];Argument[1].Parameter[delegate-self];value;hq-generated | | System.Linq;Queryable;false;DistinctBy<TSource,TKey>;(System.Linq.IQueryable<TSource>,System.Linq.Expressions.Expression<System.Func<TSource,TKey>>);;Argument[1];Argument[1].Parameter[delegate-self];value;hq-generated |
| System.Linq;Queryable;false;DistinctBy<TSource,TKey>;(System.Linq.IQueryable<TSource>,System.Linq.Expressions.Expression<System.Func<TSource,TKey>>,System.Collections.Generic.IEqualityComparer<TKey>);;Argument[1];Argument[1].Parameter[delegate-self];value;hq-generated | | System.Linq;Queryable;false;DistinctBy<TSource,TKey>;(System.Linq.IQueryable<TSource>,System.Linq.Expressions.Expression<System.Func<TSource,TKey>>,System.Collections.Generic.IEqualityComparer<TKey>);;Argument[1];Argument[1].Parameter[delegate-self];value;hq-generated |
| System.Linq;Queryable;false;ElementAt<TSource>;(System.Linq.IQueryable<TSource>,System.Int32);;Argument[0].Element;ReturnValue;value;manual | | System.Linq;Queryable;false;ElementAt<TSource>;(System.Linq.IQueryable<TSource>,System.Int32);;Argument[0].Element;ReturnValue;value;manual |
| System.Linq;Queryable;false;ElementAtOrDefault<TSource>;(System.Linq.IQueryable<TSource>,System.Int32);;Argument[0].Element;ReturnValue;value;manual | | System.Linq;Queryable;false;ElementAtOrDefault<TSource>;(System.Linq.IQueryable<TSource>,System.Int32);;Argument[0].Element;ReturnValue;value;manual |
| System.Linq;Queryable;false;Except<TSource>;(System.Linq.IQueryable<TSource>,System.Collections.Generic.IEnumerable<TSource>);;Argument[0].Element;ReturnValue;value;manual | | System.Linq;Queryable;false;Except<TSource>;(System.Linq.IQueryable<TSource>,System.Collections.Generic.IEnumerable<TSource>);;Argument[0].Element;ReturnValue.Element;value;manual |
| System.Linq;Queryable;false;Except<TSource>;(System.Linq.IQueryable<TSource>,System.Collections.Generic.IEnumerable<TSource>,System.Collections.Generic.IEqualityComparer<TSource>);;Argument[0].Element;ReturnValue;value;manual | | System.Linq;Queryable;false;Except<TSource>;(System.Linq.IQueryable<TSource>,System.Collections.Generic.IEnumerable<TSource>,System.Collections.Generic.IEqualityComparer<TSource>);;Argument[0].Element;ReturnValue.Element;value;manual |
| System.Linq;Queryable;false;ExceptBy<TSource,TKey>;(System.Linq.IQueryable<TSource>,System.Collections.Generic.IEnumerable<TKey>,System.Linq.Expressions.Expression<System.Func<TSource,TKey>>);;Argument[2];Argument[2].Parameter[delegate-self];value;hq-generated | | System.Linq;Queryable;false;ExceptBy<TSource,TKey>;(System.Linq.IQueryable<TSource>,System.Collections.Generic.IEnumerable<TKey>,System.Linq.Expressions.Expression<System.Func<TSource,TKey>>);;Argument[2];Argument[2].Parameter[delegate-self];value;hq-generated |
| System.Linq;Queryable;false;ExceptBy<TSource,TKey>;(System.Linq.IQueryable<TSource>,System.Collections.Generic.IEnumerable<TKey>,System.Linq.Expressions.Expression<System.Func<TSource,TKey>>,System.Collections.Generic.IEqualityComparer<TKey>);;Argument[2];Argument[2].Parameter[delegate-self];value;hq-generated | | System.Linq;Queryable;false;ExceptBy<TSource,TKey>;(System.Linq.IQueryable<TSource>,System.Collections.Generic.IEnumerable<TKey>,System.Linq.Expressions.Expression<System.Func<TSource,TKey>>,System.Collections.Generic.IEqualityComparer<TKey>);;Argument[2];Argument[2].Parameter[delegate-self];value;hq-generated |
| System.Linq;Queryable;false;First<TSource>;(System.Linq.IQueryable<TSource>);;Argument[0].Element;ReturnValue;value;manual | | System.Linq;Queryable;false;First<TSource>;(System.Linq.IQueryable<TSource>);;Argument[0].Element;ReturnValue;value;manual |
@@ -15265,6 +15267,9 @@ summary
| System;MemoryExtensions;false;AsMemory<T>;(T[],System.Range);;Argument[0].Element;ReturnValue;taint;df-generated | | System;MemoryExtensions;false;AsMemory<T>;(T[],System.Range);;Argument[0].Element;ReturnValue;taint;df-generated |
| System;MemoryExtensions;false;EnumerateLines;(System.ReadOnlySpan<System.Char>);;Argument[0];ReturnValue;taint;df-generated | | System;MemoryExtensions;false;EnumerateLines;(System.ReadOnlySpan<System.Char>);;Argument[0];ReturnValue;taint;df-generated |
| System;MemoryExtensions;false;EnumerateRunes;(System.ReadOnlySpan<System.Char>);;Argument[0];ReturnValue;taint;df-generated | | System;MemoryExtensions;false;EnumerateRunes;(System.ReadOnlySpan<System.Char>);;Argument[0];ReturnValue;taint;df-generated |
| System;MemoryExtensions;false;Replace<T>;(System.ReadOnlySpan<T>,System.Span<T>,T,T);;Argument[0].Element;Argument[1].Element;value;manual |
| System;MemoryExtensions;false;Replace<T>;(System.ReadOnlySpan<T>,System.Span<T>,T,T);;Argument[3];Argument[1].Element;value;manual |
| System;MemoryExtensions;false;Replace<T>;(System.Span<T>,T,T);;Argument[2];Argument[0].Element;value;manual |
| System;MemoryExtensions;false;Sort<T>;(System.Span<T>,System.Comparison<T>);;Argument[1];Argument[1].Parameter[delegate-self];value;hq-generated | | System;MemoryExtensions;false;Sort<T>;(System.Span<T>,System.Comparison<T>);;Argument[1];Argument[1].Parameter[delegate-self];value;hq-generated |
| System;MemoryExtensions;false;Sort<TKey,TValue>;(System.Span<TKey>,System.Span<TValue>,System.Comparison<TKey>);;Argument[2];Argument[2].Parameter[delegate-self];value;hq-generated | | System;MemoryExtensions;false;Sort<TKey,TValue>;(System.Span<TKey>,System.Span<TValue>,System.Comparison<TKey>);;Argument[2];Argument[2].Parameter[delegate-self];value;hq-generated |
| System;MemoryExtensions;false;Trim;(System.Memory<System.Char>);;Argument[0];ReturnValue;taint;df-generated | | System;MemoryExtensions;false;Trim;(System.Memory<System.Char>);;Argument[0];ReturnValue;taint;df-generated |
@@ -15338,7 +15343,17 @@ summary
| System;ReadOnlyMemory<T>;false;Slice;(System.Int32);;Argument[this];ReturnValue;taint;df-generated | | System;ReadOnlyMemory<T>;false;Slice;(System.Int32);;Argument[this];ReturnValue;taint;df-generated |
| System;ReadOnlyMemory<T>;false;Slice;(System.Int32,System.Int32);;Argument[this];ReturnValue;taint;df-generated | | System;ReadOnlyMemory<T>;false;Slice;(System.Int32,System.Int32);;Argument[this];ReturnValue;taint;df-generated |
| System;ReadOnlyMemory<T>;false;ToString;();;Argument[this];ReturnValue;taint;df-generated | | System;ReadOnlyMemory<T>;false;ToString;();;Argument[this];ReturnValue;taint;df-generated |
| System;ReadOnlySpan<T>;false;CopyTo;(System.Span<T>);;Argument[this].Element;Argument[0].Element;value;manual |
| System;ReadOnlySpan<T>;false;GetEnumerator;();;Argument[this];ReturnValue;taint;df-generated | | System;ReadOnlySpan<T>;false;GetEnumerator;();;Argument[this];ReturnValue;taint;df-generated |
| System;ReadOnlySpan<T>;false;GetPinnableReference;();;Argument[this].Element;ReturnValue;value;manual |
| System;ReadOnlySpan<T>;false;ReadOnlySpan;(T);;Argument[0];Argument[this].Element;value;manual |
| System;ReadOnlySpan<T>;false;ReadOnlySpan;(T[]);;Argument[0].Element;Argument[this].Element;value;manual |
| System;ReadOnlySpan<T>;false;ReadOnlySpan;(T[],System.Int32,System.Int32);;Argument[0].Element;Argument[this].Element;value;manual |
| System;ReadOnlySpan<T>;false;Slice;(System.Int32);;Argument[this].Element;ReturnValue.Element;value;manual |
| System;ReadOnlySpan<T>;false;Slice;(System.Int32,System.Int32);;Argument[this].Element;ReturnValue.Element;value;manual |
| System;ReadOnlySpan<T>;false;ToArray;();;Argument[this].Element;ReturnValue.Element;value;manual |
| System;ReadOnlySpan<T>;false;TryCopyTo;(System.Span<T>);;Argument[this].Element;Argument[0].Element;value;manual |
| System;ReadOnlySpan<T>;false;get_Item;(System.Int32);;Argument[this].Element;ReturnValue;value;manual |
| System;ResolveEventHandler;false;BeginInvoke;(System.Object,System.ResolveEventArgs,System.AsyncCallback,System.Object);;Argument[2];Argument[2].Parameter[delegate-self];value;hq-generated | | System;ResolveEventHandler;false;BeginInvoke;(System.Object,System.ResolveEventArgs,System.AsyncCallback,System.Object);;Argument[2];Argument[2].Parameter[delegate-self];value;hq-generated |
| System;RuntimeFieldHandle;false;FromIntPtr;(System.IntPtr);;Argument[0];ReturnValue;taint;df-generated | | System;RuntimeFieldHandle;false;FromIntPtr;(System.IntPtr);;Argument[0];ReturnValue;taint;df-generated |
| System;RuntimeFieldHandle;false;ToIntPtr;(System.RuntimeFieldHandle);;Argument[0];ReturnValue;taint;df-generated | | System;RuntimeFieldHandle;false;ToIntPtr;(System.RuntimeFieldHandle);;Argument[0];ReturnValue;taint;df-generated |
@@ -15354,7 +15369,19 @@ summary
| System;Single;false;ToString;(System.IFormatProvider);;Argument[0];ReturnValue;taint;df-generated | | System;Single;false;ToString;(System.IFormatProvider);;Argument[0];ReturnValue;taint;df-generated |
| System;Single;false;ToString;(System.String,System.IFormatProvider);;Argument[1];ReturnValue;taint;df-generated | | System;Single;false;ToString;(System.String,System.IFormatProvider);;Argument[1];ReturnValue;taint;df-generated |
| System;Single;false;ToType;(System.Type,System.IFormatProvider);;Argument[1];ReturnValue;taint;df-generated | | System;Single;false;ToType;(System.Type,System.IFormatProvider);;Argument[1];ReturnValue;taint;df-generated |
| System;Span<T>;false;Clear;();;Argument[this].WithoutElement;Argument[this];value;manual |
| System;Span<T>;false;CopyTo;(System.Span<T>);;Argument[this].Element;Argument[0].Element;value;manual |
| System;Span<T>;false;Fill;(T);;Argument[0];Argument[this].Element;value;manual |
| System;Span<T>;false;GetEnumerator;();;Argument[this];ReturnValue;taint;df-generated | | System;Span<T>;false;GetEnumerator;();;Argument[this];ReturnValue;taint;df-generated |
| System;Span<T>;false;GetPinnableReference;();;Argument[this].Element;ReturnValue;value;manual |
| System;Span<T>;false;Slice;(System.Int32);;Argument[this].Element;ReturnValue.Element;value;manual |
| System;Span<T>;false;Slice;(System.Int32,System.Int32);;Argument[this].Element;ReturnValue.Element;value;manual |
| System;Span<T>;false;Span;(T);;Argument[0];Argument[this].Element;value;manual |
| System;Span<T>;false;Span;(T[]);;Argument[0].Element;Argument[this].Element;value;manual |
| System;Span<T>;false;Span;(T[],System.Int32,System.Int32);;Argument[0].Element;Argument[this].Element;value;manual |
| System;Span<T>;false;ToArray;();;Argument[this].Element;ReturnValue.Element;value;manual |
| System;Span<T>;false;TryCopyTo;(System.Span<T>);;Argument[this].Element;Argument[0].Element;value;manual |
| System;Span<T>;false;get_Item;(System.Int32);;Argument[this].Element;ReturnValue;value;manual |
| System;String;false;Clone;();;Argument[this];ReturnValue;value;manual | | System;String;false;Clone;();;Argument[this];ReturnValue;value;manual |
| System;String;false;Concat;(System.Collections.Generic.IEnumerable<System.String>);;Argument[0].Element;ReturnValue;taint;manual | | System;String;false;Concat;(System.Collections.Generic.IEnumerable<System.String>);;Argument[0].Element;ReturnValue;taint;manual |
| System;String;false;Concat;(System.Object);;Argument[0];ReturnValue;taint;manual | | System;String;false;Concat;(System.Object);;Argument[0];ReturnValue;taint;manual |

View File

@@ -6,6 +6,9 @@ pull_request_triggers:
- "**/glide.yaml" - "**/glide.yaml"
- "**/Gopkg.toml" - "**/Gopkg.toml"
column_kind: "utf8" column_kind: "utf8"
build_modes:
- autobuild
- manual
github_api_languages: github_api_languages:
- Go - Go
scc_languages: scc_languages:

View File

@@ -3,6 +3,6 @@ module github.com/github/codeql-go/extractor
go 1.21 go 1.21
require ( require (
golang.org/x/mod v0.14.0 golang.org/x/mod v0.15.0
golang.org/x/tools v0.17.0 golang.org/x/tools v0.17.0
) )

View File

@@ -1,5 +1,5 @@
golang.org/x/mod v0.14.0 h1:dGoOF9QVLYng8IHTm7BAyWqCqSheQ5pYWGhzW00YJr0= golang.org/x/mod v0.15.0 h1:SernR4v+D55NyBH2QiEQrlBAnj1ECL6AGrA5+dPaMY8=
golang.org/x/mod v0.14.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= golang.org/x/mod v0.15.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c=
golang.org/x/sync v0.6.0 h1:5BMeUDZ7vkXGfEr1x9B4bRcTH4lpkTkpdh0T/J+qjbQ= golang.org/x/sync v0.6.0 h1:5BMeUDZ7vkXGfEr1x9B4bRcTH4lpkTkpdh0T/J+qjbQ=
golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
golang.org/x/tools v0.17.0 h1:FvmRgNOcs3kOa+T20R1uhfP9F6HgG2mfxDv1vrx1Htc= golang.org/x/tools v0.17.0 h1:FvmRgNOcs3kOa+T20R1uhfP9F6HgG2mfxDv1vrx1Htc=

View File

@@ -1,4 +1,4 @@
# golang.org/x/mod v0.14.0 # golang.org/x/mod v0.15.0
## explicit; go 1.18 ## explicit; go 1.18
golang.org/x/mod/internal/lazyregexp golang.org/x/mod/internal/lazyregexp
golang.org/x/mod/modfile golang.org/x/mod/modfile

View File

@@ -77,7 +77,7 @@ jakarta.xml.bind.attachment,,2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,2,,
java.awt,1,,3,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1,,,,,,,,,,3 java.awt,1,,3,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1,,,,,,,,,,3
java.beans,,,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1, java.beans,,,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1,
java.io,50,1,46,,,,,,,,,22,,,,,,,,,,,,,,,28,,,,,,,,,,,,,,,,,,,,,1,,44,2 java.io,50,1,46,,,,,,,,,22,,,,,,,,,,,,,,,28,,,,,,,,,,,,,,,,,,,,,1,,44,2
java.lang,33,3,103,,13,,,,,,1,,,,,,,,,,,,8,,,,6,,,4,,,1,,,,,,,,,,,,,,3,,,60,43 java.lang,33,3,101,,13,,,,,,1,,,,,,,,,,,,8,,,,6,,,4,,,1,,,,,,,,,,,,,,3,,,58,43
java.net,21,3,23,,,,1,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,19,,,,,,,,,,,,,3,23, java.net,21,3,23,,,,1,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,19,,,,,,,,,,,,,3,23,
java.nio,49,,36,,,,,,,,,5,,,,,,,,,,,,,,,43,,,,,,,,,1,,,,,,,,,,,,,,36, java.nio,49,,36,,,,,,,,,5,,,,,,,,,,,,,,,43,,,,,,,,,1,,,,,,,,,,,,,,36,
java.security,21,,,,,11,10,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, java.security,21,,,,,11,10,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
1 package sink source summary sink:bean-validation sink:command-injection sink:credentials-key sink:credentials-password sink:credentials-username sink:encryption-iv sink:encryption-salt sink:environment-injection sink:file-content-store sink:fragment-injection sink:groovy-injection sink:hostname-verification sink:html-injection sink:information-leak sink:intent-redirection sink:jexl-injection sink:jndi-injection sink:js-injection sink:ldap-injection sink:log-injection sink:mvel-injection sink:notification sink:ognl-injection sink:path-injection sink:pending-intents sink:regex-use sink:regex-use[-1] sink:regex-use[0] sink:regex-use[] sink:regex-use[f-1] sink:regex-use[f1] sink:regex-use[f] sink:request-forgery sink:response-splitting sink:sql-injection sink:template-injection sink:trust-boundary-violation sink:url-redirection sink:xpath-injection sink:xslt-injection source:android-external-storage-dir source:contentprovider source:database source:environment source:file source:remote summary:taint summary:value
77 java.awt 1 3 1 3
78 java.beans 1 1
79 java.io 50 1 46 22 28 1 44 2
80 java.lang 33 3 103 101 13 1 8 6 4 1 3 60 58 43
81 java.net 21 3 23 1 1 19 3 23
82 java.nio 49 36 5 43 1 36
83 java.security 21 11 10

View File

@@ -18,10 +18,10 @@ Java framework & library support
`Google Guava <https://guava.dev/>`_,``com.google.common.*``,,730,43,9,,,,, `Google Guava <https://guava.dev/>`_,``com.google.common.*``,,730,43,9,,,,,
JBoss Logging,``org.jboss.logging``,,,324,,,,,, JBoss Logging,``org.jboss.logging``,,,324,,,,,,
`JSON-java <https://github.com/stleary/JSON-java>`_,``org.json``,,236,,,,,,, `JSON-java <https://github.com/stleary/JSON-java>`_,``org.json``,,236,,,,,,,
Java Standard Library,``java.*``,10,733,237,79,,9,,,24 Java Standard Library,``java.*``,10,731,237,79,,9,,,24
Java extensions,"``javax.*``, ``jakarta.*``",67,688,80,5,4,2,1,1,4 Java extensions,"``javax.*``, ``jakarta.*``",67,688,80,5,4,2,1,1,4
Kotlin Standard Library,``kotlin*``,,1849,16,14,,,,,2 Kotlin Standard Library,``kotlin*``,,1849,16,14,,,,,2
`Spring <https://spring.io/>`_,``org.springframework.*``,38,481,118,5,,28,14,,35 `Spring <https://spring.io/>`_,``org.springframework.*``,38,481,118,5,,28,14,,35
Others,"``actions.osgi``, ``antlr``, ``ch.ethz.ssh2``, ``cn.hutool.core.codec``, ``com.alibaba.druid.sql``, ``com.alibaba.fastjson2``, ``com.amazonaws.auth``, ``com.auth0.jwt.algorithms``, ``com.azure.identity``, ``com.esotericsoftware.kryo.io``, ``com.esotericsoftware.kryo5.io``, ``com.fasterxml.jackson.core``, ``com.fasterxml.jackson.databind``, ``com.google.gson``, ``com.hubspot.jinjava``, ``com.jcraft.jsch``, ``com.microsoft.sqlserver.jdbc``, ``com.mitchellbosecke.pebble``, ``com.mongodb``, ``com.opensymphony.xwork2``, ``com.rabbitmq.client``, ``com.sshtools.j2ssh.authentication``, ``com.sun.crypto.provider``, ``com.sun.jndi.ldap``, ``com.sun.net.httpserver``, ``com.sun.net.ssl``, ``com.sun.rowset``, ``com.sun.security.auth.module``, ``com.sun.security.ntlm``, ``com.sun.security.sasl.digest``, ``com.thoughtworks.xstream``, ``com.trilead.ssh2``, ``com.unboundid.ldap.sdk``, ``com.zaxxer.hikari``, ``flexjson``, ``freemarker.cache``, ``freemarker.template``, ``groovy.lang``, ``groovy.text``, ``groovy.util``, ``hudson``, ``io.jsonwebtoken``, ``io.netty.bootstrap``, ``io.netty.buffer``, ``io.netty.channel``, ``io.netty.handler.codec``, ``io.netty.handler.ssl``, ``io.netty.handler.stream``, ``io.netty.resolver``, ``io.netty.util``, ``javafx.scene.web``, ``jenkins``, ``jodd.json``, ``liquibase.database.jvm``, ``liquibase.statement.core``, ``net.schmizz.sshj``, ``net.sf.json``, ``net.sf.saxon.s9api``, ``ognl``, ``okhttp3``, ``org.acegisecurity``, ``org.antlr.runtime``, ``org.apache.commons.codec``, ``org.apache.commons.compress.archivers.tar``, ``org.apache.commons.exec``, ``org.apache.commons.httpclient.util``, ``org.apache.commons.jelly``, ``org.apache.commons.jexl2``, ``org.apache.commons.jexl3``, ``org.apache.commons.lang``, ``org.apache.commons.logging``, ``org.apache.commons.net``, ``org.apache.commons.ognl``, ``org.apache.cxf.catalog``, ``org.apache.cxf.common.classloader``, ``org.apache.cxf.common.jaxb``, ``org.apache.cxf.common.logging``, ``org.apache.cxf.configuration.jsse``, ``org.apache.cxf.helpers``, ``org.apache.cxf.resource``, ``org.apache.cxf.staxutils``, ``org.apache.cxf.tools.corba.utils``, ``org.apache.cxf.tools.util``, ``org.apache.cxf.transform``, ``org.apache.directory.ldap.client.api``, ``org.apache.hadoop.fs``, ``org.apache.hadoop.hive.metastore``, ``org.apache.hadoop.hive.ql.exec``, ``org.apache.hadoop.hive.ql.metadata``, ``org.apache.hc.client5.http.async.methods``, ``org.apache.hc.client5.http.classic.methods``, ``org.apache.hc.client5.http.fluent``, ``org.apache.hive.hcatalog.templeton``, ``org.apache.ibatis.jdbc``, ``org.apache.ibatis.mapping``, ``org.apache.log4j``, ``org.apache.shiro.codec``, ``org.apache.shiro.jndi``, ``org.apache.shiro.mgt``, ``org.apache.sshd.client.session``, ``org.apache.struts.beanvalidation.validation.interceptor``, ``org.apache.struts2``, ``org.apache.tools.ant``, ``org.apache.tools.zip``, ``org.apache.velocity.app``, ``org.apache.velocity.runtime``, ``org.codehaus.cargo.container.installer``, ``org.codehaus.groovy.control``, ``org.dom4j``, ``org.eclipse.jetty.client``, ``org.fusesource.leveldbjni``, ``org.geogebra.web.full.main``, ``org.gradle.api.file``, ``org.hibernate``, ``org.influxdb``, ``org.jdbi.v3.core``, ``org.jenkins.ui.icon``, ``org.jenkins.ui.symbol``, ``org.jooq``, ``org.keycloak.models.map.storage``, ``org.kohsuke.stapler``, ``org.mvel2``, ``org.openjdk.jmh.runner.options``, ``org.owasp.esapi``, ``org.pac4j.jwt.config.encryption``, ``org.pac4j.jwt.config.signature``, ``org.scijava.log``, ``org.slf4j``, ``org.thymeleaf``, ``org.xml.sax``, ``org.xmlpull.v1``, ``org.yaml.snakeyaml``, ``play.libs.ws``, ``play.mvc``, ``ratpack.core.form``, ``ratpack.core.handling``, ``ratpack.core.http``, ``ratpack.exec``, ``ratpack.form``, ``ratpack.func``, ``ratpack.handling``, ``ratpack.http``, ``ratpack.util``, ``retrofit2``, ``sun.jvmstat.perfdata.monitor.protocol.local``, ``sun.jvmstat.perfdata.monitor.protocol.rmi``, ``sun.misc``, ``sun.net.ftp``, ``sun.net.www.protocol.http``, ``sun.security.acl``, ``sun.security.jgss.krb5``, ``sun.security.krb5``, ``sun.security.pkcs``, ``sun.security.pkcs11``, ``sun.security.provider``, ``sun.security.ssl``, ``sun.security.x509``, ``sun.tools.jconsole``",131,10516,889,121,6,22,18,,208 Others,"``actions.osgi``, ``antlr``, ``ch.ethz.ssh2``, ``cn.hutool.core.codec``, ``com.alibaba.druid.sql``, ``com.alibaba.fastjson2``, ``com.amazonaws.auth``, ``com.auth0.jwt.algorithms``, ``com.azure.identity``, ``com.esotericsoftware.kryo.io``, ``com.esotericsoftware.kryo5.io``, ``com.fasterxml.jackson.core``, ``com.fasterxml.jackson.databind``, ``com.google.gson``, ``com.hubspot.jinjava``, ``com.jcraft.jsch``, ``com.microsoft.sqlserver.jdbc``, ``com.mitchellbosecke.pebble``, ``com.mongodb``, ``com.opensymphony.xwork2``, ``com.rabbitmq.client``, ``com.sshtools.j2ssh.authentication``, ``com.sun.crypto.provider``, ``com.sun.jndi.ldap``, ``com.sun.net.httpserver``, ``com.sun.net.ssl``, ``com.sun.rowset``, ``com.sun.security.auth.module``, ``com.sun.security.ntlm``, ``com.sun.security.sasl.digest``, ``com.thoughtworks.xstream``, ``com.trilead.ssh2``, ``com.unboundid.ldap.sdk``, ``com.zaxxer.hikari``, ``flexjson``, ``freemarker.cache``, ``freemarker.template``, ``groovy.lang``, ``groovy.text``, ``groovy.util``, ``hudson``, ``io.jsonwebtoken``, ``io.netty.bootstrap``, ``io.netty.buffer``, ``io.netty.channel``, ``io.netty.handler.codec``, ``io.netty.handler.ssl``, ``io.netty.handler.stream``, ``io.netty.resolver``, ``io.netty.util``, ``javafx.scene.web``, ``jenkins``, ``jodd.json``, ``liquibase.database.jvm``, ``liquibase.statement.core``, ``net.schmizz.sshj``, ``net.sf.json``, ``net.sf.saxon.s9api``, ``ognl``, ``okhttp3``, ``org.acegisecurity``, ``org.antlr.runtime``, ``org.apache.commons.codec``, ``org.apache.commons.compress.archivers.tar``, ``org.apache.commons.exec``, ``org.apache.commons.httpclient.util``, ``org.apache.commons.jelly``, ``org.apache.commons.jexl2``, ``org.apache.commons.jexl3``, ``org.apache.commons.lang``, ``org.apache.commons.logging``, ``org.apache.commons.net``, ``org.apache.commons.ognl``, ``org.apache.cxf.catalog``, ``org.apache.cxf.common.classloader``, ``org.apache.cxf.common.jaxb``, ``org.apache.cxf.common.logging``, ``org.apache.cxf.configuration.jsse``, ``org.apache.cxf.helpers``, ``org.apache.cxf.resource``, ``org.apache.cxf.staxutils``, ``org.apache.cxf.tools.corba.utils``, ``org.apache.cxf.tools.util``, ``org.apache.cxf.transform``, ``org.apache.directory.ldap.client.api``, ``org.apache.hadoop.fs``, ``org.apache.hadoop.hive.metastore``, ``org.apache.hadoop.hive.ql.exec``, ``org.apache.hadoop.hive.ql.metadata``, ``org.apache.hc.client5.http.async.methods``, ``org.apache.hc.client5.http.classic.methods``, ``org.apache.hc.client5.http.fluent``, ``org.apache.hive.hcatalog.templeton``, ``org.apache.ibatis.jdbc``, ``org.apache.ibatis.mapping``, ``org.apache.log4j``, ``org.apache.shiro.codec``, ``org.apache.shiro.jndi``, ``org.apache.shiro.mgt``, ``org.apache.sshd.client.session``, ``org.apache.struts.beanvalidation.validation.interceptor``, ``org.apache.struts2``, ``org.apache.tools.ant``, ``org.apache.tools.zip``, ``org.apache.velocity.app``, ``org.apache.velocity.runtime``, ``org.codehaus.cargo.container.installer``, ``org.codehaus.groovy.control``, ``org.dom4j``, ``org.eclipse.jetty.client``, ``org.fusesource.leveldbjni``, ``org.geogebra.web.full.main``, ``org.gradle.api.file``, ``org.hibernate``, ``org.influxdb``, ``org.jdbi.v3.core``, ``org.jenkins.ui.icon``, ``org.jenkins.ui.symbol``, ``org.jooq``, ``org.keycloak.models.map.storage``, ``org.kohsuke.stapler``, ``org.mvel2``, ``org.openjdk.jmh.runner.options``, ``org.owasp.esapi``, ``org.pac4j.jwt.config.encryption``, ``org.pac4j.jwt.config.signature``, ``org.scijava.log``, ``org.slf4j``, ``org.thymeleaf``, ``org.xml.sax``, ``org.xmlpull.v1``, ``org.yaml.snakeyaml``, ``play.libs.ws``, ``play.mvc``, ``ratpack.core.form``, ``ratpack.core.handling``, ``ratpack.core.http``, ``ratpack.exec``, ``ratpack.form``, ``ratpack.func``, ``ratpack.handling``, ``ratpack.http``, ``ratpack.util``, ``retrofit2``, ``sun.jvmstat.perfdata.monitor.protocol.local``, ``sun.jvmstat.perfdata.monitor.protocol.rmi``, ``sun.misc``, ``sun.net.ftp``, ``sun.net.www.protocol.http``, ``sun.security.acl``, ``sun.security.jgss.krb5``, ``sun.security.krb5``, ``sun.security.pkcs``, ``sun.security.pkcs11``, ``sun.security.provider``, ``sun.security.ssl``, ``sun.security.x509``, ``sun.tools.jconsole``",131,10516,889,121,6,22,18,,208
Totals,,308,18947,2551,331,16,128,33,1,407 Totals,,308,18945,2551,331,16,128,33,1,407

View File

@@ -0,0 +1,65 @@
/** Provides classes and predicates for working with Android layouts and UI elements. */
import java
import semmle.code.xml.AndroidManifest
private import semmle.code.java.dataflow.DataFlow
/** An Android Layout XML file. */
class AndroidLayoutXmlFile extends XmlFile {
AndroidLayoutXmlFile() { this.getRelativePath().matches("%/res/layout/%.xml") }
}
/** A component declared in an Android layout file. */
class AndroidLayoutXmlElement extends XmlElement {
AndroidLayoutXmlElement() { this.getFile() instanceof AndroidLayoutXmlFile }
/** Gets the ID of this component, if any. */
string getId() { result = this.getAttribute("id").getValue() }
/** Gets the class of this component. */
Class getClass() {
this.getName() = "view" and
this.getAttribute("class").getValue() = result.getQualifiedName()
or
this.getName() = result.getQualifiedName()
or
result.hasQualifiedName(["android.widget", "android.view"], this.getName())
}
}
/** An XML element that represents an editable text field. */
class AndroidEditableXmlElement extends AndroidLayoutXmlElement {
AndroidEditableXmlElement() {
this.getClass().getASourceSupertype*().hasQualifiedName("android.widget", "EditText")
}
/** Gets the input type of this field, if any. */
string getInputType() { result = this.getAttribute("inputType").(AndroidXmlAttribute).getValue() }
}
/** A `findViewById` or `requireViewById` method on `Activity` or `View`. */
private class FindViewMethod extends Method {
FindViewMethod() {
exists(Method m | this.getAnOverride*() = m |
m.hasQualifiedName("android.app", "Activity", ["findViewById", "requireViewById"])
or
m.hasQualifiedName("android.view", "View", ["findViewById", "requireViewById"])
or
m.hasQualifiedName("android.app", "Dialog", ["findViewById", "requireViewById"])
)
}
}
/** Gets a use of the view that has the given id. (that is, from a call to a method like `findViewById`) */
MethodCall getAUseOfViewWithId(string id) {
exists(string name, NestedClass r_id, Field id_field |
id = ["@+id/", "@id/"] + name and
result.getMethod() instanceof FindViewMethod and
r_id.getEnclosingType().hasName("R") and
r_id.hasName("id") and
id_field.getDeclaringType() = r_id and
id_field.hasName(name)
|
DataFlow::localExprFlow(id_field.getAnAccess(), result.getArgument(0))
)
}

View File

@@ -3,71 +3,7 @@
import java import java
import semmle.code.java.dataflow.DataFlow import semmle.code.java.dataflow.DataFlow
import semmle.code.java.security.SensitiveActions import semmle.code.java.security.SensitiveActions
import semmle.code.xml.AndroidManifest import semmle.code.java.frameworks.android.Layout
/** An Android Layout XML file. */
private class AndroidLayoutXmlFile extends XmlFile {
AndroidLayoutXmlFile() { this.getRelativePath().matches("%/res/layout/%.xml") }
}
/** A component declared in an Android layout file. */
class AndroidLayoutXmlElement extends XmlElement {
AndroidXmlAttribute id;
AndroidLayoutXmlElement() {
this.getFile() instanceof AndroidLayoutXmlFile and
id = this.getAttribute("id")
}
/** Gets the ID of this component. */
string getId() { result = id.getValue() }
/** Gets the class of this component. */
Class getClass() {
this.getName() = "view" and
this.getAttribute("class").getValue() = result.getQualifiedName()
or
this.getName() = result.getQualifiedName()
or
result.hasQualifiedName(["android.widget", "android.view"], this.getName())
}
}
/** An XML element that represents an editable text field. */
class AndroidEditableXmlElement extends AndroidLayoutXmlElement {
AndroidEditableXmlElement() {
this.getClass().getASourceSupertype*().hasQualifiedName("android.widget", "EditText")
}
/** Gets the input type of this field, if any. */
string getInputType() { result = this.getAttribute("inputType").(AndroidXmlAttribute).getValue() }
}
/** A `findViewById` or `requireViewById` method on `Activity` or `View`. */
private class FindViewMethod extends Method {
FindViewMethod() {
this.hasQualifiedName("android.view", "View", ["findViewById", "requireViewById"])
or
exists(Method m |
m.hasQualifiedName("android.app", "Activity", ["findViewById", "requireViewById"]) and
this = m.getAnOverride*()
)
}
}
/** Gets a use of the view that has the given id. */
private MethodCall getAUseOfViewWithId(string id) {
exists(string name, NestedClass r_id, Field id_field |
id = "@+id/" + name and
result.getMethod() instanceof FindViewMethod and
r_id.getEnclosingType().hasName("R") and
r_id.hasName("id") and
id_field.getDeclaringType() = r_id and
id_field.hasName(name)
|
DataFlow::localExprFlow(id_field.getAnAccess(), result.getArgument(0))
)
}
/** Gets the argument of a use of `setInputType` called on the view with the given id. */ /** Gets the argument of a use of `setInputType` called on the view with the given id. */
private Argument setInputTypeForId(string id) { private Argument setInputTypeForId(string id) {

View File

@@ -4,6 +4,8 @@ import java
private import semmle.code.java.dataflow.ExternalFlow private import semmle.code.java.dataflow.ExternalFlow
private import semmle.code.java.dataflow.TaintTracking private import semmle.code.java.dataflow.TaintTracking
private import semmle.code.java.security.SensitiveActions private import semmle.code.java.security.SensitiveActions
private import semmle.code.java.frameworks.android.Layout
private import semmle.code.java.security.Sanitizers
/** A configuration for tracking sensitive information to system notifications. */ /** A configuration for tracking sensitive information to system notifications. */
private module NotificationTrackingConfig implements DataFlow::ConfigSig { private module NotificationTrackingConfig implements DataFlow::ConfigSig {
@@ -20,3 +22,94 @@ private module NotificationTrackingConfig implements DataFlow::ConfigSig {
/** Taint tracking flow for sensitive data flowing to system notifications. */ /** Taint tracking flow for sensitive data flowing to system notifications. */
module NotificationTracking = TaintTracking::Global<NotificationTrackingConfig>; module NotificationTracking = TaintTracking::Global<NotificationTrackingConfig>;
/** A call to a method that sets the text of a `TextView`. */
private class SetTextCall extends MethodCall {
SetTextCall() {
this.getMethod()
.getAnOverride*()
.hasQualifiedName("android.widget", "TextView", ["append", "setText", "setHint"]) and
(
this.getMethod()
.getParameter(0)
.getType()
.(RefType)
.hasQualifiedName("java.lang", "CharSequence")
or
this.getMethod().getParameter(0).getType().(Array).getElementType() instanceof CharacterType
)
}
/** Gets the string argument of this call. */
Expr getStringArgument() { result = this.getArgument(0) }
}
/** A call to a method indicating that the contents of a UI element are safely masked. */
private class MaskCall extends MethodCall {
MaskCall() {
this.getMethod().getAnOverride*().hasQualifiedName("android.widget", "TextView", "setInputType")
or
this.getMethod().getAnOverride*().hasQualifiedName("android.view", "View", "setVisibility")
}
}
/** A configuration for tracking sensitive information to text fields. */
private module TextFieldTrackingConfig implements DataFlow::ConfigSig {
predicate isSource(DataFlow::Node src) { src.asExpr() instanceof SensitiveExpr }
predicate isSink(DataFlow::Node sink) {
exists(SetTextCall call |
sink.asExpr() = call.getStringArgument() and
not setTextCallIsMasked(call)
)
}
predicate isBarrier(DataFlow::Node node) { node instanceof SimpleTypeSanitizer }
predicate isBarrierIn(DataFlow::Node node) { isSource(node) }
}
/** A local flow step that also flows through access to fields containing `View`s */
private predicate localViewFieldFlowStep(DataFlow::Node node1, DataFlow::Node node2) {
DataFlow::localFlowStep(node1, node2)
or
exists(Field f |
f.getType().(Class).getASupertype*().hasQualifiedName("android.view", "View") and
node1.asExpr() = f.getAnAccess().(FieldWrite).getASource() and
node2.asExpr() = f.getAnAccess().(FieldRead)
)
}
/** Holds if data can flow from `node1` to `node2` with local flow steps as well as flow through fields containing `View`s */
private predicate localViewFieldFlow(DataFlow::Node node1, DataFlow::Node node2) {
localViewFieldFlowStep*(node1, node2)
}
/** Holds if data can flow from `e1` to `e2` with local flow steps as well as flow through fields containing `View`s */
private predicate localViewFieldExprFlow(Expr e1, Expr e2) {
localViewFieldFlow(DataFlow::exprNode(e1), DataFlow::exprNode(e2))
}
/** Holds if the given view may be properly masked. */
private predicate viewIsMasked(AndroidLayoutXmlElement view) {
localViewFieldExprFlow(getAUseOfViewWithId(view.getId()), any(MaskCall mcall).getQualifier())
or
view.getAttribute("inputType")
.(AndroidXmlAttribute)
.getValue()
.regexpMatch("(?i).*(text|number)(web)?password.*")
or
view.getAttribute("visibility").(AndroidXmlAttribute).getValue().toLowerCase() =
["invisible", "gone"]
}
/** Holds if the qualifier of `call` may be properly masked. */
private predicate setTextCallIsMasked(SetTextCall call) {
exists(AndroidLayoutXmlElement view |
localViewFieldExprFlow(getAUseOfViewWithId(view.getId()), call.getQualifier()) and
viewIsMasked(view.getParent*())
)
}
/** Taint tracking flow for sensitive data flowing to text fields. */
module TextFieldTracking = TaintTracking::Global<TextFieldTrackingConfig>;

View File

@@ -13,7 +13,7 @@ code execution.</p>
<recommendation> <recommendation>
<p>The general recommendation is to avoid passing untrusted data to the <code>InitialContext.lookup <p>The general recommendation is to avoid passing untrusted data to the <code>InitialContext.lookup
</code> method. If the name being used to look up the object must be provided by the user, make </code> method. If the name being used to look up the object must be provided by the user, make
sure that it's not in the form of an absolute URL or that it's the URL pointing to a trused server. sure that it's not in the form of an absolute URL or that it's the URL pointing to a trusted server.
</p> </p>
</recommendation> </recommendation>

View File

@@ -0,0 +1,2 @@
TextView pwView = getViewById(R.id.pw_text);
pwView.setText("Your password is: " + password);

View File

@@ -0,0 +1,38 @@
<!DOCTYPE qhelp PUBLIC
"-//Semmle//qhelp//EN"
"qhelp.dtd">
<qhelp>
<overview>
<p>
Sensitive information such as passwords should not be displayed in UI components unless explicitly required, to mitigate shoulder-surfing attacks.
</p>
</overview>
<recommendation>
<p>
For editable text fields containing sensitive information, the <code>inputType</code> should be set to <code>textPassword</code> or similar to ensure it is properly masked.
Otherwise, sensitive data that must be displayed should be hidden by default, and only revealed based on an explicit user action.
</p>
</recommendation>
<example>
<p>
In the following (bad) case, sensitive information in <code>password</code> is exposed to the <code>TextView</code>.
</p>
<sample src="AndroidSensitiveTextBad.java"/>
<p>
In the following (good) case, the user must press a button to reveal sensitive information.
</p>
<sample src="AndroidSensitiveTextGood.java"/>
</example>
<references>
<li>
OWASP Mobile Application Security: <a href="https://mas.owasp.org/MASTG/Android/0x05d-Testing-Data-Storage/#ui-components">Android Data Storage - UI Components</a>
</li>
</references>
</qhelp>

View File

@@ -0,0 +1,20 @@
/**
* @name Exposure of sensitive information to UI text views.
* @id java/android/sensitive-text
* @kind path-problem
* @description Sensitive information displayed in UI text views should be properly masked.
* @problem.severity warning
* @precision medium
* @security-severity 6.5
* @tags security
* external/cwe/cwe-200
*/
import java
import java
import semmle.code.java.security.SensitiveUiQuery
import TextFieldTracking::PathGraph
from TextFieldTracking::PathNode source, TextFieldTracking::PathNode sink
where TextFieldTracking::flowPath(source, sink)
select sink, source, sink, "This $@ is exposed in a text view.", source, "sensitive information"

View File

@@ -0,0 +1,10 @@
TextView pwView = findViewById(R.id.pw_text);
pwView.setVisibility(View.INVISIBLE);
pwView.setText("Your password is: " + password);
Button showButton = findViewById(R.id.show_pw_button);
showButton.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
pwView.setVisibility(View.VISIBLE);
}
});

View File

@@ -0,0 +1,4 @@
---
category: newQuery
---
* Added a new query `java/android/sensitive-text` to detect instances of sensitive data being exposed through text fields without being properly masked.

View File

@@ -0,0 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
package="com.example.test">
</manifest>

View File

@@ -0,0 +1,24 @@
package com.example.test;
public final class R {
public static final class id {
public static final int test1 = 1;
public static final int test2 = 2;
public static final int test3 = 3;
public static final int test4 = 4;
public static final int test5 = 5;
public static final int test6 = 6;
public static final int test7 = 7;
public static final int test8 = 8;
public static final int test9 = 9;
public static final int test10 = 10;
public static final int test11 = 11;
public static final int test12 = 12;
public static final int test13 = 13;
public static final int test14 = 14;
}
public static final class string {
public static final int password_prompt = 0;
}
}

View File

@@ -0,0 +1,77 @@
package com.example.test;
import android.app.Activity;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.LinearLayout;
import android.view.View;
import android.text.InputType;
class Test extends Activity {
void test(String password) {
EditText test1 = findViewById(R.id.test1);
// BAD: Exposing sensitive data to text view
test1.setText(password); // $sensitive-text
test1.setHint(password); // $sensitive-text
test1.append(password); // $sensitive-text
// GOOD: resource constant is not sensitive info
test1.setText(R.string.password_prompt);
// GOOD: Visibility is dynamically set
TextView test2 = findViewById(R.id.test2);
test2.setVisibility(View.INVISIBLE);
test2.setText(password);
// GOOD: Input type is dynamically set
EditText test3 = findViewById(R.id.test3);
test3.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PASSWORD);
test3.setText(password);
// GOOD: Visibility of parent is dynamically set
LinearLayout test4 = findViewById(R.id.test4);
TextView test5 = findViewById(R.id.test5);
test4.setVisibility(View.INVISIBLE);
test5.setText(password);
// GOOD: Input type set to textPassword in XML
EditText test6 = findViewById(R.id.test6);
test6.setText(password);
// GOOD: Input type set to textWebPassword in XML
EditText test7 = findViewById(R.id.test7);
test7.setText(password);
// GOOD: Input type set to numberPassword in XML
EditText test8 = findViewById(R.id.test8);
test8.setText(password);
// BAD: Input type set to textVisiblePassword in XML, which is not hidden
EditText test9 = findViewById(R.id.test9);
test9.setText(password); // $sensitive-text
// GOOD: Visibility set to invisible in XML
EditText test10 = findViewById(R.id.test10);
test10.setText(password);
// GOOD: Visibility set to gone in XML
EditText test11 = findViewById(R.id.test11);
test11.setText(password);
// GOOD: Visibility of parent set to invisible in XML
EditText test12 = findViewById(R.id.test12);
test12.setText(password);
// GOOD: Input type set to textPassword in XML
EditText test13 = findViewById(R.id.test13);
test13.setText(password);
test14 = findViewById(R.id.test14);
}
EditText test14;
void test2(String password) {
// GOOD: Input type set to textPassword in XML
test14.setText(password);
}
}

View File

@@ -0,0 +1 @@
//semmle-extractor-options: --javac-args -cp ${testdir}/../../../../../../stubs/google-android-9.0.0

View File

@@ -0,0 +1,61 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<EditText
android:id="@+id/test1"
android:inputType="text"/>
<TextView
android:id="@+id/test2"/>
<EditText
android:id="@+id/test3"/>
<LinearLayout
android:id="@+id/test4">
<TextView
android:id="@+id/test5"/>
</LinearLayout>
<EditText
android:id="@+id/test6"
android:inputType="textPassword"/>
<EditText
android:id="@+id/test7"
android:inputType="textWebPassword"/>
<EditText
android:id="@+id/test8"
android:inputType="numberPassword"/>
<EditText
android:id="@+id/test9"
android:inputType="textVisiblePassword"/>
<EditText
android:id="@+id/test10"
android:visibility="invisible"/>
<EditText
android:id="@+id/test11"
android:visibility="gone"/>
<LinearLayout
android:visibility="invisible">
<TextView
android:id="@+id/test12"/>
</LinearLayout>
<EditText
android:id="@id/test13"
android:inputType="textPassword"/>
<EditText
android:id="@+id/test14"
android:inputType="textPassword"/>
</LinearLayout>

View File

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

View File

@@ -0,0 +1,19 @@
import java
import TestUtilities.InlineExpectationsTest
import semmle.code.java.dataflow.DataFlow
import semmle.code.java.security.SensitiveUiQuery
module SensitiveTextTest implements TestSig {
string getARelevantTag() { result = "sensitive-text" }
predicate hasActualResult(Location location, string element, string tag, string value) {
tag = "sensitive-text" and
exists(DataFlow::Node sink | TextFieldTracking::flowTo(sink) |
sink.getLocation() = location and
element = sink.toString() and
value = ""
)
}
}
import MakeTest<SensitiveTextTest>

View File

@@ -0,0 +1,68 @@
// Generated automatically from android.widget.LinearLayout for testing purposes
package android.widget;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.drawable.Drawable;
import android.util.AttributeSet;
import android.view.ViewGroup;
public class LinearLayout extends ViewGroup
{
protected LinearLayout() {}
protected LinearLayout.LayoutParams generateDefaultLayoutParams(){ return null; }
protected LinearLayout.LayoutParams generateLayoutParams(ViewGroup.LayoutParams p0){ return null; }
protected boolean checkLayoutParams(ViewGroup.LayoutParams p0){ return false; }
protected void onDraw(Canvas p0){}
protected void onLayout(boolean p0, int p1, int p2, int p3, int p4){}
protected void onMeasure(int p0, int p1){}
public CharSequence getAccessibilityClassName(){ return null; }
public Drawable getDividerDrawable(){ return null; }
public LinearLayout(Context p0){}
public LinearLayout(Context p0, AttributeSet p1){}
public LinearLayout(Context p0, AttributeSet p1, int p2){}
public LinearLayout(Context p0, AttributeSet p1, int p2, int p3){}
public LinearLayout.LayoutParams generateLayoutParams(AttributeSet p0){ return null; }
public boolean isBaselineAligned(){ return false; }
public boolean isMeasureWithLargestChildEnabled(){ return false; }
public boolean shouldDelayChildPressedState(){ return false; }
public float getWeightSum(){ return 0; }
public int getBaseline(){ return 0; }
public int getBaselineAlignedChildIndex(){ return 0; }
public int getDividerPadding(){ return 0; }
public int getGravity(){ return 0; }
public int getOrientation(){ return 0; }
public int getShowDividers(){ return 0; }
public static int HORIZONTAL = 0;
public static int SHOW_DIVIDER_BEGINNING = 0;
public static int SHOW_DIVIDER_END = 0;
public static int SHOW_DIVIDER_MIDDLE = 0;
public static int SHOW_DIVIDER_NONE = 0;
public static int VERTICAL = 0;
public void onRtlPropertiesChanged(int p0){}
public void setBaselineAligned(boolean p0){}
public void setBaselineAlignedChildIndex(int p0){}
public void setDividerDrawable(Drawable p0){}
public void setDividerPadding(int p0){}
public void setGravity(int p0){}
public void setHorizontalGravity(int p0){}
public void setMeasureWithLargestChildEnabled(boolean p0){}
public void setOrientation(int p0){}
public void setShowDividers(int p0){}
public void setVerticalGravity(int p0){}
public void setWeightSum(float p0){}
static public class LayoutParams extends ViewGroup.MarginLayoutParams
{
protected LayoutParams() {}
public LayoutParams(Context p0, AttributeSet p1){}
public LayoutParams(LinearLayout.LayoutParams p0){}
public LayoutParams(ViewGroup.LayoutParams p0){}
public LayoutParams(ViewGroup.MarginLayoutParams p0){}
public LayoutParams(int p0, int p1){}
public LayoutParams(int p0, int p1, float p2){}
public String debug(String p0){ return null; }
public float weight = 0;
public int gravity = 0;
}
}

View File

@@ -0,0 +1,4 @@
---
category: minorAnalysis
---
* The name "certification" is no longer seen as possibly being a certificate, and will therefore no longer be flagged in queries like "clear-text-logging" which look for sensitive data.

View File

@@ -75,7 +75,7 @@ module HeuristicNames {
* Gets a regular expression that identifies strings that may indicate the presence of * Gets a regular expression that identifies strings that may indicate the presence of
* a certificate. * a certificate.
*/ */
string maybeCertificate() { result = "(?is).*(cert)(?!.*(format|name)).*" } string maybeCertificate() { result = "(?is).*(cert)(?!.*(format|name|ification)).*" }
/** /**
* Gets a regular expression that identifies strings that may indicate the presence * Gets a regular expression that identifies strings that may indicate the presence

View File

@@ -0,0 +1,4 @@
---
category: minorAnalysis
---
* The name "certification" is no longer seen as possibly being a certificate, and will therefore no longer be flagged in queries like "clear-text-logging" which look for sensitive data.

View File

@@ -75,7 +75,7 @@ module HeuristicNames {
* Gets a regular expression that identifies strings that may indicate the presence of * Gets a regular expression that identifies strings that may indicate the presence of
* a certificate. * a certificate.
*/ */
string maybeCertificate() { result = "(?is).*(cert)(?!.*(format|name)).*" } string maybeCertificate() { result = "(?is).*(cert)(?!.*(format|name|ification)).*" }
/** /**
* Gets a regular expression that identifies strings that may indicate the presence * Gets a regular expression that identifies strings that may indicate the presence

View File

@@ -3,6 +3,8 @@ display_name: "QL"
version: 0.0.1 version: 0.0.1
column_kind: "utf8" column_kind: "utf8"
legacy_qltest_extraction: true legacy_qltest_extraction: true
build_modes:
- none
github_api_languages: github_api_languages:
- CodeQL - CodeQL
scc_languages: scc_languages:

View File

@@ -3,6 +3,8 @@ display_name: "Ruby"
version: 0.1.0 version: 0.1.0
column_kind: "utf8" column_kind: "utf8"
legacy_qltest_extraction: true legacy_qltest_extraction: true
build_modes:
- none
github_api_languages: github_api_languages:
- Ruby - Ruby
scc_languages: scc_languages:

View File

@@ -0,0 +1,4 @@
---
category: minorAnalysis
---
* The name "certification" is no longer seen as possibly being a certificate, and will therefore no longer be flagged in queries like "clear-text-logging" which look for sensitive data.

View File

@@ -75,7 +75,7 @@ module HeuristicNames {
* Gets a regular expression that identifies strings that may indicate the presence of * Gets a regular expression that identifies strings that may indicate the presence of
* a certificate. * a certificate.
*/ */
string maybeCertificate() { result = "(?is).*(cert)(?!.*(format|name)).*" } string maybeCertificate() { result = "(?is).*(cert)(?!.*(format|name|ification)).*" }
/** /**
* Gets a regular expression that identifies strings that may indicate the presence * Gets a regular expression that identifies strings that may indicate the presence

View File

@@ -0,0 +1,89 @@
/**
* @name Fetch a subset of valid access paths of input and output parameters of a method (framework mode).
* @description A list of access paths for input and output parameters of a method. Excludes test and generated code.
* @kind table
* @id ruby/utils/modeleditor/framework-mode-access-paths
* @tags modeleditor access-paths framework-mode
*/
private import ruby
private import codeql.ruby.AST
private import codeql.ruby.ApiGraphs
private import queries.modeling.internal.Util as Util
predicate simpleParameters(string type, string path, string value, DataFlow::Node node) {
exists(DataFlow::MethodNode methodNode, DataFlow::ParameterNode paramNode |
methodNode.getLocation().getFile() instanceof Util::RelevantFile and
(
// Check that this parameter belongs to this method
// Block parameter explicitly excluded because it's already included
// as part of the blockArguments predicate
paramNode = Util::getAnyParameter(methodNode) and
paramNode != methodNode.getBlockParameter()
)
|
Util::pathToMethod(methodNode, type, path) and
value = Util::getArgumentPath(paramNode) and
node = paramNode
)
}
predicate blockArguments(string type, string path, string value, DataFlow::Node node) {
exists(DataFlow::MethodNode methodNode, DataFlow::CallNode callNode |
methodNode.getLocation().getFile() instanceof Util::RelevantFile and
callNode = methodNode.getABlockCall()
|
(
exists(DataFlow::VariableAccessNode argNode, int i |
argNode = callNode.getPositionalArgument(i)
|
value = "Argument[block].Parameter[" + i + "]" and
node = argNode
)
or
exists(DataFlow::ExprNode argNode, string keyword |
argNode = callNode.getKeywordArgument(keyword)
|
value = "Argument[block].Parameter[" + keyword + ":]" and
node = argNode
)
or
value = "Argument[block]" and
node = callNode
) and
Util::pathToMethod(methodNode, type, path)
)
}
predicate returnValue(string type, string path, string value, DataFlow::Node node) {
exists(DataFlow::MethodNode methodNode, DataFlow::Node returnNode |
methodNode.getLocation().getFile() instanceof Util::RelevantFile and
returnNode = methodNode.getAReturnNode()
|
Util::pathToMethod(methodNode, type, path) and
value = "ReturnValue" and
node = returnNode
)
}
predicate inputAccessPaths(
string type, string path, string value, DataFlow::Node node, string defType
) {
simpleParameters(type, path, value, node) and defType = "parameter"
or
blockArguments(type, path, value, node) and defType = "parameter"
}
predicate outputAccessPaths(
string type, string path, string value, DataFlow::Node node, string defType
) {
simpleParameters(type, path, value, node) and defType = "parameter"
or
blockArguments(type, path, value, node) and defType = "parameter"
or
returnValue(type, path, value, node) and defType = "return"
}
query predicate input = inputAccessPaths/5;
query predicate output = outputAccessPaths/5;

View File

@@ -0,0 +1,75 @@
input
| A | Method[bar] | Argument[0] | lib/mylib.rb:13:11:13:11 | x | parameter |
| A | Method[bar] | Argument[self] | lib/mylib.rb:13:3:14:5 | self in bar | parameter |
| A | Method[foo] | Argument[0] | lib/mylib.rb:7:11:7:11 | x | parameter |
| A | Method[foo] | Argument[1] | lib/mylib.rb:7:14:7:14 | y | parameter |
| A | Method[foo] | Argument[2] | lib/mylib.rb:7:17:7:20 | key1 | parameter |
| A | Method[foo] | Argument[block] | lib/mylib.rb:8:5:8:32 | call to call | parameter |
| A | Method[foo] | Argument[block] | lib/mylib.rb:10:5:10:26 | yield ... | parameter |
| A | Method[foo] | Argument[block].Parameter[0] | lib/mylib.rb:8:16:8:16 | x | parameter |
| A | Method[foo] | Argument[block].Parameter[0] | lib/mylib.rb:10:11:10:11 | x | parameter |
| A | Method[foo] | Argument[block].Parameter[1] | lib/mylib.rb:8:19:8:19 | y | parameter |
| A | Method[foo] | Argument[block].Parameter[1] | lib/mylib.rb:10:14:10:14 | y | parameter |
| A | Method[foo] | Argument[block].Parameter[key2:] | lib/mylib.rb:8:28:8:31 | key1 | parameter |
| A | Method[foo] | Argument[block].Parameter[key2:] | lib/mylib.rb:10:23:10:26 | key1 | parameter |
| A | Method[foo] | Argument[key1:] | lib/mylib.rb:7:17:7:20 | key1 | parameter |
| A | Method[foo] | Argument[self] | lib/mylib.rb:7:3:11:5 | self in foo | parameter |
| A! | Method[new] | Argument[0] | lib/mylib.rb:4:18:4:18 | x | parameter |
| A! | Method[new] | Argument[1] | lib/mylib.rb:4:21:4:21 | y | parameter |
| A! | Method[new] | Argument[self] | lib/mylib.rb:4:3:5:5 | self in initialize | parameter |
| A! | Method[self_foo] | Argument[0] | lib/mylib.rb:16:21:16:21 | x | parameter |
| A! | Method[self_foo] | Argument[1] | lib/mylib.rb:16:24:16:24 | y | parameter |
| A! | Method[self_foo] | Argument[self] | lib/mylib.rb:16:3:17:5 | self in self_foo | parameter |
| A::ANested | Method[foo] | Argument[0] | lib/mylib.rb:25:13:25:13 | x | parameter |
| A::ANested | Method[foo] | Argument[1] | lib/mylib.rb:25:16:25:16 | y | parameter |
| A::ANested | Method[foo] | Argument[self] | lib/mylib.rb:25:5:26:7 | self in foo | parameter |
| B | Method[foo] | Argument[0] | lib/other.rb:6:11:6:11 | x | parameter |
| B | Method[foo] | Argument[1] | lib/other.rb:6:14:6:14 | y | parameter |
| B | Method[foo] | Argument[self] | lib/other.rb:6:3:7:5 | self in foo | parameter |
| M1 | Method[foo] | Argument[0] | lib/module.rb:2:11:2:11 | x | parameter |
| M1 | Method[foo] | Argument[1] | lib/module.rb:2:14:2:14 | y | parameter |
| M1 | Method[foo] | Argument[self] | lib/module.rb:2:3:3:5 | self in foo | parameter |
| M1! | Method[self_foo] | Argument[0] | lib/module.rb:5:21:5:21 | x | parameter |
| M1! | Method[self_foo] | Argument[1] | lib/module.rb:5:24:5:24 | y | parameter |
| M1! | Method[self_foo] | Argument[self] | lib/module.rb:5:3:6:5 | self in self_foo | parameter |
| OtherLib::A | Method[foo] | Argument[0] | other_lib/lib/other_gem.rb:3:17:3:17 | x | parameter |
| OtherLib::A | Method[foo] | Argument[1] | other_lib/lib/other_gem.rb:3:20:3:20 | y | parameter |
| OtherLib::A | Method[foo] | Argument[self] | other_lib/lib/other_gem.rb:3:9:4:11 | self in foo | parameter |
output
| A | Method[bar] | Argument[0] | lib/mylib.rb:13:11:13:11 | x | parameter |
| A | Method[bar] | Argument[self] | lib/mylib.rb:13:3:14:5 | self in bar | parameter |
| A | Method[foo] | Argument[0] | lib/mylib.rb:7:11:7:11 | x | parameter |
| A | Method[foo] | Argument[1] | lib/mylib.rb:7:14:7:14 | y | parameter |
| A | Method[foo] | Argument[2] | lib/mylib.rb:7:17:7:20 | key1 | parameter |
| A | Method[foo] | Argument[block] | lib/mylib.rb:8:5:8:32 | call to call | parameter |
| A | Method[foo] | Argument[block] | lib/mylib.rb:10:5:10:26 | yield ... | parameter |
| A | Method[foo] | Argument[block].Parameter[0] | lib/mylib.rb:8:16:8:16 | x | parameter |
| A | Method[foo] | Argument[block].Parameter[0] | lib/mylib.rb:10:11:10:11 | x | parameter |
| A | Method[foo] | Argument[block].Parameter[1] | lib/mylib.rb:8:19:8:19 | y | parameter |
| A | Method[foo] | Argument[block].Parameter[1] | lib/mylib.rb:10:14:10:14 | y | parameter |
| A | Method[foo] | Argument[block].Parameter[key2:] | lib/mylib.rb:8:28:8:31 | key1 | parameter |
| A | Method[foo] | Argument[block].Parameter[key2:] | lib/mylib.rb:10:23:10:26 | key1 | parameter |
| A | Method[foo] | Argument[key1:] | lib/mylib.rb:7:17:7:20 | key1 | parameter |
| A | Method[foo] | Argument[self] | lib/mylib.rb:7:3:11:5 | self in foo | parameter |
| A | Method[foo] | ReturnValue | lib/mylib.rb:10:5:10:26 | yield ... | return |
| A! | Method[new] | Argument[0] | lib/mylib.rb:4:18:4:18 | x | parameter |
| A! | Method[new] | Argument[1] | lib/mylib.rb:4:21:4:21 | y | parameter |
| A! | Method[new] | Argument[self] | lib/mylib.rb:4:3:5:5 | self in initialize | parameter |
| A! | Method[self_foo] | Argument[0] | lib/mylib.rb:16:21:16:21 | x | parameter |
| A! | Method[self_foo] | Argument[1] | lib/mylib.rb:16:24:16:24 | y | parameter |
| A! | Method[self_foo] | Argument[self] | lib/mylib.rb:16:3:17:5 | self in self_foo | parameter |
| A::ANested | Method[foo] | Argument[0] | lib/mylib.rb:25:13:25:13 | x | parameter |
| A::ANested | Method[foo] | Argument[1] | lib/mylib.rb:25:16:25:16 | y | parameter |
| A::ANested | Method[foo] | Argument[self] | lib/mylib.rb:25:5:26:7 | self in foo | parameter |
| B | Method[foo] | Argument[0] | lib/other.rb:6:11:6:11 | x | parameter |
| B | Method[foo] | Argument[1] | lib/other.rb:6:14:6:14 | y | parameter |
| B | Method[foo] | Argument[self] | lib/other.rb:6:3:7:5 | self in foo | parameter |
| M1 | Method[foo] | Argument[0] | lib/module.rb:2:11:2:11 | x | parameter |
| M1 | Method[foo] | Argument[1] | lib/module.rb:2:14:2:14 | y | parameter |
| M1 | Method[foo] | Argument[self] | lib/module.rb:2:3:3:5 | self in foo | parameter |
| M1! | Method[self_foo] | Argument[0] | lib/module.rb:5:21:5:21 | x | parameter |
| M1! | Method[self_foo] | Argument[1] | lib/module.rb:5:24:5:24 | y | parameter |
| M1! | Method[self_foo] | Argument[self] | lib/module.rb:5:3:6:5 | self in self_foo | parameter |
| OtherLib::A | Method[foo] | Argument[0] | other_lib/lib/other_gem.rb:3:17:3:17 | x | parameter |
| OtherLib::A | Method[foo] | Argument[1] | other_lib/lib/other_gem.rb:3:20:3:20 | y | parameter |
| OtherLib::A | Method[foo] | Argument[self] | other_lib/lib/other_gem.rb:3:9:4:11 | self in foo | parameter |

View File

@@ -0,0 +1 @@
utils/modeleditor/FrameworkModeAccessPaths.ql

View File

@@ -1,13 +1,13 @@
| lib/module.rb:1:1:7:3 | M1 | mylib | M1 | | | false | module.rb | | | lib/module.rb:1:1:7:3 | M1 | mylib | M1 | | | false | module.rb | |
| lib/module.rb:2:3:3:5 | foo | mylib | M1 | foo | (x,y) | false | module.rb | | | lib/module.rb:2:3:3:5 | foo | mylib | M1 | foo | (x,y) | false | module.rb | |
| lib/module.rb:5:3:6:5 | self_foo | mylib | M1! | self_foo | (x,y) | false | module.rb | | | lib/module.rb:5:3:6:5 | self_foo | mylib | M1! | self_foo | (x,y) | false | module.rb | |
| lib/mylib.rb:3:1:30:3 | A | mylib | A | | | false | mylib.rb | | | lib/mylib.rb:3:1:33:3 | A | mylib | A | | | false | mylib.rb | |
| lib/mylib.rb:4:3:5:5 | initialize | mylib | A! | new | (x,y) | false | mylib.rb | | | lib/mylib.rb:4:3:5:5 | initialize | mylib | A! | new | (x,y) | false | mylib.rb | |
| lib/mylib.rb:7:3:8:5 | foo | mylib | A | foo | (x,y,key1:) | false | mylib.rb | | | lib/mylib.rb:7:3:11:5 | foo | mylib | A | foo | (x,y,key1:) | false | mylib.rb | |
| lib/mylib.rb:10:3:11:5 | bar | mylib | A | bar | (x) | false | mylib.rb | | | lib/mylib.rb:13:3:14:5 | bar | mylib | A | bar | (x) | false | mylib.rb | |
| lib/mylib.rb:13:3:14:5 | self_foo | mylib | A! | self_foo | (x,y) | false | mylib.rb | | | lib/mylib.rb:16:3:17:5 | self_foo | mylib | A! | self_foo | (x,y) | false | mylib.rb | |
| lib/mylib.rb:21:3:29:5 | ANested | mylib | A::ANested | | | false | mylib.rb | | | lib/mylib.rb:24:3:32:5 | ANested | mylib | A::ANested | | | false | mylib.rb | |
| lib/mylib.rb:22:5:23:7 | foo | mylib | A::ANested | foo | (x,y) | false | mylib.rb | | | lib/mylib.rb:25:5:26:7 | foo | mylib | A::ANested | foo | (x,y) | false | mylib.rb | |
| lib/other.rb:3:1:8:3 | B | mylib | B | | | false | other.rb | | | lib/other.rb:3:1:8:3 | B | mylib | B | | | false | other.rb | |
| lib/other.rb:6:3:7:5 | foo | mylib | B | foo | (x,y) | false | other.rb | | | lib/other.rb:6:3:7:5 | foo | mylib | B | foo | (x,y) | false | other.rb | |
| lib/other.rb:10:1:12:3 | C | mylib | C | | | false | other.rb | | | lib/other.rb:10:1:12:3 | C | mylib | C | | | false | other.rb | |

View File

@@ -5,6 +5,9 @@ class A
end end
def foo(x, y, key1:, **kwargs, &block) def foo(x, y, key1:, **kwargs, &block)
block.call(x, y, key2: key1)
yield x, y, key2: key1
end end
def bar(x, *args) def bar(x, *args)

View File

@@ -3,6 +3,9 @@ display_name: "Swift"
version: 0.1.0 version: 0.1.0
column_kind: "utf8" column_kind: "utf8"
legacy_qltest_extraction: true legacy_qltest_extraction: true
build_modes:
- autobuild
- manual
github_api_languages: github_api_languages:
- Swift - Swift
scc_languages: scc_languages:

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