Guards: Rank return expressions.

This commit is contained in:
Anders Schack-Mulligen
2025-11-11 12:52:07 +01:00
parent 0a4406dec9
commit a5279ec420

View File

@@ -1008,6 +1008,8 @@ module Make<
* wrappers.
*/
private module WrapperGuard {
private import codeql.util.DenseRank
final private class FinalExpr = Expr;
class ReturnExpr extends FinalExpr {
@@ -1019,6 +1021,25 @@ module Make<
BasicBlock getBasicBlock() { result = super.getBasicBlock() }
}
private module DenseRankInput implements DenseRankInputSig1 {
class C = NonOverridableMethod;
class Ranked = ReturnExpr;
int getRank(NonOverridableMethod m, ReturnExpr ret) {
m.getAReturnExpr() = ret and
result = ret.getLocation().getStartLine()
}
}
private module ReturnExprRank = DenseRank1<DenseRankInput>;
private predicate rankedReturnExpr = ReturnExprRank::denseRank/2;
private int maxRank(NonOverridableMethod m) {
result = max(int rnk | exists(rankedReturnExpr(m, rnk)))
}
private predicate relevantCallValue(NonOverridableMethodCall call, GuardValue val) {
BranchImplies::guardControls(call, val, _, _) or
ReturnImplies::guardControls(call, val, _, _)