From db0cc1f9a46f32a821347b49edccc7e560da8ee5 Mon Sep 17 00:00:00 2001 From: Marco Stornelli Date: Sat, 27 Apr 2019 17:49:46 +0200 Subject: [PATCH] Bug 468749 - Fix false negative no virtual destructor The checkers simply skipped nested classes. Change-Id: If464b229e586267d845768f9d96d3223328a8298 Signed-off-by: Marco Stornelli --- .../internal/checkers/NonVirtualDestructor.java | 7 +++---- .../checkers/NonVirtualDestructorCheckerTest.java | 12 ++++++++++++ 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/codan/org.eclipse.cdt.codan.checkers/src/org/eclipse/cdt/codan/internal/checkers/NonVirtualDestructor.java b/codan/org.eclipse.cdt.codan.checkers/src/org/eclipse/cdt/codan/internal/checkers/NonVirtualDestructor.java index 68f44b1513b..1425e730c40 100644 --- a/codan/org.eclipse.cdt.codan.checkers/src/org/eclipse/cdt/codan/internal/checkers/NonVirtualDestructor.java +++ b/codan/org.eclipse.cdt.codan.checkers/src/org/eclipse/cdt/codan/internal/checkers/NonVirtualDestructor.java @@ -99,7 +99,7 @@ public class NonVirtualDestructor extends AbstractIndexAstChecker { boolean hasVirtualDestructor = hasVirtualDestructor(classType); checkedClassTypes.clear(); if (hasVirtualDestructor) { - return PROCESS_SKIP; + return PROCESS_CONTINUE; } ICPPMethod virtualMethod = null; for (ICPPMethod method : ClassTypeHelper.getAllDeclaredMethods(classType)) { @@ -108,13 +108,13 @@ public class NonVirtualDestructor extends AbstractIndexAstChecker { } } if (virtualMethod == null) { - return PROCESS_SKIP; + return PROCESS_CONTINUE; } ICPPMethod destructor = getDestructor(classType); if (destructor != null && destructor.getVisibility() != ICPPASTVisibilityLabel.v_public && classType.getFriends().length == 0) { // No error if the destructor is protected or private and there are no friends. - return PROCESS_SKIP; + return PROCESS_CONTINUE; } IASTNode node = decl; @@ -125,7 +125,6 @@ public class NonVirtualDestructor extends AbstractIndexAstChecker { } } reportProblem(PROBLEM_ID, node, new String(className.getSimpleID()), virtualMethod.getName()); - return PROCESS_SKIP; } finally { CPPSemantics.popLookupPoint(); } diff --git a/codan/org.eclipse.cdt.codan.core.tests/src/org/eclipse/cdt/codan/core/internal/checkers/NonVirtualDestructorCheckerTest.java b/codan/org.eclipse.cdt.codan.core.tests/src/org/eclipse/cdt/codan/core/internal/checkers/NonVirtualDestructorCheckerTest.java index 7f11b65bbcc..7012c38c500 100644 --- a/codan/org.eclipse.cdt.codan.core.tests/src/org/eclipse/cdt/codan/core/internal/checkers/NonVirtualDestructorCheckerTest.java +++ b/codan/org.eclipse.cdt.codan.core.tests/src/org/eclipse/cdt/codan/core/internal/checkers/NonVirtualDestructorCheckerTest.java @@ -221,4 +221,16 @@ public class NonVirtualDestructorCheckerTest extends CheckerTestCase { assertTrue((start == -1 && end == -1) || // ok, not multi-line !code.substring(start, end).contains("\n")); } + + //class A { + //public: + // class B { + // public: + // virtual void test(); + // }; + //} + public void testNestedClasses_Bug468749() throws Exception { + loadCodeAndRun(getAboveComment()); + checkErrorLine(3, NonVirtualDestructor.PROBLEM_ID); + } }