mirror of
https://github.com/github/codeql.git
synced 2026-05-14 11:19:27 +02:00
Python: Add NeverReachable test
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.
This commit is contained in:
@@ -0,0 +1,2 @@
|
||||
| test_match.py:159:13:159:23 | BinaryExpr | Node annotated with t.never is reachable in $@ | test_match.py:151:1:151:42 | Function test_match_exhaustive_return_first | test_match_exhaustive_return_first |
|
||||
| test_match.py:172:13:172:23 | BinaryExpr | Node annotated with t.never is reachable in $@ | test_match.py:164:1:164:45 | Function test_match_exhaustive_return_wildcard | test_match_exhaustive_return_wildcard |
|
||||
@@ -0,0 +1,26 @@
|
||||
/**
|
||||
* 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()
|
||||
Reference in New Issue
Block a user