From c25c9672dc8cd1e220929a5312b0d35950eab466 Mon Sep 17 00:00:00 2001 From: Marco Stornelli Date: Sun, 19 Jan 2020 10:09:41 +0100 Subject: [PATCH] Bug 485246 - Fix false positive no break at the end of the case Change-Id: I4712dc9be3c52f3c4b2f9b79d327c43ded36967a --- .../internal/checkers/CaseBreakChecker.java | 15 +++++---- .../checkers/CaseBreakCheckerTest.java | 32 +++++++++++++++++++ 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); + } + }