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:
Taus
2026-04-16 16:12:31 +00:00
committed by yoff
parent a8d136d3d6
commit f97bf38f3b
2 changed files with 28 additions and 0 deletions

View File

@@ -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 |

View File

@@ -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()