Skip to content

Commit

Permalink
Merge pull request #17988 from owen-mc/java/fix-unreachable-blocks-in…
Browse files Browse the repository at this point in the history
…-const-switch-stmt

Java: fix unreachable basic blocks in const switch stmt
  • Loading branch information
owen-mc authored Nov 19, 2024
2 parents c5bec1c + ba239a1 commit e2f17c6
Show file tree
Hide file tree
Showing 3 changed files with 12 additions and 7 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
---
category: minorAnalysis
---
* In a switch statement with a constant switch expression, all non-matching cases were being marked as unreachable, including those that can be reached by falling through from the matching case. This has now been fixed.
14 changes: 8 additions & 6 deletions java/ql/lib/semmle/code/java/controlflow/UnreachableBlocks.qll
Original file line number Diff line number Diff line change
Expand Up @@ -217,13 +217,15 @@ class UnreachableBasicBlock extends BasicBlock {
not this instanceof CatchClause
or
// Switch statements with a constant comparison expression may have unreachable cases.
exists(ConstSwitchStmt constSwitchStmt, BasicBlock failingCaseBlock |
failingCaseBlock = constSwitchStmt.getAFailingCase().getBasicBlock()
|
exists(ConstSwitchStmt constSwitchStmt, BasicBlock unreachableCaseBlock |
// Not accessible from the switch expression
unreachableCaseBlock = constSwitchStmt.getAFailingCase().getBasicBlock() and
// Not accessible from the successful case
not constSwitchStmt.getMatchingCase().getBasicBlock().getABBSuccessor*() = failingCaseBlock and
// Blocks dominated by the failing case block are unreachable
constSwitchStmt.getAFailingCase().getBasicBlock().bbDominates(this)
not constSwitchStmt.getMatchingCase().getBasicBlock().getABBSuccessor*() =
unreachableCaseBlock
|
// Blocks dominated by an unreachable case block are unreachable
unreachableCaseBlock.bbDominates(this)
)
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@
| unreachableblocks/Unreachable.java:12:22:14:3 | { ... } |
| unreachableblocks/Unreachable.java:17:3:17:9 | case ... |
| unreachableblocks/Unreachable.java:19:3:19:9 | case ... |
| unreachableblocks/Unreachable.java:22:3:22:9 | case ... |
| unreachableblocks/Unreachable.java:24:3:24:9 | case ... |
| unreachableblocks/Unreachable.java:26:3:26:10 | case ... |
| unreachableblocks/Unreachable.java:27:3:27:10 | default |

0 comments on commit e2f17c6

Please sign in to comment.