mirror of
https://github.com/github/codeql.git
synced 2026-05-14 11:19:27 +02:00
This looks for nodes annotated with `t.never` in the test that are reachable in the CFG. This should not happen (it messes with various queries, e.g. the "mixed returns" query), but the test shows that in a few particular cases (involving the `match` statement where all cases contain `return`s), we _do_ have reachable nodes that shouldn't be.
27 lines
819 B
Plaintext
27 lines
819 B
Plaintext
/**
|
|
* Checks that expressions annotated with `t.never` either have no CFG
|
|
* node, or if they do, that the node is not reachable from its scope's
|
|
* entry (including within the same basic block).
|
|
*/
|
|
|
|
import python
|
|
import TimerUtils
|
|
|
|
from NeverTimerAnnotation ann
|
|
where
|
|
exists(ControlFlowNode n, Scope s |
|
|
n.getNode() = ann.getExpr() and
|
|
s = n.getScope() and
|
|
(
|
|
// Reachable via inter-block path (includes same block)
|
|
s.getEntryNode().getBasicBlock().reaches(n.getBasicBlock())
|
|
or
|
|
// In same block as entry but at a later index
|
|
exists(BasicBlock bb, int i, int j |
|
|
bb.getNode(i) = s.getEntryNode() and bb.getNode(j) = n and i < j
|
|
)
|
|
)
|
|
)
|
|
select ann, "Node annotated with t.never is reachable in $@", ann.getTestFunction(),
|
|
ann.getTestFunction().getName()
|