diff options
author | Marco Stornelli | 2020-01-19 09:09:41 +0000 |
---|---|---|
committer | Marco Stornelli | 2020-01-19 12:47:30 +0000 |
commit | c25c9672dc8cd1e220929a5312b0d35950eab466 (patch) | |
tree | 6816bb7a05e7527c08e7509601b68b74d5745637 /codan | |
parent | 6647808d0ec571991413a765eabe7be86687afee (diff) | |
download | org.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
Change-Id: I4712dc9be3c52f3c4b2f9b79d327c43ded36967a
Diffstat (limited to 'codan')
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); + } + } |