mirror of
https://github.com/github/codeql.git
synced 2025-12-16 16:53:25 +01:00
39 lines
1.1 KiB
Plaintext
39 lines
1.1 KiB
Plaintext
import csharp
|
|
import semmle.code.csharp.dataflow.internal.DataFlowImplCommon
|
|
import semmle.code.csharp.dataflow.internal.DataFlowDispatch
|
|
|
|
query predicate fptrCall(FunctionPointerCall dc, Callable c) { c = dc.getARuntimeTarget() }
|
|
|
|
private class LocatableDataFlowCallOption extends CallOption {
|
|
Location getLocation() {
|
|
this = TCallNone() and
|
|
result instanceof EmptyLocation
|
|
or
|
|
exists(DataFlowCall call |
|
|
this = TCallSome(call) and
|
|
result = call.getLocation()
|
|
)
|
|
}
|
|
}
|
|
|
|
private class LocatableDataFlowCall extends TDataFlowCall {
|
|
LocatableDataFlowCall() {
|
|
this.(ExplicitDelegateLikeDataFlowCall).getCall() instanceof FunctionPointerCall
|
|
}
|
|
|
|
string toString() { result = this.(DataFlowCall).toString() }
|
|
|
|
Location getLocation() {
|
|
exists(Location l |
|
|
l = this.(DataFlowCall).getLocation() and
|
|
if l instanceof SourceLocation then result = l else result instanceof EmptyLocation
|
|
)
|
|
}
|
|
}
|
|
|
|
query predicate fptrCallContext(
|
|
LocatableDataFlowCall call, LocatableDataFlowCallOption lastCall, DataFlowCallable target
|
|
) {
|
|
target = viableCallableLambda(call, lastCall)
|
|
}
|