Skip to content

Commit 35e5499

Browse files
committed
Cfg: Extend consistency checks.
1 parent f23d6be commit 35e5499

File tree

1 file changed

+56
-1
lines changed

1 file changed

+56
-1
lines changed

shared/controlflow/codeql/controlflow/ControlFlowGraph.qll

Lines changed: 56 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1856,6 +1856,53 @@ module Make0<LocationSig Location, AstSig<Location> Ast> {
18561856

18571857
/** Provides a set of consistency queries. */
18581858
module Consistency {
1859+
/** Holds if the consistency query `query` has `results` results. */
1860+
query predicate consistencyOverview(string query, int results) {
1861+
query = "deadEnd" and results = strictcount(ControlFlowNode node | deadEnd(node))
1862+
or
1863+
query = "nonUniqueEnclosingCallable" and
1864+
results =
1865+
strictcount(AstNode n, int callables | nonUniqueEnclosingCallable(n, callables))
1866+
or
1867+
query = "nonUniqueInConditionalContext" and
1868+
results = strictcount(AstNode n | nonUniqueInConditionalContext(n))
1869+
or
1870+
query = "nonLocalStep" and
1871+
results =
1872+
strictcount(ControlFlowNode n1, SuccessorType t, ControlFlowNode n2 |
1873+
nonLocalStep(n1, t, n2)
1874+
)
1875+
or
1876+
query = "ambiguousAdditionalNode" and
1877+
results = strictcount(AstNode n, string tag | ambiguousAdditionalNode(n, tag))
1878+
or
1879+
query = "missingInNodeForPostOrInOrder" and
1880+
results = strictcount(AstNode ast | missingInNodeForPostOrInOrder(ast))
1881+
or
1882+
query = "multipleSuccessors" and
1883+
results =
1884+
strictcount(ControlFlowNode node, SuccessorType t, ControlFlowNode successor |
1885+
multipleSuccessors(node, t, successor)
1886+
)
1887+
or
1888+
query = "multipleConditionalSuccessorKinds" and
1889+
results =
1890+
strictcount(ControlFlowNode node, ConditionalSuccessor t1, ConditionalSuccessor t2,
1891+
ControlFlowNode succ1, ControlFlowNode succ2 |
1892+
multipleConditionalSuccessorKinds(node, t1, t2, succ1, succ2)
1893+
)
1894+
or
1895+
query = "directAndConditionalSuccessor" and
1896+
results =
1897+
strictcount(ControlFlowNode node, ConditionalSuccessor t1, DirectSuccessor t2,
1898+
ControlFlowNode succ1, ControlFlowNode succ2 |
1899+
directAndConditionalSuccessors(node, t1, t2, succ1, succ2)
1900+
)
1901+
or
1902+
query = "selfLoop" and
1903+
results = strictcount(ControlFlowNode node, SuccessorType t | selfLoop(node, t))
1904+
}
1905+
18591906
/**
18601907
* Holds if `node` is lacking a successor.
18611908
*
@@ -1866,6 +1913,11 @@ module Make0<LocationSig Location, AstSig<Location> Ast> {
18661913
not exists(node.getASuccessor(_))
18671914
}
18681915

1916+
/** Holds if `n` does not have a unique enclosing callable. */
1917+
query predicate nonUniqueEnclosingCallable(AstNode n, int callables) {
1918+
callables = strictcount(getEnclosingCallable(n)) and callables > 1
1919+
}
1920+
18691921
/**
18701922
* Holds if `n` is in a conditional context with multiple condition kinds.
18711923
*
@@ -1987,7 +2039,10 @@ module Make0<LocationSig Location, AstSig<Location> Ast> {
19872039
ControlFlowNode succ1, ControlFlowNode succ2
19882040
) {
19892041
succ1 = node.getASuccessor(t1) and
1990-
succ2 = node.getASuccessor(t2)
2042+
succ2 = node.getASuccessor(t2) and
2043+
// allow for the pattern match true edge when a pattern match
2044+
// expression is not in a conditional context
2045+
not succ1.isAdditional(_, patternMatchTrueTag())
19912046
}
19922047

19932048
/**

0 commit comments

Comments
 (0)