mirror of
https://github.com/github/codeql.git
synced 2026-04-29 18:55:14 +02:00
Java: Add query to detect non-case labels in switch statements
This commit is contained in:
33
java/ql/src/Language Abuse/LabelInSwitch.md
Normal file
33
java/ql/src/Language Abuse/LabelInSwitch.md
Normal file
@@ -0,0 +1,33 @@
|
||||
## Overview
|
||||
|
||||
Java allows to freely mix `case` labels and ordinary statement labels in the body of
|
||||
a `switch` statement. However, this is confusing to read and may be the result of a typo.
|
||||
|
||||
## Recommendation
|
||||
|
||||
Examine the non-`case` labels to see whether they were meant to be `case` labels. If not, consider placing the non-`case` label headed code into a function, and use a function call inline in the `switch` body instead.
|
||||
|
||||
## Example
|
||||
|
||||
```java
|
||||
public class Test {
|
||||
void test_noncase_label_in_switch(int p) {
|
||||
switch (p) {
|
||||
case 1: // Compliant
|
||||
case2: // Non-compliant, likely a typo
|
||||
break;
|
||||
case 3:
|
||||
notcaselabel: // Non-compliant, confusing to read
|
||||
for (;;) {
|
||||
break notcaselabel;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
In the example, `case2` is most likely a typo and should be fixed. For the intensional `notcaselabel`, placing the labelled code into a function and then calling that function is more readable.
|
||||
|
||||
## References
|
||||
|
||||
Similar to the JS CodeQL query - [js/label-in-switch](https://codeql.github.com/codeql-query-help/javascript/js-label-in-switch/).
|
||||
25
java/ql/src/Language Abuse/LabelInSwitch.ql
Normal file
25
java/ql/src/Language Abuse/LabelInSwitch.ql
Normal file
@@ -0,0 +1,25 @@
|
||||
/**
|
||||
* @id java/label-in-switch
|
||||
* @name Non-case label in switch statement
|
||||
* @description A non-case label appearing in a switch statement
|
||||
* is confusing to read or may even indicate a bug.
|
||||
* @previous-id java/label-in-case
|
||||
* @kind problem
|
||||
* @precision very-high
|
||||
* @problem.severity recommendation
|
||||
* @tags quality
|
||||
* maintainability
|
||||
* readability
|
||||
*/
|
||||
|
||||
import java
|
||||
|
||||
from LabeledStmt l, SwitchStmt s, string alert
|
||||
where
|
||||
l = s.getAStmt+() and
|
||||
if exists(JumpStmt jump | jump.getTargetLabel() = l)
|
||||
then alert = "Confusing non-case label in switch statement."
|
||||
else
|
||||
alert =
|
||||
"Possibly erroneous non-case label in switch statement. The case keyword might be missing."
|
||||
select l, alert
|
||||
Reference in New Issue
Block a user