Skip to content

Commit 5493d96

Browse files
committed
Java: Fix UnreachableBlocks bug and some qltest output.
1 parent 25d2811 commit 5493d96

File tree

30 files changed

+72
-75
lines changed

30 files changed

+72
-75
lines changed

java/ql/src/semmle/code/java/controlflow/UnreachableBlocks.qll

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -210,14 +210,12 @@ class UnreachableBasicBlock extends BasicBlock {
210210
conditionBlock.controls(this, constant.booleanNot())
211211
)
212212
or
213-
// This block is not reachable in the CFG, and is not a callable, a body of a callable, an
214-
// expression in an annotation, an expression in an assert statement, or a catch clause.
213+
// This block is not reachable in the CFG, and is not the entrypoint in a callable, an
214+
// expression in an assert statement, or a catch clause.
215215
forall(BasicBlock bb | bb = getABBPredecessor() | bb instanceof UnreachableBasicBlock) and
216-
not exists(Callable c | c.getBody() = this) and
217-
not this instanceof Callable and
218-
not exists(Annotation a | a.getAChildExpr*() = this) and
219-
not exists(AssertStmt a | a = this.(Expr).getEnclosingStmt()) and
220-
not this instanceof CatchClause
216+
not exists(Callable c | c.getBody().getControlFlowNode() = this.getFirstNode()) and
217+
not exists(AssertStmt a | a = this.getFirstNode().asExpr().getEnclosingStmt()) and
218+
not this.getFirstNode().asStmt() instanceof CatchClause
221219
or
222220
// Switch statements with a constant comparison expression may have unreachable cases.
223221
exists(ConstSwitchStmt constSwitchStmt, BasicBlock failingCaseBlock |
@@ -226,7 +224,7 @@ class UnreachableBasicBlock extends BasicBlock {
226224
// Not accessible from the successful case
227225
not constSwitchStmt.getMatchingCase().getBasicBlock().getABBSuccessor*() = failingCaseBlock and
228226
// Blocks dominated by the failing case block are unreachable
229-
constSwitchStmt.getAFailingCase().getBasicBlock().bbDominates(this)
227+
failingCaseBlock.bbDominates(this)
230228
)
231229
}
232230
}

java/ql/test/library-tests/java7/MultiCatch/MultiCatchControlFlow.expected

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
| MultiCatch.java:6:14:6:23 | stmt | MultiCatch.java:6:14:6:23 | super(...) |
2-
| MultiCatch.java:6:14:6:23 | super(...) | MultiCatch.java:6:14:6:23 | MultiCatch |
2+
| MultiCatch.java:6:14:6:23 | super(...) | MultiCatch.java:6:14:6:23 | Exit |
33
| MultiCatch.java:8:2:20:2 | stmt | MultiCatch.java:9:3:19:3 | stmt |
44
| MultiCatch.java:9:3:19:3 | stmt | MultiCatch.java:10:3:15:3 | stmt |
55
| MultiCatch.java:10:3:15:3 | stmt | MultiCatch.java:11:4:11:8 | stmt |
@@ -16,7 +16,7 @@
1616
| MultiCatch.java:17:4:17:4 | e | MultiCatch.java:17:4:17:22 | printStackTrace(...) |
1717
| MultiCatch.java:17:4:17:22 | printStackTrace(...) | MultiCatch.java:18:10:18:10 | e |
1818
| MultiCatch.java:17:4:17:23 | stmt | MultiCatch.java:17:4:17:4 | e |
19-
| MultiCatch.java:18:4:18:11 | stmt | MultiCatch.java:7:14:7:23 | multiCatch |
19+
| MultiCatch.java:18:4:18:11 | stmt | MultiCatch.java:7:14:7:23 | Exit |
2020
| MultiCatch.java:18:10:18:10 | e | MultiCatch.java:18:4:18:11 | stmt |
2121
| MultiCatch.java:23:2:33:2 | stmt | MultiCatch.java:24:3:32:4 | stmt |
2222
| MultiCatch.java:24:3:32:4 | stmt | MultiCatch.java:25:3:31:3 | stmt |
@@ -31,12 +31,12 @@
3131
| MultiCatch.java:28:12:28:12 | c | MultiCatch.java:30:10:30:24 | new Exception(...) |
3232
| MultiCatch.java:29:5:29:29 | stmt | MultiCatch.java:31:5:31:37 | stmt |
3333
| MultiCatch.java:29:11:29:28 | new SQLException(...) | MultiCatch.java:29:5:29:29 | stmt |
34-
| MultiCatch.java:30:4:30:25 | stmt | MultiCatch.java:22:14:22:24 | multiCatch2 |
34+
| MultiCatch.java:30:4:30:25 | stmt | MultiCatch.java:22:14:22:24 | Exit |
3535
| MultiCatch.java:30:4:30:25 | stmt | MultiCatch.java:31:5:31:37 | stmt |
3636
| MultiCatch.java:30:10:30:24 | new Exception(...) | MultiCatch.java:30:4:30:25 | stmt |
3737
| MultiCatch.java:31:5:31:37 | stmt | MultiCatch.java:31:36:31:36 | e |
3838
| MultiCatch.java:31:36:31:36 | e | MultiCatch.java:32:3:32:4 | stmt |
39-
| MultiCatch.java:32:3:32:4 | stmt | MultiCatch.java:22:14:22:24 | multiCatch2 |
39+
| MultiCatch.java:32:3:32:4 | stmt | MultiCatch.java:22:14:22:24 | Exit |
4040
| MultiCatch.java:36:2:42:2 | stmt | MultiCatch.java:37:3:41:4 | stmt |
4141
| MultiCatch.java:37:3:41:4 | stmt | MultiCatch.java:38:3:40:3 | stmt |
4242
| MultiCatch.java:38:3:40:3 | stmt | MultiCatch.java:39:10:39:26 | new IOException(...) |
@@ -45,4 +45,4 @@
4545
| MultiCatch.java:39:10:39:26 | new IOException(...) | MultiCatch.java:40:5:40:22 | stmt |
4646
| MultiCatch.java:40:5:40:22 | stmt | MultiCatch.java:40:21:40:21 | e |
4747
| MultiCatch.java:40:21:40:21 | e | MultiCatch.java:41:3:41:4 | stmt |
48-
| MultiCatch.java:41:3:41:4 | stmt | MultiCatch.java:35:14:35:26 | ordinaryCatch |
48+
| MultiCatch.java:41:3:41:4 | stmt | MultiCatch.java:35:14:35:26 | Exit |

java/ql/test/library-tests/successors/CloseReaderTest/TestSucc.expected

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
| CloseReaderTest.java:8:14:8:28 | stmt | CloseReaderTest.java:8:14:8:28 | super(...) |
2-
| CloseReaderTest.java:8:14:8:28 | super(...) | CloseReaderTest.java:8:14:8:28 | CloseReaderTest |
2+
| CloseReaderTest.java:8:14:8:28 | super(...) | CloseReaderTest.java:8:14:8:28 | Exit |
33
| CloseReaderTest.java:10:2:24:2 | stmt | CloseReaderTest.java:12:3:13:42 | stmt |
44
| CloseReaderTest.java:12:3:12:12 | System.out | CloseReaderTest.java:12:20:12:40 | "Enter password for " |
55
| CloseReaderTest.java:12:3:13:41 | print(...) | CloseReaderTest.java:14:3:14:21 | stmt |
@@ -19,12 +19,12 @@
1919
| CloseReaderTest.java:16:5:16:13 | System.in | CloseReaderTest.java:15:45:16:14 | new InputStreamReader(...) |
2020
| CloseReaderTest.java:17:3:23:3 | stmt | CloseReaderTest.java:18:3:20:3 | stmt |
2121
| CloseReaderTest.java:18:3:20:3 | stmt | CloseReaderTest.java:19:11:19:15 | stdin |
22-
| CloseReaderTest.java:19:4:19:27 | stmt | CloseReaderTest.java:9:23:9:34 | readPassword |
22+
| CloseReaderTest.java:19:4:19:27 | stmt | CloseReaderTest.java:9:23:9:34 | Exit |
2323
| CloseReaderTest.java:19:11:19:15 | stdin | CloseReaderTest.java:19:11:19:26 | readLine(...) |
2424
| CloseReaderTest.java:19:11:19:26 | readLine(...) | CloseReaderTest.java:19:4:19:27 | stmt |
2525
| CloseReaderTest.java:19:11:19:26 | readLine(...) | CloseReaderTest.java:20:5:20:26 | stmt |
2626
| CloseReaderTest.java:20:5:20:26 | stmt | CloseReaderTest.java:20:24:20:25 | ex |
2727
| CloseReaderTest.java:20:24:20:25 | ex | CloseReaderTest.java:21:3:23:3 | stmt |
2828
| CloseReaderTest.java:21:3:23:3 | stmt | CloseReaderTest.java:22:11:22:14 | null |
29-
| CloseReaderTest.java:22:4:22:15 | stmt | CloseReaderTest.java:9:23:9:34 | readPassword |
29+
| CloseReaderTest.java:22:4:22:15 | stmt | CloseReaderTest.java:9:23:9:34 | Exit |
3030
| CloseReaderTest.java:22:11:22:14 | null | CloseReaderTest.java:22:4:22:15 | stmt |

java/ql/test/library-tests/successors/CloseReaderTest/TestSucc.ql

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,5 +4,5 @@ from ControlFlowNode n, ControlFlowNode succ
44
where
55
succ = n.getASuccessor() and
66
n.getLocation().getFile().getExtension() = "java" and
7-
not n.getFile().getStem() = "PopulateRuntimeException"
7+
not n.getEnclosingCallable().getFile().getStem() = "PopulateRuntimeException"
88
select n, succ

java/ql/test/library-tests/successors/LoopVarReadTest/TestSucc.expected

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
| LoopVarReadTest.java:3:14:3:28 | stmt | LoopVarReadTest.java:3:14:3:28 | super(...) |
2-
| LoopVarReadTest.java:3:14:3:28 | super(...) | LoopVarReadTest.java:3:14:3:28 | LoopVarReadTest |
2+
| LoopVarReadTest.java:3:14:3:28 | super(...) | LoopVarReadTest.java:3:14:3:28 | Exit |
33
| LoopVarReadTest.java:5:2:15:2 | stmt | LoopVarReadTest.java:6:3:6:12 | stmt |
44
| LoopVarReadTest.java:6:3:6:12 | stmt | LoopVarReadTest.java:6:11:6:11 | 2 |
55
| LoopVarReadTest.java:6:7:6:11 | x | LoopVarReadTest.java:7:3:7:33 | stmt |
@@ -23,6 +23,6 @@
2323
| LoopVarReadTest.java:12:7:12:12 | q | LoopVarReadTest.java:14:3:14:28 | stmt |
2424
| LoopVarReadTest.java:12:11:12:12 | 10 | LoopVarReadTest.java:12:7:12:12 | q |
2525
| LoopVarReadTest.java:14:3:14:12 | System.out | LoopVarReadTest.java:14:22:14:26 | "foo" |
26-
| LoopVarReadTest.java:14:3:14:27 | println(...) | LoopVarReadTest.java:4:21:4:28 | testLoop |
26+
| LoopVarReadTest.java:14:3:14:27 | println(...) | LoopVarReadTest.java:4:21:4:28 | Exit |
2727
| LoopVarReadTest.java:14:3:14:28 | stmt | LoopVarReadTest.java:14:3:14:12 | System.out |
2828
| LoopVarReadTest.java:14:22:14:26 | "foo" | LoopVarReadTest.java:14:3:14:27 | println(...) |

java/ql/test/library-tests/successors/LoopVarReadTest/TestSucc.ql

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,5 +4,5 @@ from ControlFlowNode n, ControlFlowNode succ
44
where
55
succ = n.getASuccessor() and
66
n.getLocation().getFile().getExtension() = "java" and
7-
not n.getFile().getStem() = "PopulateRuntimeException"
7+
not n.getEnclosingCallable().getFile().getStem() = "PopulateRuntimeException"
88
select n, succ

java/ql/test/library-tests/successors/SaveFileTest/TestSucc.expected

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
| SaveFileTest.java:11:14:11:25 | stmt | SaveFileTest.java:11:14:11:25 | super(...) |
2-
| SaveFileTest.java:11:14:11:25 | super(...) | SaveFileTest.java:11:14:11:25 | SaveFileTest |
2+
| SaveFileTest.java:11:14:11:25 | super(...) | SaveFileTest.java:11:14:11:25 | Exit |
33
| SaveFileTest.java:15:2:55:2 | stmt | SaveFileTest.java:17:3:17:25 | stmt |
44
| SaveFileTest.java:17:3:17:25 | stmt | SaveFileTest.java:17:21:17:24 | path |
55
| SaveFileTest.java:17:10:17:24 | savePath | SaveFileTest.java:18:3:18:27 | stmt |
@@ -95,9 +95,9 @@
9595
| SaveFileTest.java:48:5:48:15 | flush(...) | SaveFileTest.java:50:6:50:30 | stmt |
9696
| SaveFileTest.java:48:5:48:16 | stmt | SaveFileTest.java:48:5:48:7 | bos |
9797
| SaveFileTest.java:49:5:49:7 | bos | SaveFileTest.java:49:5:49:15 | close(...) |
98-
| SaveFileTest.java:49:5:49:15 | close(...) | SaveFileTest.java:12:14:12:21 | saveFile |
98+
| SaveFileTest.java:49:5:49:15 | close(...) | SaveFileTest.java:12:14:12:21 | Exit |
9999
| SaveFileTest.java:49:5:49:15 | close(...) | SaveFileTest.java:50:6:50:30 | stmt |
100100
| SaveFileTest.java:49:5:49:16 | stmt | SaveFileTest.java:49:5:49:7 | bos |
101101
| SaveFileTest.java:50:6:50:30 | stmt | SaveFileTest.java:50:23:50:29 | ignored |
102102
| SaveFileTest.java:50:23:50:29 | ignored | SaveFileTest.java:51:4:52:4 | stmt |
103-
| SaveFileTest.java:51:4:52:4 | stmt | SaveFileTest.java:12:14:12:21 | saveFile |
103+
| SaveFileTest.java:51:4:52:4 | stmt | SaveFileTest.java:12:14:12:21 | Exit |

java/ql/test/library-tests/successors/SaveFileTest/TestSucc.ql

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,5 +4,5 @@ from ControlFlowNode n, ControlFlowNode succ
44
where
55
succ = n.getASuccessor() and
66
n.getLocation().getFile().getExtension() = "java" and
7-
not n.getFile().getStem() = "PopulateRuntimeException"
7+
not n.getEnclosingCallable().getFile().getStem() = "PopulateRuntimeException"
88
select n, succ

java/ql/test/library-tests/successors/SchackTest/TestSucc.expected

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
| SchackTest.java:1:14:1:23 | stmt | SchackTest.java:1:14:1:23 | super(...) |
2-
| SchackTest.java:1:14:1:23 | super(...) | SchackTest.java:1:14:1:23 | SchackTest |
2+
| SchackTest.java:1:14:1:23 | super(...) | SchackTest.java:1:14:1:23 | Exit |
33
| SchackTest.java:2:8:2:10 | stmt | SchackTest.java:2:8:2:10 | super(...) |
4-
| SchackTest.java:2:8:2:10 | super(...) | SchackTest.java:2:8:2:10 | ExA |
4+
| SchackTest.java:2:8:2:10 | super(...) | SchackTest.java:2:8:2:10 | Exit |
55
| SchackTest.java:3:8:3:10 | stmt | SchackTest.java:3:8:3:10 | super(...) |
6-
| SchackTest.java:3:8:3:10 | super(...) | SchackTest.java:3:8:3:10 | ExB |
6+
| SchackTest.java:3:8:3:10 | super(...) | SchackTest.java:3:8:3:10 | Exit |
77
| SchackTest.java:5:18:24:2 | stmt | SchackTest.java:6:3:23:3 | stmt |
88
| SchackTest.java:6:3:23:3 | stmt | SchackTest.java:6:7:17:3 | stmt |
99
| SchackTest.java:6:7:17:3 | stmt | SchackTest.java:7:4:15:4 | stmt |
@@ -56,7 +56,7 @@
5656
| SchackTest.java:20:23:20:72 | "successor (but neither true nor false successor)" | SchackTest.java:20:4:20:73 | println(...) |
5757
| SchackTest.java:21:13:23:3 | stmt | SchackTest.java:22:4:22:41 | stmt |
5858
| SchackTest.java:22:4:22:13 | System.out | SchackTest.java:22:23:22:39 | "false successor" |
59-
| SchackTest.java:22:4:22:40 | println(...) | SchackTest.java:5:7:5:9 | foo |
59+
| SchackTest.java:22:4:22:40 | println(...) | SchackTest.java:5:7:5:9 | Exit |
6060
| SchackTest.java:22:4:22:41 | stmt | SchackTest.java:22:4:22:13 | System.out |
6161
| SchackTest.java:22:23:22:39 | "false successor" | SchackTest.java:22:4:22:40 | println(...) |
6262
| SchackTest.java:26:35:30:2 | stmt | SchackTest.java:27:3:27:25 | stmt |
@@ -65,9 +65,9 @@
6565
| SchackTest.java:27:7:27:24 | ... > ... | SchackTest.java:28:10:28:18 | new ExB(...) |
6666
| SchackTest.java:27:7:27:24 | ... > ... | SchackTest.java:29:10:29:22 | random(...) |
6767
| SchackTest.java:27:23:27:24 | .5 | SchackTest.java:27:7:27:24 | ... > ... |
68-
| SchackTest.java:28:4:28:19 | stmt | SchackTest.java:26:18:26:20 | bar |
68+
| SchackTest.java:28:4:28:19 | stmt | SchackTest.java:26:18:26:20 | Exit |
6969
| SchackTest.java:28:10:28:18 | new ExB(...) | SchackTest.java:28:4:28:19 | stmt |
70-
| SchackTest.java:29:3:29:28 | stmt | SchackTest.java:26:18:26:20 | bar |
70+
| SchackTest.java:29:3:29:28 | stmt | SchackTest.java:26:18:26:20 | Exit |
7171
| SchackTest.java:29:10:29:22 | random(...) | SchackTest.java:29:26:29:27 | .3 |
7272
| SchackTest.java:29:10:29:27 | ... > ... | SchackTest.java:29:3:29:28 | stmt |
7373
| SchackTest.java:29:26:29:27 | .3 | SchackTest.java:29:10:29:27 | ... > ... |

java/ql/test/library-tests/successors/SchackTest/TestSucc.ql

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,5 +4,5 @@ from ControlFlowNode n, ControlFlowNode succ
44
where
55
succ = n.getASuccessor() and
66
n.getLocation().getFile().getExtension() = "java" and
7-
not n.getFile().getStem() = "PopulateRuntimeException"
7+
not n.getEnclosingCallable().getFile().getStem() = "PopulateRuntimeException"
88
select n, succ

0 commit comments

Comments
 (0)