C++: Fork AV Rule 78 into NonVirtualDestructorInBaseClass

AV Rule 78 has proved too noisy for use on lgtm.com. However, if we make the rule less noisy by, say, allowing a protected destructor to be non-virtual, we're no longer actually enforcing AV Rule 78. Instead, I've copied AV Rule 78 into NonVirtualDestructorInBaseClass.ql, given the new query the `@id` that AV Rule 78 had, and given AV Rule 78 a new JSF-specific `@id`. The new rule allows non-public non-virtual destructors, which is the problem originally reported by an lgtm.com user.
This commit is contained in:
Dave Bartolomeo
2018-11-05 14:16:35 -08:00
parent ba91f3e77c
commit 0c796de831
7 changed files with 225 additions and 1 deletions

View File

@@ -0,0 +1,121 @@
struct HasDtor
{
~HasDtor();
};
struct Base_NonVirtual_NoDtor
{
void NonVirtualFunction();
};
struct Base_NonVirtual_VirtualDtor
{
virtual ~Base_NonVirtual_VirtualDtor();
void NonVirtualFunction();
};
struct Base_NonVirtual_NonVirtualDtor
{
~Base_NonVirtual_NonVirtualDtor();
void NonVirtualFunction();
};
struct Base_NonVirtual_ImplicitDtor
{
HasDtor m_hasDtor;
void NonVirtualFunction();
};
struct Derived_NonVirtual_NoDtor : public Base_NonVirtual_NoDtor
{
};
struct Derived_NonVirtual_VirtualDtor : public Base_NonVirtual_VirtualDtor
{
};
struct Derived_NonVirtual_NonVirtualDtor : public Base_NonVirtual_NonVirtualDtor
{
};
struct Derived_NonVirtual_ImplicitDtor : public Base_NonVirtual_ImplicitDtor
{
};
struct Base_Virtual_NoDtor
{
virtual void VirtualFunction();
};
struct Base_Virtual_VirtualDtor
{
virtual ~Base_Virtual_VirtualDtor();
virtual void VirtualFunction();
};
struct Base_Virtual_NonVirtualDtor
{
~Base_Virtual_NonVirtualDtor();
virtual void VirtualFunction();
};
struct Base_Virtual_ImplicitDtor
{
HasDtor m_hasDtor;
virtual void VirtualFunction();
};
struct Base_Virtual_NonVirtualDtorWithDefinition
{
~Base_Virtual_NonVirtualDtorWithDefinition();
virtual void VirtualFunction();
};
Base_Virtual_NonVirtualDtorWithDefinition::~Base_Virtual_NonVirtualDtorWithDefinition()
{
}
struct Base_Virtual_NonVirtualDtorWithInlineDefinition
{
~Base_Virtual_NonVirtualDtorWithInlineDefinition()
{
}
virtual void VirtualFunction();
};
struct Base_Virtual_ProtectedNonVirtualDtor
{
protected:
~Base_Virtual_ProtectedNonVirtualDtor();
public:
virtual void VirtualFunction();
};
struct Derived_Virtual_NoDtor : public Base_Virtual_NoDtor
{
};
struct Derived_Virtual_VirtualDtor : public Base_Virtual_VirtualDtor
{
};
struct Derived_Virtual_NonVirtualDtor : public Base_Virtual_NonVirtualDtor
{
};
struct Derived_Virtual_ImplicitDtor : public Base_Virtual_ImplicitDtor
{
};
struct Derived_Virtual_NonVirtualDtorWithDefinition: public Base_Virtual_NonVirtualDtorWithDefinition
{
};
struct Derived_Virtual_NonVirtualDtorWithInlineDefinition: public Base_Virtual_NonVirtualDtorWithInlineDefinition
{
};
struct Derived_Virtual_ProtectedNonVirtualDtor : public Base_Virtual_ProtectedNonVirtualDtor
{
};

View File

@@ -0,0 +1,3 @@
| NonVirtualDestructorInBaseClass.cpp:56:8:56:34 | Base_Virtual_NonVirtualDtor | Base classes with a virtual function must define a virtual destructor. |
| NonVirtualDestructorInBaseClass.cpp:68:8:68:48 | Base_Virtual_NonVirtualDtorWithDefinition | Base classes with a virtual function must define a virtual destructor. |
| NonVirtualDestructorInBaseClass.cpp:78:8:78:54 | Base_Virtual_NonVirtualDtorWithInlineDefinition | Base classes with a virtual function must define a virtual destructor. |

View File

@@ -0,0 +1 @@
Likely Bugs/OO/NonVirtualDestructorInBaseClass.ql