Files
codeql/csharp/ql/test/library-tests/dataflow/functionpointers/FunctionPointerFlow.ql
2025-02-05 10:57:16 +01:00

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)
}