@@ -1008,6 +1008,8 @@ module Make<
10081008 * wrappers.
10091009 */
10101010 private module WrapperGuard {
1011+ private import codeql.util.DenseRank
1012+
10111013 final private class FinalExpr = Expr ;
10121014
10131015 class ReturnExpr extends FinalExpr {
@@ -1019,6 +1021,25 @@ module Make<
10191021 BasicBlock getBasicBlock ( ) { result = super .getBasicBlock ( ) }
10201022 }
10211023
1024+ private module DenseRankInput implements DenseRankInputSig1 {
1025+ class C = NonOverridableMethod ;
1026+
1027+ class Ranked = ReturnExpr ;
1028+
1029+ int getRank ( NonOverridableMethod m , ReturnExpr ret ) {
1030+ m .getAReturnExpr ( ) = ret and
1031+ result = ret .getLocation ( ) .getStartLine ( )
1032+ }
1033+ }
1034+
1035+ private module ReturnExprRank = DenseRank1< DenseRankInput > ;
1036+
1037+ private predicate rankedReturnExpr = ReturnExprRank:: denseRank / 2 ;
1038+
1039+ private int maxRank ( NonOverridableMethod m ) {
1040+ result = max ( int rnk | exists ( rankedReturnExpr ( m , rnk ) ) )
1041+ }
1042+
10221043 private predicate relevantCallValue ( NonOverridableMethodCall call , GuardValue val ) {
10231044 BranchImplies:: guardControls ( call , val , _, _) or
10241045 ReturnImplies:: guardControls ( call , val , _, _)
0 commit comments