@@ -1117,16 +1117,44 @@ ReturnPosition getReturnPosition(ReturnNodeExt ret) {
1117
1117
result = getReturnPosition0 ( ret , ret .getKind ( ) )
1118
1118
}
1119
1119
1120
+ /**
1121
+ * Checks whether `inner` can return to `call` in the call context `innercc`.
1122
+ * Assumes a context of `inner = viableCallableExt(call)`.
1123
+ */
1120
1124
bindingset [ innercc, inner, call]
1121
1125
predicate checkCallContextReturn ( CallContext innercc , DataFlowCallable inner , DataFlowCall call ) {
1122
- resolveReturn ( innercc , inner , call )
1126
+ innercc instanceof CallContextAny
1127
+ or
1128
+ exists ( DataFlowCallable c0 , DataFlowCall call0 |
1129
+ callEnclosingCallable ( call0 , inner ) and
1130
+ innercc = TReturn ( c0 , call0 ) and
1131
+ c0 = prunedViableImplInCallContextReverse ( call0 , call )
1132
+ )
1123
1133
}
1124
1134
1135
+ /**
1136
+ * Checks whether `call` can resolve to `calltarget` in the call context `cc`.
1137
+ * Assumes a context of `calltarget = viableCallableExt(call)`.
1138
+ */
1125
1139
bindingset [ cc, call, calltarget]
1126
1140
predicate checkCallContextCall ( CallContext cc , DataFlowCall call , DataFlowCallable calltarget ) {
1127
- calltarget = resolveCall ( call , cc )
1141
+ exists ( DataFlowCall ctx | cc = TSpecificCall ( ctx ) |
1142
+ if reducedViableImplInCallContext ( call , _, ctx )
1143
+ then calltarget = prunedViableImplInCallContext ( call , ctx )
1144
+ else any ( )
1145
+ )
1146
+ or
1147
+ cc instanceof CallContextSomeCall
1148
+ or
1149
+ cc instanceof CallContextAny
1150
+ or
1151
+ cc instanceof CallContextReturn
1128
1152
}
1129
1153
1154
+ /**
1155
+ * Resolves a return from `callable` in `cc` to `call`. This is equivalent to
1156
+ * `callable = viableCallableExt(call) and checkCallContextReturn(cc, callable, call)`.
1157
+ */
1130
1158
bindingset [ cc, callable]
1131
1159
predicate resolveReturn ( CallContext cc , DataFlowCallable callable , DataFlowCall call ) {
1132
1160
cc instanceof CallContextAny and callable = viableCallableExt ( call )
@@ -1138,6 +1166,10 @@ predicate resolveReturn(CallContext cc, DataFlowCallable callable, DataFlowCall
1138
1166
)
1139
1167
}
1140
1168
1169
+ /**
1170
+ * Resolves a call from `call` in `cc` to `result`. This is equivalent to
1171
+ * `result = viableCallableExt(call) and checkCallContextCall(cc, call, result)`.
1172
+ */
1141
1173
bindingset [ call, cc]
1142
1174
DataFlowCallable resolveCall ( DataFlowCall call , CallContext cc ) {
1143
1175
exists ( DataFlowCall ctx | cc = TSpecificCall ( ctx ) |
0 commit comments