@@ -36,12 +36,18 @@ newtype TApplicationModeEndpoint =
36
36
not exists ( int i | i < idx and call .getArgument ( i ) .( Argument ) .isVararg ( ) )
37
37
)
38
38
} or
39
- TMethodCall ( Call call ) { not call instanceof ConstructorCall }
39
+ TMethodCall ( Call call ) { not call instanceof ConstructorCall } or
40
+ TOverriddenParameter ( Parameter p ) {
41
+ not p .getCallable ( ) .callsConstructor ( _) and
42
+ p .getCallable ( ) .( Method ) .overrides ( _)
43
+ }
40
44
41
45
/**
42
46
* An endpoint is a node that is a candidate for modeling.
43
47
*/
44
48
abstract private class ApplicationModeEndpoint extends TApplicationModeEndpoint {
49
+ abstract Callable getCallable ( ) ;
50
+
45
51
abstract Call getCall ( ) ;
46
52
47
53
abstract string getMaDInput ( ) ;
@@ -74,6 +80,8 @@ class ExplicitArgument extends ApplicationModeEndpoint, TExplicitArgument {
74
80
75
81
ExplicitArgument ( ) { this = TExplicitArgument ( call , arg ) }
76
82
83
+ override Callable getCallable ( ) { result = call .getCallee ( ) }
84
+
77
85
override Call getCall ( ) { result = call }
78
86
79
87
private int getArgIndex ( ) { this .asTop ( ) = call .getArgument ( result ) }
@@ -95,6 +103,8 @@ class InstanceArgument extends ApplicationModeEndpoint, TInstanceArgument {
95
103
96
104
InstanceArgument ( ) { this = TInstanceArgument ( call , arg ) }
97
105
106
+ override Callable getCallable ( ) { result = call .getCallee ( ) }
107
+
98
108
override Call getCall ( ) { result = call }
99
109
100
110
override string getMaDInput ( ) { result = "Argument[this]" }
@@ -124,13 +134,15 @@ class ImplicitVarargsArray extends ApplicationModeEndpoint, TImplicitVarargsArra
124
134
125
135
ImplicitVarargsArray ( ) { this = TImplicitVarargsArray ( call , vararg , idx ) }
126
136
137
+ override Callable getCallable ( ) { result = call .getCallee ( ) }
138
+
127
139
override Call getCall ( ) { result = call }
128
140
129
141
override string getMaDInput ( ) { result = "Argument[" + idx + "]" }
130
142
131
143
override string getMaDOutput ( ) { none ( ) }
132
144
133
- override Top asTop ( ) { result = this . getCall ( ) }
145
+ override Top asTop ( ) { result = call }
134
146
135
147
override DataFlow:: Node asNode ( ) { result = vararg }
136
148
@@ -145,6 +157,8 @@ class MethodCall extends ApplicationModeEndpoint, TMethodCall {
145
157
146
158
MethodCall ( ) { this = TMethodCall ( call ) }
147
159
160
+ override Callable getCallable ( ) { result = call .getCallee ( ) }
161
+
148
162
override Call getCall ( ) { result = call }
149
163
150
164
override string getMaDInput ( ) { result = "Argument[this]" }
@@ -158,6 +172,28 @@ class MethodCall extends ApplicationModeEndpoint, TMethodCall {
158
172
override string toString ( ) { result = call .toString ( ) }
159
173
}
160
174
175
+ class OverriddenParameter extends ApplicationModeEndpoint , TOverriddenParameter {
176
+ Parameter p ;
177
+
178
+ OverriddenParameter ( ) { this = TOverriddenParameter ( p ) }
179
+
180
+ override Callable getCallable ( ) { result = p .getCallable ( ) }
181
+
182
+ override Call getCall ( ) { none ( ) }
183
+
184
+ private int getArgIndex ( ) { p .getCallable ( ) .getParameter ( result ) = p }
185
+
186
+ override string getMaDInput ( ) { none ( ) }
187
+
188
+ override string getMaDOutput ( ) { result = "Parameter[" + this .getArgIndex ( ) + "]" }
189
+
190
+ override Top asTop ( ) { result = p }
191
+
192
+ override DataFlow:: Node asNode ( ) { result .( DataFlow:: ParameterNode ) .asParameter ( ) = p }
193
+
194
+ override string toString ( ) { result = p .toString ( ) }
195
+ }
196
+
161
197
/**
162
198
* A candidates implementation.
163
199
*
@@ -208,7 +244,8 @@ module ApplicationCandidatesImpl implements SharedCharacteristics::CandidateSig
208
244
predicate isSource ( Endpoint e , string kind , string provenance ) {
209
245
exists ( string package , string type , string name , string signature , string ext , string output |
210
246
sourceSpec ( e , package , type , name , signature , ext , output ) and
211
- ExternalFlow:: sourceModel ( package , type , _, name , [ signature , "" ] , ext , output , kind , provenance )
247
+ ExternalFlow:: sourceModel ( package , type , _, name , [ signature , "" ] , ext , output , kind ,
248
+ provenance )
212
249
)
213
250
}
214
251
@@ -230,7 +267,8 @@ module ApplicationCandidatesImpl implements SharedCharacteristics::CandidateSig
230
267
}
231
268
232
269
additional predicate sourceSpec (
233
- Endpoint e , string package , string type , string name , string signature , string ext , string output
270
+ Endpoint e , string package , string type , string name , string signature , string ext ,
271
+ string output
234
272
) {
235
273
ApplicationModeGetCallable:: getCallable ( e ) .hasQualifiedName ( package , type , name ) and
236
274
signature = ExternalFlow:: paramsString ( ApplicationModeGetCallable:: getCallable ( e ) ) and
@@ -293,7 +331,7 @@ class ApplicationModeMetadataExtractor extends string {
293
331
string input , string output , string isVarargsArray
294
332
) {
295
333
exists ( Callable callable |
296
- e .getCall ( ) . getCallee ( ) = callable and
334
+ e .getCallable ( ) = callable and
297
335
( if exists ( e .getMaDInput ( ) ) then input = e .getMaDInput ( ) else input = "" ) and
298
336
( if exists ( e .getMaDOutput ( ) ) then output = e .getMaDOutput ( ) else output = "" ) and
299
337
package = callable .getDeclaringType ( ) .getPackage ( ) .getName ( ) and
@@ -328,8 +366,8 @@ private class UnexploitableIsCharacteristic extends CharacteristicsImpl::NotASin
328
366
329
367
override predicate appliesToEndpoint ( Endpoint e ) {
330
368
not ApplicationCandidatesImpl:: isSink ( e , _, _) and
331
- ApplicationModeGetCallable :: getCallable ( e ) .getName ( ) .matches ( "is%" ) and
332
- ApplicationModeGetCallable :: getCallable ( e ) .getReturnType ( ) instanceof BooleanType
369
+ e . getCallable ( ) .getName ( ) .matches ( "is%" ) and
370
+ e . getCallable ( ) .getReturnType ( ) instanceof BooleanType
333
371
}
334
372
}
335
373
0 commit comments