From 13b4352bd98ae68f5f551e0299a74e445e4ad880 Mon Sep 17 00:00:00 2001 From: Jan Schlosser Date: Thu, 8 Oct 2026 16:13:36 +0200 Subject: [PATCH] Fix RULE-13-3-1 false positives for implicit destructors The query reported implicitly declared destructors of classes deriving from a class with a virtual destructor as overriding without 'override' or 'final'. The rule applies to user-declared member functions only, and an implicit destructor cannot carry those specifiers. Exclude compiler-generated member functions and add regression tests for a class without any destructor declaration and one with only a user-declared constructor. --- ...26-10-08-fix-fp-rule-13-3-1-implicit-destructor.md | 5 +++++ .../MemberSpecifiersNotUsedAppropriately.ql | 3 +++ cpp/misra/test/rules/RULE-13-3-1/test.cpp | 11 ++++++++++- 3 files changed, 18 insertions(+), 1 deletion(-) create mode 100644 change_notes/2026-10-08-fix-fp-rule-13-3-1-implicit-destructor.md diff --git a/change_notes/2026-10-08-fix-fp-rule-13-3-1-implicit-destructor.md b/change_notes/2026-10-08-fix-fp-rule-13-3-1-implicit-destructor.md new file mode 100644 index 0000000000..b60b87455e --- /dev/null +++ b/change_notes/2026-10-08-fix-fp-rule-13-3-1-implicit-destructor.md @@ -0,0 +1,5 @@ +- `RULE-13-3-1` - `MemberSpecifiersNotUsedAppropriately.ql`: + - Fixed false positives on implicitly declared member functions, most + commonly the implicit destructor of a class deriving from a class with a + virtual destructor. The rule applies to user-declared member functions + only, and an implicit destructor cannot carry `override` or `final`. diff --git a/cpp/misra/src/rules/RULE-13-3-1/MemberSpecifiersNotUsedAppropriately.ql b/cpp/misra/src/rules/RULE-13-3-1/MemberSpecifiersNotUsedAppropriately.ql index 3bd2a4bb96..78c778ee4c 100644 --- a/cpp/misra/src/rules/RULE-13-3-1/MemberSpecifiersNotUsedAppropriately.ql +++ b/cpp/misra/src/rules/RULE-13-3-1/MemberSpecifiersNotUsedAppropriately.ql @@ -20,6 +20,9 @@ import codingstandards.cpp.misra from MemberFunction f, string message where not isExcluded(f, Classes2Package::memberSpecifiersNotUsedAppropriatelyQuery()) and + // Only user-declared member functions are in scope, not implicitly declared + // ones such as an implicit destructor. + not f.isCompilerGenerated() and ( // Case 1: Specifiers incompatible with explicitly virtual f.isDeclaredVirtual() and diff --git a/cpp/misra/test/rules/RULE-13-3-1/test.cpp b/cpp/misra/test/rules/RULE-13-3-1/test.cpp index 5474d5e6d6..83f786af27 100644 --- a/cpp/misra/test/rules/RULE-13-3-1/test.cpp +++ b/cpp/misra/test/rules/RULE-13-3-1/test.cpp @@ -104,4 +104,13 @@ class C15 : public NonvirtualDestructorBase { public: virtual ~C15() = default; // COMPLIANT: Note that this does not violate rule 6.4.2 -}; \ No newline at end of file +}; + +class C16 : public VirtualDestructorBase { + // COMPLIANT: the destructor is implicitly declared, not user-declared +}; + +class C17 : public VirtualDestructorBase { +public: + C17() = default; // COMPLIANT: implicit virtual destructor not user-declared +};