@@ -36,12 +36,18 @@ newtype TApplicationModeEndpoint =
3636 not exists ( int i | i < idx and call .getArgument ( i ) .( Argument ) .isVararg ( ) )
3737 )
3838 } 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+ }
4044
4145/**
4246 * An endpoint is a node that is a candidate for modeling.
4347 */
4448abstract private class ApplicationModeEndpoint extends TApplicationModeEndpoint {
49+ abstract Callable getCallable ( ) ;
50+
4551 abstract Call getCall ( ) ;
4652
4753 abstract string getMaDInput ( ) ;
@@ -74,6 +80,8 @@ class ExplicitArgument extends ApplicationModeEndpoint, TExplicitArgument {
7480
7581 ExplicitArgument ( ) { this = TExplicitArgument ( call , arg ) }
7682
83+ override Callable getCallable ( ) { result = call .getCallee ( ) }
84+
7785 override Call getCall ( ) { result = call }
7886
7987 private int getArgIndex ( ) { this .asTop ( ) = call .getArgument ( result ) }
@@ -95,6 +103,8 @@ class InstanceArgument extends ApplicationModeEndpoint, TInstanceArgument {
95103
96104 InstanceArgument ( ) { this = TInstanceArgument ( call , arg ) }
97105
106+ override Callable getCallable ( ) { result = call .getCallee ( ) }
107+
98108 override Call getCall ( ) { result = call }
99109
100110 override string getMaDInput ( ) { result = "Argument[this]" }
@@ -124,13 +134,15 @@ class ImplicitVarargsArray extends ApplicationModeEndpoint, TImplicitVarargsArra
124134
125135 ImplicitVarargsArray ( ) { this = TImplicitVarargsArray ( call , vararg , idx ) }
126136
137+ override Callable getCallable ( ) { result = call .getCallee ( ) }
138+
127139 override Call getCall ( ) { result = call }
128140
129141 override string getMaDInput ( ) { result = "Argument[" + idx + "]" }
130142
131143 override string getMaDOutput ( ) { none ( ) }
132144
133- override Top asTop ( ) { result = this . getCall ( ) }
145+ override Top asTop ( ) { result = call }
134146
135147 override DataFlow:: Node asNode ( ) { result = vararg }
136148
@@ -145,6 +157,8 @@ class MethodCall extends ApplicationModeEndpoint, TMethodCall {
145157
146158 MethodCall ( ) { this = TMethodCall ( call ) }
147159
160+ override Callable getCallable ( ) { result = call .getCallee ( ) }
161+
148162 override Call getCall ( ) { result = call }
149163
150164 override string getMaDInput ( ) { result = "Argument[this]" }
@@ -158,6 +172,28 @@ class MethodCall extends ApplicationModeEndpoint, TMethodCall {
158172 override string toString ( ) { result = call .toString ( ) }
159173}
160174
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+
161197/**
162198 * A candidates implementation.
163199 *
@@ -208,7 +244,8 @@ module ApplicationCandidatesImpl implements SharedCharacteristics::CandidateSig
208244 predicate isSource ( Endpoint e , string kind , string provenance ) {
209245 exists ( string package , string type , string name , string signature , string ext , string output |
210246 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 )
212249 )
213250 }
214251
@@ -230,7 +267,8 @@ module ApplicationCandidatesImpl implements SharedCharacteristics::CandidateSig
230267 }
231268
232269 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
234272 ) {
235273 ApplicationModeGetCallable:: getCallable ( e ) .hasQualifiedName ( package , type , name ) and
236274 signature = ExternalFlow:: paramsString ( ApplicationModeGetCallable:: getCallable ( e ) ) and
@@ -293,7 +331,7 @@ class ApplicationModeMetadataExtractor extends string {
293331 string input , string output , string isVarargsArray
294332 ) {
295333 exists ( Callable callable |
296- e .getCall ( ) . getCallee ( ) = callable and
334+ e .getCallable ( ) = callable and
297335 ( if exists ( e .getMaDInput ( ) ) then input = e .getMaDInput ( ) else input = "" ) and
298336 ( if exists ( e .getMaDOutput ( ) ) then output = e .getMaDOutput ( ) else output = "" ) and
299337 package = callable .getDeclaringType ( ) .getPackage ( ) .getName ( ) and
@@ -328,8 +366,8 @@ private class UnexploitableIsCharacteristic extends CharacteristicsImpl::NotASin
328366
329367 override predicate appliesToEndpoint ( Endpoint e ) {
330368 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
333371 }
334372}
335373
0 commit comments