Skip to main content
aboutsummaryrefslogtreecommitdiffstats
path: root/codan
diff options
context:
space:
mode:
authorMarco Stornelli2020-01-19 09:09:41 +0000
committerMarco Stornelli2020-01-19 12:47:30 +0000
commitc25c9672dc8cd1e220929a5312b0d35950eab466 (patch)
tree6816bb7a05e7527c08e7509601b68b74d5745637 /codan
parent6647808d0ec571991413a765eabe7be86687afee (diff)
downloadorg.eclipse.cdt-c25c9672dc8cd1e220929a5312b0d35950eab466.tar.gz
org.eclipse.cdt-c25c9672dc8cd1e220929a5312b0d35950eab466.tar.xz
org.eclipse.cdt-c25c9672dc8cd1e220929a5312b0d35950eab466.zip
Bug 485246 - Fix false positive no break at the end of the case
Diffstat (limited to 'codan')
-rw-r--r--codan/org.eclipse.cdt.codan.checkers/src/org/eclipse/cdt/codan/internal/checkers/CaseBreakChecker.java15
-rw-r--r--codan/org.eclipse.cdt.codan.core.tests/src/org/eclipse/cdt/codan/core/internal/checkers/CaseBreakCheckerTest.java32
2 files changed, 41 insertions, 6 deletions
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 57f64011ddb..47b81571868 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 @@ public class CaseBreakChecker extends AbstractIndexAstChecker {
* @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 1bf15139f27..4c215f517ad 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 @@ public class CaseBreakCheckerTest extends CheckerTestCase {
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);
+ }
+
}

Back to the top