Bug 485246 - Fix false positive no break at the end of the case
Change-Id: I4712dc9be3c52f3c4b2f9b79d327c43ded36967a
diff --git a/codan/org.eclipse.cdt.codan.checkers/src/org/eclipse/cdt/codan/internal/checkers/CaseBreakChecker.java b/codan/org.eclipse.cdt.codan.checkers/src/org/eclipse/cdt/codan/internal/checkers/CaseBreakChecker.java
index 57f6401..47b8157 100644
--- a/codan/org.eclipse.cdt.codan.checkers/src/org/eclipse/cdt/codan/internal/checkers/CaseBreakChecker.java
+++ b/codan/org.eclipse.cdt.codan.checkers/src/org/eclipse/cdt/codan/internal/checkers/CaseBreakChecker.java
@@ -175,34 +175,37 @@
* @param body
* @return
*/
- public boolean isFallThroughStamement(IASTStatement body, boolean inLoop) {
+ public boolean isFallThroughStamement(IASTStatement body, boolean checkOnlyExit) {
if (body == null)
return true;
if (body instanceof IASTCompoundStatement) {
IASTStatement[] statements = ((IASTCompoundStatement) body).getStatements();
if (statements.length > 0) {
- return isFallThroughStamement(statements[statements.length - 1], inLoop);
+ return isFallThroughStamement(statements[statements.length - 1], checkOnlyExit);
}
return true;
} else if (body instanceof IASTDoStatement) {
IASTDoStatement dos = (IASTDoStatement) body;
return isFallThroughStamement(dos.getBody(), true);
+ } else if (body instanceof IASTSwitchStatement) {
+ IASTSwitchStatement switchs = (IASTSwitchStatement) body;
+ return isFallThroughStamement(switchs.getBody(), true);
} else if (body instanceof IASTForStatement) {
IASTForStatement fors = (IASTForStatement) body;
return isFallThroughStamement(fors.getBody(), true);
} else if (body instanceof IASTWhileStatement) {
IASTWhileStatement whiles = (IASTWhileStatement) body;
return isFallThroughStamement(whiles.getBody(), true);
- } else if (inLoop && isExitStatement(body)) {
+ } else if (checkOnlyExit && isExitStatement(body)) {
return false;
- } else if (!inLoop && isBreakOrExitStatement(body)) {
+ } else if (!checkOnlyExit && isBreakOrExitStatement(body)) {
return false;
} else if (body instanceof IASTExpressionStatement) {
return true;
} else if (body instanceof IASTIfStatement) {
IASTIfStatement ifs = (IASTIfStatement) body;
- return isFallThroughStamement(ifs.getThenClause(), inLoop)
- || isFallThroughStamement(ifs.getElseClause(), inLoop);
+ return isFallThroughStamement(ifs.getThenClause(), checkOnlyExit)
+ || isFallThroughStamement(ifs.getElseClause(), checkOnlyExit);
}
return true; // TODO
}
diff --git a/codan/org.eclipse.cdt.codan.core.tests/src/org/eclipse/cdt/codan/core/internal/checkers/CaseBreakCheckerTest.java b/codan/org.eclipse.cdt.codan.core.tests/src/org/eclipse/cdt/codan/core/internal/checkers/CaseBreakCheckerTest.java
index 1bf1513..4c215f5 100644
--- a/codan/org.eclipse.cdt.codan.core.tests/src/org/eclipse/cdt/codan/core/internal/checkers/CaseBreakCheckerTest.java
+++ b/codan/org.eclipse.cdt.codan.core.tests/src/org/eclipse/cdt/codan/core/internal/checkers/CaseBreakCheckerTest.java
@@ -860,4 +860,36 @@
loadCodeAndRun(getAboveComment());
checkNoErrorsOfKind(ER_ID);
}
+
+ //int main() {
+ // int a, b;
+ //
+ // switch (a) {
+ // case 0:
+ // switch (b) {
+ // default: return 1;
+ // }
+ // case 1:
+ // switch (b) {
+ // case 1: return 1;
+ // case 2: return 1;
+ // case 3: return 1;
+ // }
+ // case 2:
+ // switch (b) {
+ // case 1: return 1;
+ // case 2: return 1;
+ // case 3: return 1;
+ // default: return 1;
+ // }
+ // default:
+ // return 1;
+ // }
+ // return 0;
+ //}
+ public void testWithSwitchInCase_Bug485246() throws Exception {
+ loadCodeAndRun(getAboveComment());
+ checkNoErrorsOfKind(ER_ID);
+ }
+
}