[clang] 03adb0e - [analyzer] Remove deprecated option VirtualCall:PureOnly (#131823)
via cfe-commits
cfe-commits at lists.llvm.org
Wed Mar 19 10:22:03 PDT 2025
Author: DonĂ¡t Nagy
Date: 2025-03-19T18:22:00+01:00
New Revision: 03adb0ec7dce36814b9e403e98e7471630c4a732
URL: https://github.com/llvm/llvm-project/commit/03adb0ec7dce36814b9e403e98e7471630c4a732
DIFF: https://github.com/llvm/llvm-project/commit/03adb0ec7dce36814b9e403e98e7471630c4a732.diff
LOG: [analyzer] Remove deprecated option VirtualCall:PureOnly (#131823)
VirtualCallChecker.cpp implements two related checkers:
- `optin.cplusplus.VirtualCall` which reports situations when
constructors or destructors call virtual methods (which is bugprone
because it does not trigger virtual dispatch, but can be legitmate).
- `cplusplus.PureVirtualCall` reports situations when constructors or
destructors call _pure_ virtual methods, which is an error.
Six years ago these two bug types were both reported by the same checker
(called `optin.cplusplus.VirtualCall`) and it had an option called
`PureOnly` which limited its output to the pure case.
When (in 2019) the two checker parts were separated by the commit
d3971fe97b64785c079d64bf4c8c3e2b5e1f85a1, the option `PureOnly` was
preserved for the sake of compatibility, but it is no longer useful
(when it is set to true, it just suppresses all reports from
`optin.cplusplus.VirtualCall`) so it was marked as deprecated.
I'm removing this deprecated option now because it is no longer relevant
and its presence caused minor complications when I was porting
`VirtualCallChecker.cpp` to the new multipart checker framework
(introduced in 27099982da2f5a6c2d282d6b385e79d080669546).
Added:
Modified:
clang/docs/ReleaseNotes.rst
clang/include/clang/StaticAnalyzer/Checkers/Checkers.td
clang/lib/StaticAnalyzer/Checkers/VirtualCallChecker.cpp
clang/test/Analysis/analyzer-config.c
clang/test/Analysis/virtualcall.cpp
Removed:
################################################################################
diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst
index 666bbf22acc93..ed5924b134b3c 100644
--- a/clang/docs/ReleaseNotes.rst
+++ b/clang/docs/ReleaseNotes.rst
@@ -491,6 +491,11 @@ Crash and bug fixes
Improvements
^^^^^^^^^^^^
+- The checker option ``optin.cplusplus.VirtualCall:PureOnly`` was removed,
+ because it had been deprecated since 2019 and it is completely useless (it
+ was kept only for compatibility with pre-2019 versions, setting it to true is
+ equivalent to completely disabling the checker).
+
Moved checkers
^^^^^^^^^^^^^^
diff --git a/clang/include/clang/StaticAnalyzer/Checkers/Checkers.td b/clang/include/clang/StaticAnalyzer/Checkers/Checkers.td
index 6632254955fe6..35df4e7003ac9 100644
--- a/clang/include/clang/StaticAnalyzer/Checkers/Checkers.td
+++ b/clang/include/clang/StaticAnalyzer/Checkers/Checkers.td
@@ -750,24 +750,14 @@ def UninitializedObjectChecker: Checker<"UninitializedObject">,
]>,
Documentation<HasDocumentation>;
-def VirtualCallChecker : Checker<"VirtualCall">,
- HelpText<"Check virtual function calls during construction/destruction">,
- CheckerOptions<[
- CmdLineOption<Boolean,
- "ShowFixIts",
- "Enable fix-it hints for this checker",
- "false",
- InAlpha>,
- CmdLineOption<Boolean,
- "PureOnly",
- "Disables the checker. Keeps cplusplus.PureVirtualCall "
- "enabled. This option is only provided for backwards "
- "compatibility.",
- "false",
- InAlpha>
- ]>,
- Dependencies<[VirtualCallModeling]>,
- Documentation<HasDocumentation>;
+def VirtualCallChecker
+ : Checker<"VirtualCall">,
+ HelpText<"Check virtual function calls during construction/destruction">,
+ CheckerOptions<[CmdLineOption<Boolean, "ShowFixIts",
+ "Enable fix-it hints for this checker",
+ "false", InAlpha>]>,
+ Dependencies<[VirtualCallModeling]>,
+ Documentation<HasDocumentation>;
} // end: "optin.cplusplus"
diff --git a/clang/lib/StaticAnalyzer/Checkers/VirtualCallChecker.cpp b/clang/lib/StaticAnalyzer/Checkers/VirtualCallChecker.cpp
index 33a9a07f9d32d..6d9c52e966022 100644
--- a/clang/lib/StaticAnalyzer/Checkers/VirtualCallChecker.cpp
+++ b/clang/lib/StaticAnalyzer/Checkers/VirtualCallChecker.cpp
@@ -214,14 +214,11 @@ void ento::registerPureVirtualCallChecker(CheckerManager &Mgr) {
void ento::registerVirtualCallChecker(CheckerManager &Mgr) {
auto *Chk = Mgr.getChecker<VirtualCallChecker>();
- if (!Mgr.getAnalyzerOptions().getCheckerBooleanOption(
- Mgr.getCurrentCheckerName(), "PureOnly")) {
- Chk->BT_Impure = std::make_unique<BugType>(
- Mgr.getCurrentCheckerName(), "Unexpected loss of virtual dispatch",
- categories::CXXObjectLifecycle);
- Chk->ShowFixIts = Mgr.getAnalyzerOptions().getCheckerBooleanOption(
- Mgr.getCurrentCheckerName(), "ShowFixIts");
- }
+ Chk->BT_Impure = std::make_unique<BugType>(
+ Mgr.getCurrentCheckerName(), "Unexpected loss of virtual dispatch",
+ categories::CXXObjectLifecycle);
+ Chk->ShowFixIts = Mgr.getAnalyzerOptions().getCheckerBooleanOption(
+ Mgr.getCurrentCheckerName(), "ShowFixIts");
}
bool ento::shouldRegisterVirtualCallModeling(const CheckerManager &mgr) {
diff --git a/clang/test/Analysis/analyzer-config.c b/clang/test/Analysis/analyzer-config.c
index 00177769f3243..80cad54b039f4 100644
--- a/clang/test/Analysis/analyzer-config.c
+++ b/clang/test/Analysis/analyzer-config.c
@@ -108,7 +108,6 @@
// CHECK-NEXT: optin.cplusplus.UninitializedObject:IgnoreRecordsWithField = ""
// CHECK-NEXT: optin.cplusplus.UninitializedObject:NotesAsWarnings = false
// CHECK-NEXT: optin.cplusplus.UninitializedObject:Pedantic = false
-// CHECK-NEXT: optin.cplusplus.VirtualCall:PureOnly = false
// CHECK-NEXT: optin.cplusplus.VirtualCall:ShowFixIts = false
// CHECK-NEXT: optin.osx.cocoa.localizability.NonLocalizedStringChecker:AggressiveReport = false
// CHECK-NEXT: optin.performance.Padding:AllowedPad = 24
diff --git a/clang/test/Analysis/virtualcall.cpp b/clang/test/Analysis/virtualcall.cpp
index 80f89d14ea97c..82285b6d12844 100644
--- a/clang/test/Analysis/virtualcall.cpp
+++ b/clang/test/Analysis/virtualcall.cpp
@@ -6,29 +6,11 @@
// RUN: -analyzer-checker=debug.ExprInspection \
// RUN: -std=c++11 -verify=pure -std=c++11 %s
-// RUN: %clang_analyze_cc1 -analyzer-checker=core,optin.cplusplus.VirtualCall \
-// RUN: -analyzer-config \
-// RUN: optin.cplusplus.VirtualCall:PureOnly=true \
-// RUN: -analyzer-checker=debug.ExprInspection \
-// RUN: -std=c++11 -verify=none %s
-
// RUN: %clang_analyze_cc1 -analyzer-checker=core,cplusplus.PureVirtualCall \
// RUN: -analyzer-checker=optin.cplusplus.VirtualCall \
// RUN: -analyzer-checker=debug.ExprInspection \
// RUN: -std=c++11 -verify=pure,impure -std=c++11 %s
-// RUN: %clang_analyze_cc1 -analyzer-checker=core,cplusplus.PureVirtualCall \
-// RUN: -analyzer-checker=optin.cplusplus.VirtualCall \
-// RUN: -analyzer-config \
-// RUN: optin.cplusplus.VirtualCall:PureOnly=true \
-// RUN: -analyzer-checker=debug.ExprInspection \
-// RUN: -std=c++11 -verify=pure %s
-
-
-// We expect no diagnostics when all checks are disabled.
-// none-no-diagnostics
-
-
#include "virtualcall.h"
void clang_analyzer_warnIfReached();
More information about the cfe-commits
mailing list