@@ -21,6 +21,10 @@ signature module InputSig<LocationSig Location, DF::InputSig<Location> Lang> {
2121 string toString ( ) ;
2222 }
2323
24+ /** Holds if a generated summary is allowed for `c`. */
25+ bindingset [ c]
26+ default predicate allowGeneratedSummary ( SummarizedCallableBase c ) { any ( ) }
27+
2428 /**
2529 * A base class of elements that are candidates for flow source modeling.
2630 */
@@ -289,55 +293,25 @@ module Make<
289293 *
290294 * `preservesValue` indicates whether this is a value-preserving step or a taint-step.
291295 *
292- * If `model` is non-empty then it indicates the provenance of the model
293- * defining this flow.
296+ * `p` indicates the provenance of the flow.
297+ *
298+ * `isExact` indicates whether there exists a model for which this callable is an exact
299+ * match, that is, no overriding was used to identify this callable from the model.
300+ *
301+ * If `model` is non-empty then it indicates the origin of the model defining this flow.
294302 */
295303 pragma [ nomagic]
296304 abstract predicate propagatesFlow (
297- string input , string output , boolean preservesValue , string model
305+ string input , string output , boolean preservesValue , Provenance p , boolean isExact ,
306+ string model
298307 ) ;
299308
300- /**
301- * Holds if there exists a generated summary that applies to this callable.
302- */
303- final predicate hasGeneratedModel ( ) {
304- exists ( Provenance p | p .isGenerated ( ) and this .hasProvenance ( p ) )
305- }
306-
307- /**
308- * Holds if all the summaries that apply to this callable are auto generated and not manually created.
309- * That is, only apply generated models, when there are no manual models.
310- */
311- final predicate applyGeneratedModel ( ) {
312- this .hasGeneratedModel ( ) and
313- not this .hasManualModel ( )
314- }
315-
316309 /**
317310 * Holds if there exists a manual summary that applies to this callable.
318311 */
319312 final predicate hasManualModel ( ) {
320- exists ( Provenance p | p . isManual ( ) and this . hasProvenance ( p ) )
313+ any ( Provenance p | this . propagatesFlow ( _ , _ , _ , p , _ , _ ) ) . isManual ( )
321314 }
322-
323- /**
324- * Holds if there exists a manual summary that applies to this callable.
325- * Always apply manual models if they exist.
326- */
327- final predicate applyManualModel ( ) { this .hasManualModel ( ) }
328-
329- /**
330- * Holds if there exists a summary that applies to this callable
331- * that has provenance `provenance`.
332- */
333- predicate hasProvenance ( Provenance provenance ) { provenance = "manual" }
334-
335- /**
336- * Holds if there exists a model for which this callable is an exact
337- * match, that is, no overriding was used to identify this callable from
338- * the model.
339- */
340- predicate hasExactModel ( ) { none ( ) }
341315 }
342316
343317 /** A source element. */
@@ -647,7 +621,7 @@ module Make<
647621 SummarizedCallableImpl callable , SummaryComponentStack input , SummaryComponentStack output ,
648622 string whichOne
649623 ) {
650- callable .propagatesFlow ( input , output , _, _) and
624+ callable .propagatesFlow ( input , output , _, _, _ , _ ) and
651625 (
652626 not isSupportedInputStack ( input ) and whichOne = "input"
653627 or
@@ -688,9 +662,9 @@ module Make<
688662
689663 private predicate summarySpec ( string spec ) {
690664 exists ( SummarizedCallable c |
691- c .propagatesFlow ( spec , _, _, _)
665+ c .propagatesFlow ( spec , _, _, _, _ , _ )
692666 or
693- c .propagatesFlow ( _, spec , _, _)
667+ c .propagatesFlow ( _, spec , _, _, _ , _ )
694668 )
695669 or
696670 isRelevantSource ( _, spec , _, _, _)
@@ -857,13 +831,9 @@ module Make<
857831 *
858832 * ```ql
859833 * private class CAdapter extends SummarizedCallable instanceof C {
860- * override predicate propagatesFlow(string input, string output, boolean preservesValue, string model) {
834+ * override predicate propagatesFlow(string input, string output, boolean preservesValue, Provenance p, string model) {
861835 * none()
862836 * }
863- *
864- * override predicate hasProvenance(Provenance provenance) {
865- * C.super.hasProvenance(provenance)
866- * }
867837 * }
868838 * ```
869839 */
@@ -897,32 +867,26 @@ module Make<
897867 pragma [ nomagic]
898868 abstract predicate propagatesFlow (
899869 SummaryComponentStack input , SummaryComponentStack output , boolean preservesValue ,
900- string model
870+ Provenance p , boolean isExact , string model
901871 ) ;
902-
903- /**
904- * Holds if there exists a summary that applies to this callable
905- * that has provenance `provenance`.
906- */
907- abstract predicate hasProvenance ( Provenance provenance ) ;
908872 }
909873
910874 pragma [ nomagic]
911875 private predicate summary (
912876 SummarizedCallableImpl c , SummaryComponentStack input , SummaryComponentStack output ,
913877 boolean preservesValue , string model
914878 ) {
915- c .propagatesFlow ( input , output , preservesValue , model )
879+ c .propagatesFlow ( input , output , preservesValue , _ , _ , model )
916880 or
917881 // observe side effects of callbacks on input arguments
918- c .propagatesFlow ( output , input , preservesValue , model ) and
882+ c .propagatesFlow ( output , input , preservesValue , _ , _ , model ) and
919883 preservesValue = true and
920884 isCallbackParameter ( input ) and
921885 isContentOfArgument ( output , _)
922886 or
923887 // flow from the receiver of a callback into the instance-parameter
924888 exists ( SummaryComponentStack s , SummaryComponentStack callbackRef |
925- c .propagatesFlow ( s , _, _, model ) or c .propagatesFlow ( _, s , _, model )
889+ c .propagatesFlow ( s , _, _, _ , _ , model ) or c .propagatesFlow ( _, s , _ , _ , _, model )
926890 |
927891 callbackRef = s .drop ( _) and
928892 ( isCallbackParameter ( callbackRef ) or callbackRef .head ( ) = TReturnSummaryComponent ( _) ) and
@@ -948,8 +912,8 @@ module Make<
948912 SummaryComponentStack mid , boolean preservesValue1 , boolean preservesValue2 , string model1 ,
949913 string model2
950914 |
951- c .propagatesFlow ( input , mid , preservesValue1 , model1 ) and
952- c .propagatesFlow ( mid , output , preservesValue2 , model2 ) and
915+ c .propagatesFlow ( input , mid , preservesValue1 , _ , _ , model1 ) and
916+ c .propagatesFlow ( mid , output , preservesValue2 , _ , _ , model2 ) and
953917 mid .drop ( mid .length ( ) - 2 ) =
954918 SummaryComponentStack:: push ( TParameterSummaryComponent ( _) ,
955919 SummaryComponentStack:: singleton ( TArgumentSummaryComponent ( _) ) ) and
@@ -2048,18 +2012,25 @@ module Make<
20482012 {
20492013 override predicate propagatesFlow (
20502014 SummaryComponentStack input , SummaryComponentStack output , boolean preservesValue ,
2051- string model
2015+ Provenance p , boolean isExact , string model
20522016 ) {
20532017 exists ( AccessPath inSpec , AccessPath outSpec |
2054- SummarizedCallable .super .propagatesFlow ( inSpec , outSpec , preservesValue , model ) and
2018+ SummarizedCallable .super
2019+ .propagatesFlow ( inSpec , outSpec , preservesValue , p , isExact , model ) and
20552020 interpretSpec ( inSpec , input ) and
20562021 interpretSpec ( outSpec , output )
2022+ |
2023+ p .isManual ( )
2024+ or
2025+ p .isGenerated ( ) and
2026+ not exists ( Provenance manual | manual .isManual ( ) |
2027+ SummarizedCallable .super .propagatesFlow ( _, _, _, manual , _, _)
2028+ or
2029+ neutralElement ( this , "summary" , manual , _)
2030+ ) and
2031+ allowGeneratedSummary ( this )
20572032 )
20582033 }
2059-
2060- override predicate hasProvenance ( Provenance provenance ) {
2061- SummarizedCallable .super .hasProvenance ( provenance )
2062- }
20632034 }
20642035
20652036 /** Holds if component `c` of specification `spec` cannot be parsed. */
@@ -2492,7 +2463,8 @@ module Make<
24922463 string getCallableCsv ( ) ;
24932464
24942465 predicate relevantSummary (
2495- SummaryComponentStack input , SummaryComponentStack output , boolean preservesValue
2466+ SummaryComponentStack input , SummaryComponentStack output , boolean preservesValue ,
2467+ Provenance p
24962468 ) ;
24972469 }
24982470
@@ -2505,13 +2477,6 @@ module Make<
25052477 preservesValue = false and result = "taint"
25062478 }
25072479
2508- private string renderProvenance ( SummarizedCallable c ) {
2509- exists ( Provenance p | p .isManual ( ) and c .hasProvenance ( p ) and result = p .toString ( ) )
2510- or
2511- not c .applyManualModel ( ) and
2512- c .hasProvenance ( result )
2513- }
2514-
25152480 /**
25162481 * Holds if there exists a relevant summary callable with information roughly corresponding to `csv`.
25172482 * Used for testing.
@@ -2521,15 +2486,15 @@ module Make<
25212486 query predicate summary ( string csv ) {
25222487 exists (
25232488 RelevantSummarizedCallable c , SummaryComponentStack input , SummaryComponentStack output ,
2524- boolean preservesValue
2489+ boolean preservesValue , Provenance p
25252490 |
2526- c .relevantSummary ( input , output , preservesValue ) and
2491+ c .relevantSummary ( input , output , preservesValue , p ) and
25272492 csv =
25282493 c .getCallableCsv ( ) // Callable information
25292494 + input .getMadRepresentation ( ) + ";" // input
25302495 + output .getMadRepresentation ( ) + ";" // output
25312496 + renderKind ( preservesValue ) + ";" // kind
2532- + renderProvenance ( c ) // provenance
2497+ + p // provenance
25332498 )
25342499 }
25352500 }
0 commit comments