Skip to content

Commit a8f394f

Browse files
authored
Merge pull request #20237 from aschackmull/guards/nullguard-caching
Guards: Cache nullGuard predicate.
2 parents e6150e2 + e17382d commit a8f394f

File tree

1 file changed

+67
-59
lines changed

1 file changed

+67
-59
lines changed

shared/controlflow/codeql/controlflow/Guards.qll

Lines changed: 67 additions & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -873,77 +873,85 @@ module Make<LocationSig Location, InputSig<Location> Input> {
873873

874874
private signature predicate baseGuardValueSig(Guard guard, GuardValue v);
875875

876-
/**
877-
* Calculates the transitive closure of all the guard implication steps
878-
* starting from a given set of base cases.
879-
*/
880876
cached
881-
private module ImpliesTC<baseGuardValueSig/2 baseGuardValue> {
877+
private module Cached {
882878
/**
883-
* Holds if `tgtGuard` evaluating to `tgtVal` implies that `guard`
884-
* evaluates to `v`.
879+
* Calculates the transitive closure of all the guard implication steps
880+
* starting from a given set of base cases.
885881
*/
886-
pragma[nomagic]
887882
cached
888-
predicate guardControls(Guard guard, GuardValue v, Guard tgtGuard, GuardValue tgtVal) {
889-
baseGuardValue(tgtGuard, tgtVal) and
890-
guard = tgtGuard and
891-
v = tgtVal
892-
or
893-
exists(Guard g0, GuardValue v0 |
894-
guardControls(g0, v0, tgtGuard, tgtVal) and
895-
impliesStep2(g0, v0, guard, v)
896-
)
897-
or
898-
exists(Guard g0, GuardValue v0 |
899-
guardControls(g0, v0, tgtGuard, tgtVal) and
900-
unboundImpliesStep(g0, v0, guard, v)
901-
)
902-
or
903-
exists(SsaDefinition def0, GuardValue v0 |
904-
ssaControls(def0, v0, tgtGuard, tgtVal) and
905-
impliesStepSsaGuard(def0, v0, guard, v)
906-
)
907-
or
908-
exists(Guard g0, GuardValue v0 |
909-
guardControls(g0, v0, tgtGuard, tgtVal) and
910-
WrapperGuard::wrapperImpliesStep(g0, v0, guard, v)
911-
)
912-
or
913-
exists(Guard g0, GuardValue v0 |
914-
guardControls(g0, v0, tgtGuard, tgtVal) and
915-
additionalImpliesStep(g0, v0, guard, v)
916-
)
883+
module ImpliesTC<baseGuardValueSig/2 baseGuardValue> {
884+
/**
885+
* Holds if `tgtGuard` evaluating to `tgtVal` implies that `guard`
886+
* evaluates to `v`.
887+
*/
888+
pragma[nomagic]
889+
cached
890+
predicate guardControls(Guard guard, GuardValue v, Guard tgtGuard, GuardValue tgtVal) {
891+
baseGuardValue(tgtGuard, tgtVal) and
892+
guard = tgtGuard and
893+
v = tgtVal
894+
or
895+
exists(Guard g0, GuardValue v0 |
896+
guardControls(g0, v0, tgtGuard, tgtVal) and
897+
impliesStep2(g0, v0, guard, v)
898+
)
899+
or
900+
exists(Guard g0, GuardValue v0 |
901+
guardControls(g0, v0, tgtGuard, tgtVal) and
902+
unboundImpliesStep(g0, v0, guard, v)
903+
)
904+
or
905+
exists(SsaDefinition def0, GuardValue v0 |
906+
ssaControls(def0, v0, tgtGuard, tgtVal) and
907+
impliesStepSsaGuard(def0, v0, guard, v)
908+
)
909+
or
910+
exists(Guard g0, GuardValue v0 |
911+
guardControls(g0, v0, tgtGuard, tgtVal) and
912+
WrapperGuard::wrapperImpliesStep(g0, v0, guard, v)
913+
)
914+
or
915+
exists(Guard g0, GuardValue v0 |
916+
guardControls(g0, v0, tgtGuard, tgtVal) and
917+
additionalImpliesStep(g0, v0, guard, v)
918+
)
919+
}
920+
921+
/**
922+
* Holds if `tgtGuard` evaluating to `tgtVal` implies that `def`
923+
* evaluates to `v`.
924+
*/
925+
pragma[nomagic]
926+
cached
927+
predicate ssaControls(SsaDefinition def, GuardValue v, Guard tgtGuard, GuardValue tgtVal) {
928+
exists(Guard g0 |
929+
guardControls(g0, v, tgtGuard, tgtVal) and
930+
guardReadsSsaVar(g0, def)
931+
)
932+
or
933+
exists(SsaDefinition def0 |
934+
ssaControls(def0, v, tgtGuard, tgtVal) and
935+
impliesStepSsa(def0, v, def)
936+
)
937+
}
917938
}
918939

919940
/**
920-
* Holds if `tgtGuard` evaluating to `tgtVal` implies that `def`
921-
* evaluates to `v`.
941+
* Holds if `guard` evaluating to `v` implies that `e` is guaranteed to be
942+
* null if `isNull` is true, and non-null if `isNull` is false.
922943
*/
923-
pragma[nomagic]
924944
cached
925-
predicate ssaControls(SsaDefinition def, GuardValue v, Guard tgtGuard, GuardValue tgtVal) {
926-
exists(Guard g0 |
927-
guardControls(g0, v, tgtGuard, tgtVal) and
928-
guardReadsSsaVar(g0, def)
929-
)
930-
or
931-
exists(SsaDefinition def0 |
932-
ssaControls(def0, v, tgtGuard, tgtVal) and
933-
impliesStepSsa(def0, v, def)
934-
)
945+
predicate nullGuard(Guard guard, GuardValue v, Expr e, boolean isNull) {
946+
impliesStep2(guard, v, e, any(GuardValue gv | gv.isNullness(isNull))) or
947+
WrapperGuard::wrapperImpliesStep(guard, v, e, any(GuardValue gv | gv.isNullness(isNull))) or
948+
additionalImpliesStep(guard, v, e, any(GuardValue gv | gv.isNullness(isNull)))
935949
}
936950
}
937951

938-
/**
939-
* Holds if `guard` evaluating to `v` implies that `e` is guaranteed to be
940-
* null if `isNull` is true, and non-null if `isNull` is false.
941-
*/
942-
predicate nullGuard(Guard guard, GuardValue v, Expr e, boolean isNull) {
943-
impliesStep2(guard, v, e, any(GuardValue gv | gv.isNullness(isNull))) or
944-
WrapperGuard::wrapperImpliesStep(guard, v, e, any(GuardValue gv | gv.isNullness(isNull))) or
945-
additionalImpliesStep(guard, v, e, any(GuardValue gv | gv.isNullness(isNull)))
946-
}
952+
private import Cached
953+
954+
predicate nullGuard = Cached::nullGuard/4;
947955

948956
private predicate hasAValueBranchEdge(Guard guard, GuardValue v) {
949957
guard.hasValueBranchEdge(_, _, v)

0 commit comments

Comments
 (0)