https://github.com/dvbuka updated https://github.com/llvm/llvm-project/pull/164566
>From 4640cf73b874a90acd4799b6a710d6139fcd08cb Mon Sep 17 00:00:00 2001 From: Dasha Buka <[email protected]> Date: Wed, 22 Oct 2025 00:17:46 -0700 Subject: [PATCH 1/9] Move check cert-oop58-cpp => bugprone-mutating-copy --- .../bugprone/BugproneTidyModule.cpp | 2 + .../clang-tidy/bugprone/CMakeLists.txt | 1 + .../{cert => bugprone}/MutatingCopyCheck.cpp | 4 +- .../{cert => bugprone}/MutatingCopyCheck.h | 12 +- .../clang-tidy/cert/CERTTidyModule.cpp | 4 +- .../clang-tidy/cert/CMakeLists.txt | 1 - .../checks/bugprone/mutating-copy.rst | 11 ++ .../docs/clang-tidy/checks/cert/oop58-cpp.rst | 11 +- .../checkers/bugprone/mutating-copy.cpp | 149 ++++++++++++++++++ 9 files changed, 178 insertions(+), 17 deletions(-) rename clang-tools-extra/clang-tidy/{cert => bugprone}/MutatingCopyCheck.cpp (97%) rename clang-tools-extra/clang-tidy/{cert => bugprone}/MutatingCopyCheck.h (73%) create mode 100644 clang-tools-extra/docs/clang-tidy/checks/bugprone/mutating-copy.rst create mode 100644 clang-tools-extra/test/clang-tidy/checkers/bugprone/mutating-copy.cpp diff --git a/clang-tools-extra/clang-tidy/bugprone/BugproneTidyModule.cpp b/clang-tools-extra/clang-tidy/bugprone/BugproneTidyModule.cpp index e6115f67656bc..79851be690759 100644 --- a/clang-tools-extra/clang-tidy/bugprone/BugproneTidyModule.cpp +++ b/clang-tools-extra/clang-tidy/bugprone/BugproneTidyModule.cpp @@ -52,6 +52,7 @@ #include "MultiLevelImplicitPointerConversionCheck.h" #include "MultipleNewInOneExpressionCheck.h" #include "MultipleStatementMacroCheck.h" +#include "MutatingCopyCheck.h" #include "NarrowingConversionsCheck.h" #include "NoEscapeCheck.h" #include "NonZeroEnumToBoolConversionCheck.h" @@ -198,6 +199,7 @@ class BugproneModule : public ClangTidyModule { "bugprone-multiple-new-in-one-expression"); CheckFactories.registerCheck<MultipleStatementMacroCheck>( "bugprone-multiple-statement-macro"); + CheckFactories.registerCheck<MutatingCopyCheck>("bugprone-mutating-copy"); CheckFactories.registerCheck<NondeterministicPointerIterationOrderCheck>( "bugprone-nondeterministic-pointer-iteration-order"); CheckFactories.registerCheck<OptionalValueConversionCheck>( diff --git a/clang-tools-extra/clang-tidy/bugprone/CMakeLists.txt b/clang-tools-extra/clang-tidy/bugprone/CMakeLists.txt index c8943e5b22ef8..0dfcd3270cac2 100644 --- a/clang-tools-extra/clang-tidy/bugprone/CMakeLists.txt +++ b/clang-tools-extra/clang-tidy/bugprone/CMakeLists.txt @@ -53,6 +53,7 @@ add_clang_library(clangTidyBugproneModule STATIC MultiLevelImplicitPointerConversionCheck.cpp MultipleNewInOneExpressionCheck.cpp MultipleStatementMacroCheck.cpp + MutatingCopyCheck.cpp NarrowingConversionsCheck.cpp NoEscapeCheck.cpp NonZeroEnumToBoolConversionCheck.cpp diff --git a/clang-tools-extra/clang-tidy/cert/MutatingCopyCheck.cpp b/clang-tools-extra/clang-tidy/bugprone/MutatingCopyCheck.cpp similarity index 97% rename from clang-tools-extra/clang-tidy/cert/MutatingCopyCheck.cpp rename to clang-tools-extra/clang-tidy/bugprone/MutatingCopyCheck.cpp index fb9d72ce6bd31..9485270864618 100644 --- a/clang-tools-extra/clang-tidy/cert/MutatingCopyCheck.cpp +++ b/clang-tools-extra/clang-tidy/bugprone/MutatingCopyCheck.cpp @@ -12,7 +12,7 @@ using namespace clang::ast_matchers; -namespace clang::tidy::cert { +namespace clang::tidy::bugprone { static constexpr llvm::StringLiteral SourceDeclName = "ChangedPVD"; static constexpr llvm::StringLiteral MutatingOperatorName = "MutatingOp"; @@ -69,4 +69,4 @@ void MutatingCopyCheck::check(const MatchFinder::MatchResult &Result) { diag(Assignment->getBeginLoc(), "mutating copied object"); } -} // namespace clang::tidy::cert +} // namespace clang::tidy::bugprone diff --git a/clang-tools-extra/clang-tidy/cert/MutatingCopyCheck.h b/clang-tools-extra/clang-tidy/bugprone/MutatingCopyCheck.h similarity index 73% rename from clang-tools-extra/clang-tidy/cert/MutatingCopyCheck.h rename to clang-tools-extra/clang-tidy/bugprone/MutatingCopyCheck.h index c211fa004120c..9d2c8f12f65fa 100644 --- a/clang-tools-extra/clang-tidy/cert/MutatingCopyCheck.h +++ b/clang-tools-extra/clang-tidy/bugprone/MutatingCopyCheck.h @@ -6,18 +6,18 @@ // //===----------------------------------------------------------------------===// -#ifndef LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_CERT_MUTATINGCOPYCHECK_H -#define LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_CERT_MUTATINGCOPYCHECK_H +#ifndef LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_BUGPRONE_MUTATINGCOPYCHECK_H +#define LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_BUGPRONE_MUTATINGCOPYCHECK_H #include "../ClangTidyCheck.h" -namespace clang::tidy::cert { +namespace clang::tidy::bugprone { /// Finds assignments to the copied object and its direct or indirect members /// in copy constructors and copy assignment operators. /// /// For the user-facing documentation see: -/// https://clang.llvm.org/extra/clang-tidy/checks/cert/oop58-cpp.html +/// https://clang.llvm.org/extra/clang-tidy/checks/bugprone/mutating-copy.html class MutatingCopyCheck : public ClangTidyCheck { public: MutatingCopyCheck(StringRef Name, ClangTidyContext *Context) @@ -29,6 +29,6 @@ class MutatingCopyCheck : public ClangTidyCheck { void check(const ast_matchers::MatchFinder::MatchResult &Result) override; }; -} // namespace clang::tidy::cert +} // namespace clang::tidy::bugprone -#endif // LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_CERT_MUTATINGCOPYCHECK_H +#endif // LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_BUGPRONE_MUTATINGCOPYCHECK_H diff --git a/clang-tools-extra/clang-tidy/cert/CERTTidyModule.cpp b/clang-tools-extra/clang-tidy/cert/CERTTidyModule.cpp index c1ca2cec7a1eb..01f33371f52cc 100644 --- a/clang-tools-extra/clang-tidy/cert/CERTTidyModule.cpp +++ b/clang-tools-extra/clang-tidy/cert/CERTTidyModule.cpp @@ -11,6 +11,7 @@ #include "../ClangTidyModuleRegistry.h" #include "../bugprone/BadSignalToKillThreadCheck.h" #include "../bugprone/CommandProcessorCheck.h" +#include "../bugprone/MutatingCopyCheck.h" #include "../bugprone/PointerArithmeticOnPolymorphicObjectCheck.h" #include "../bugprone/ReservedIdentifierCheck.h" #include "../bugprone/SignalHandlerCheck.h" @@ -38,7 +39,6 @@ #include "DontModifyStdNamespaceCheck.h" #include "FloatLoopCounter.h" #include "LimitedRandomnessCheck.h" -#include "MutatingCopyCheck.h" #include "NonTrivialTypesLibcMemoryCallsCheck.h" #include "ProperlySeededRandomGeneratorCheck.h" #include "ThrownExceptionTypeCheck.h" @@ -280,7 +280,7 @@ class CERTModule : public ClangTidyModule { "cert-oop54-cpp"); CheckFactories.registerCheck<NonTrivialTypesLibcMemoryCallsCheck>( "cert-oop57-cpp"); - CheckFactories.registerCheck<MutatingCopyCheck>("cert-oop58-cpp"); + CheckFactories.registerCheck<bugprone::MutatingCopyCheck>("cert-oop58-cpp"); // C checkers // ARR diff --git a/clang-tools-extra/clang-tidy/cert/CMakeLists.txt b/clang-tools-extra/clang-tidy/cert/CMakeLists.txt index 453d1d30921e9..0feaf204f8ef4 100644 --- a/clang-tools-extra/clang-tidy/cert/CMakeLists.txt +++ b/clang-tools-extra/clang-tidy/cert/CMakeLists.txt @@ -9,7 +9,6 @@ add_clang_library(clangTidyCERTModule STATIC DontModifyStdNamespaceCheck.cpp FloatLoopCounter.cpp LimitedRandomnessCheck.cpp - MutatingCopyCheck.cpp NonTrivialTypesLibcMemoryCallsCheck.cpp ProperlySeededRandomGeneratorCheck.cpp ThrownExceptionTypeCheck.cpp diff --git a/clang-tools-extra/docs/clang-tidy/checks/bugprone/mutating-copy.rst b/clang-tools-extra/docs/clang-tidy/checks/bugprone/mutating-copy.rst new file mode 100644 index 0000000000000..137659ea43791 --- /dev/null +++ b/clang-tools-extra/docs/clang-tidy/checks/bugprone/mutating-copy.rst @@ -0,0 +1,11 @@ +.. title:: clang-tidy - bugprone-mutating-copy + +bugprone-mutating-copy +====================== + +Finds assignments to the copied object and its direct or indirect members +in copy constructors and copy assignment operators. + +This check corresponds to the CERT C Coding Standard rule +`OOP58-CPP. Copy operations must not mutate the source object +<https://wiki.sei.cmu.edu/confluence/display/cplusplus/OOP58-CPP.+Copy+operations+must+not+mutate+the+source+object>`_. \ No newline at end of file diff --git a/clang-tools-extra/docs/clang-tidy/checks/cert/oop58-cpp.rst b/clang-tools-extra/docs/clang-tidy/checks/cert/oop58-cpp.rst index 399fb1b7e9279..6f16d9c548279 100644 --- a/clang-tools-extra/docs/clang-tidy/checks/cert/oop58-cpp.rst +++ b/clang-tools-extra/docs/clang-tidy/checks/cert/oop58-cpp.rst @@ -1,11 +1,10 @@ .. title:: clang-tidy - cert-mutating-copy +.. meta:: + :http-equiv=refresh: 5;URL=../bugprone/mutating-copy.html cert-oop58-cpp ============== -Finds assignments to the copied object and its direct or indirect members -in copy constructors and copy assignment operators. - -This check corresponds to the CERT C Coding Standard rule -`OOP58-CPP. Copy operations must not mutate the source object -<https://wiki.sei.cmu.edu/confluence/display/cplusplus/OOP58-CPP.+Copy+operations+must+not+mutate+the+source+object>`_. +The `cert-oop58-cpp` check is an alias, please see +:doc:`bugprone-mutating-copy <../bugprone/mutating-copy>` +for more information. \ No newline at end of file diff --git a/clang-tools-extra/test/clang-tidy/checkers/bugprone/mutating-copy.cpp b/clang-tools-extra/test/clang-tidy/checkers/bugprone/mutating-copy.cpp new file mode 100644 index 0000000000000..8b93aa3ee54fc --- /dev/null +++ b/clang-tools-extra/test/clang-tidy/checkers/bugprone/mutating-copy.cpp @@ -0,0 +1,149 @@ +// RUN: %check_clang_tidy %s bugprone-mutating-copy %t + +// Example test cases from CERT rule +// https://wiki.sei.cmu.edu/confluence/display/cplusplus/OOP58-CPP.+Copy+operations+must+not+mutate+the+source+object +namespace test_mutating_noncompliant_example { +class A { + mutable int m; + +public: + A() : m(0) {} + explicit A(int m) : m(m) {} + + A(const A &other) : m(other.m) { + other.m = 0; + // CHECK-MESSAGES: :[[@LINE-1]]:5: warning: mutating copied object + } + + A &operator=(const A &other) { + if (&other != this) { + m = other.m; + other.m = 0; + // CHECK-MESSAGES: :[[@LINE-1]]:7: warning: mutating copied object + } + return *this; + } + + int get_m() const { return m; } +}; +} // namespace test_mutating_noncompliant_example + +namespace test_mutating_compliant_example { +class B { + int m; + +public: + B() : m(0) {} + explicit B(int m) : m(m) {} + + B(const B &other) : m(other.m) {} + B(B &&other) : m(other.m) { + other.m = 0; //no-warning: mutation allowed in move constructor + } + + B &operator=(const B &other) { + if (&other != this) { + m = other.m; + } + return *this; + } + + B &operator=(B &&other) { + m = other.m; + other.m = 0; //no-warning: mutation allowed in move assignment operator + return *this; + } + + int get_m() const { return m; } +}; +} // namespace test_mutating_compliant_example + +namespace test_mutating_pointer { +class C { + C *ptr; + int value; + + C(); + C(C &other) { + other = {}; + // CHECK-MESSAGES: :[[@LINE-1]]:5: warning: mutating copied object + other.ptr = nullptr; + // CHECK-MESSAGES: :[[@LINE-1]]:5: warning: mutating copied object + other.value = 0; + // CHECK-MESSAGES: :[[@LINE-1]]:5: warning: mutating copied object + + // no-warning: mutating a pointee is allowed + other.ptr->value = 0; + *other.ptr = {}; + } +}; +} // namespace test_mutating_pointer + +namespace test_mutating_indirect_member { +struct S { + int x; +}; + +class D { + S s; + D(D &other) { + other.s = {}; + // CHECK-MESSAGES: :[[@LINE-1]]:5: warning: mutating copied object + other.s.x = 0; + // CHECK-MESSAGES: :[[@LINE-1]]:5: warning: mutating copied object + } +}; +} // namespace test_mutating_indirect_member + +namespace test_mutating_other_object { +class E { + E(); + E(E &other) { + E tmp; + // no-warning: mutating an object that is not the source is allowed + tmp = {}; + } +}; +} // namespace test_mutating_other_object + +namespace test_mutating_member_function { +class F { + int a; + +public: + void bad_func() { a = 12; } + void fine_func() const; + void fine_func_2(int x) { x = 5; } + void questionable_func(); + + F(F &other) : a(other.a) { + this->bad_func(); // no-warning: mutating this is allowed + + other.bad_func(); + // CHECK-MESSAGES: :[[@LINE-1]]:5: warning: call mutates copied object + + other.fine_func(); + other.fine_func_2(42); + other.questionable_func(); + } +}; +} // namespace test_mutating_member_function + +namespace test_mutating_function_on_nested_object { +struct S { + int x; + void mutate(int y) { + x = y; + } +}; + +class G { + S s; + G(G &other) { + s.mutate(0); // no-warning: mutating this is allowed + + other.s.mutate(0); + // CHECK-MESSAGES: :[[@LINE-1]]:5: warning: call mutates copied object + } +}; +} // namespace test_mutating_function_on_nested_object >From 571e46ab18cbfdcd6f55a96bbb8007d5acf6ceba Mon Sep 17 00:00:00 2001 From: Dasha Buka <[email protected]> Date: Wed, 22 Oct 2025 00:35:13 -0700 Subject: [PATCH 2/9] Add mutating-copy rename to release notes and checks list --- clang-tools-extra/docs/ReleaseNotes.rst | 5 +++++ clang-tools-extra/docs/clang-tidy/checks/list.rst | 3 ++- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/clang-tools-extra/docs/ReleaseNotes.rst b/clang-tools-extra/docs/ReleaseNotes.rst index 8a0151f567c24..17a2b5c7f9fe1 100644 --- a/clang-tools-extra/docs/ReleaseNotes.rst +++ b/clang-tools-extra/docs/ReleaseNotes.rst @@ -249,6 +249,11 @@ New check aliases <clang-tidy/checks/bugprone/throwing-static-initialization>` keeping initial check as an alias to the new one. +- Renamed :doc:`cert-oop58-cpp <clang-tidy/checks/cert/oop58-cpp>` to + :doc:`bugprone-throwing-static-initialization + <clang-tidy/checks/bugprone/mutating-copy>` + keeping initial check as an alias to the new one. + Changes in existing checks ^^^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/clang-tools-extra/docs/clang-tidy/checks/list.rst b/clang-tools-extra/docs/clang-tidy/checks/list.rst index a324d18704c01..c7fa88ab0a2e3 100644 --- a/clang-tools-extra/docs/clang-tidy/checks/list.rst +++ b/clang-tools-extra/docs/clang-tidy/checks/list.rst @@ -117,6 +117,7 @@ Clang-Tidy Checks :doc:`bugprone-misplaced-pointer-arithmetic-in-alloc <bugprone/misplaced-pointer-arithmetic-in-alloc>`, "Yes" :doc:`bugprone-misplaced-widening-cast <bugprone/misplaced-widening-cast>`, :doc:`bugprone-move-forwarding-reference <bugprone/move-forwarding-reference>`, "Yes" + :doc:`bugprone-mutatinb-copy <bugprone/mutating-copy>`, :doc:`bugprone-multi-level-implicit-pointer-conversion <bugprone/multi-level-implicit-pointer-conversion>`, :doc:`bugprone-multiple-new-in-one-expression <bugprone/multiple-new-in-one-expression>`, :doc:`bugprone-multiple-statement-macro <bugprone/multiple-statement-macro>`, @@ -180,7 +181,6 @@ Clang-Tidy Checks :doc:`cert-mem57-cpp <cert/mem57-cpp>`, :doc:`cert-msc50-cpp <cert/msc50-cpp>`, :doc:`cert-msc51-cpp <cert/msc51-cpp>`, - :doc:`cert-oop57-cpp <cert/oop57-cpp>`, :doc:`cert-oop58-cpp <cert/oop58-cpp>`, :doc:`concurrency-mt-unsafe <concurrency/mt-unsafe>`, :doc:`concurrency-thread-canceltype-asynchronous <concurrency/thread-canceltype-asynchronous>`, @@ -458,6 +458,7 @@ Check aliases :doc:`cert-msc54-cpp <cert/msc54-cpp>`, :doc:`bugprone-signal-handler <bugprone/signal-handler>`, :doc:`cert-oop11-cpp <cert/oop11-cpp>`, :doc:`performance-move-constructor-init <performance/move-constructor-init>`, :doc:`cert-oop54-cpp <cert/oop54-cpp>`, :doc:`bugprone-unhandled-self-assignment <bugprone/unhandled-self-assignment>`, + :doc:`cert-oop58-cpp <cert/oop58-cpp>`, :doc:`bugprone-mutating-copy <bugprone/mutating-copy>`, :doc:`cert-pos44-c <cert/pos44-c>`, :doc:`bugprone-bad-signal-to-kill-thread <bugprone/bad-signal-to-kill-thread>`, :doc:`cert-pos47-c <cert/pos47-c>`, :doc:`concurrency-thread-canceltype-asynchronous <concurrency/thread-canceltype-asynchronous>`, :doc:`cert-sig30-c <cert/sig30-c>`, :doc:`bugprone-signal-handler <bugprone/signal-handler>`, >From c0786cd31f7df405ec6e099581c159e9af25584a Mon Sep 17 00:00:00 2001 From: Dasha Buka <[email protected]> Date: Sat, 25 Oct 2025 10:25:29 -0700 Subject: [PATCH 3/9] Rename oop8-cpp check to copy-constructor-mutates-argument --- .../bugprone/BugproneTidyModule.cpp | 5 +- .../clang-tidy/bugprone/CMakeLists.txt | 2 +- ...> CopyConstructorMutatesArgumentCheck.cpp} | 8 +- ... => CopyConstructorMutatesArgumentCheck.h} | 12 +- .../clang-tidy/cert/CERTTidyModule.cpp | 5 +- clang-tools-extra/docs/ReleaseNotes.rst | 4 +- ... => copy-constructor-mutates-argument.rst} | 4 +- .../docs/clang-tidy/checks/cert/oop58-cpp.rst | 6 +- .../docs/clang-tidy/checks/list.rst | 4 +- .../copy-constructor-mutates-argument.cpp} | 0 .../checkers/bugprone/mutating-copy.cpp | 149 ------------------ 11 files changed, 27 insertions(+), 172 deletions(-) rename clang-tools-extra/clang-tidy/bugprone/{MutatingCopyCheck.cpp => CopyConstructorMutatesArgumentCheck.cpp} (91%) rename clang-tools-extra/clang-tidy/bugprone/{MutatingCopyCheck.h => CopyConstructorMutatesArgumentCheck.h} (65%) rename clang-tools-extra/docs/clang-tidy/checks/bugprone/{mutating-copy.rst => copy-constructor-mutates-argument.rst} (78%) rename clang-tools-extra/test/clang-tidy/checkers/{cert/oop58-cpp.cpp => bugprone/copy-constructor-mutates-argument.cpp} (100%) delete mode 100644 clang-tools-extra/test/clang-tidy/checkers/bugprone/mutating-copy.cpp diff --git a/clang-tools-extra/clang-tidy/bugprone/BugproneTidyModule.cpp b/clang-tools-extra/clang-tidy/bugprone/BugproneTidyModule.cpp index 79851be690759..3f1379b8f1532 100644 --- a/clang-tools-extra/clang-tidy/bugprone/BugproneTidyModule.cpp +++ b/clang-tools-extra/clang-tidy/bugprone/BugproneTidyModule.cpp @@ -22,6 +22,7 @@ #include "CommandProcessorCheck.h" #include "ComparePointerToMemberVirtualFunctionCheck.h" #include "CopyConstructorInitCheck.h" +#include "CopyConstructorMutatesArgumentCheck.h" #include "CrtpConstructorAccessibilityCheck.h" #include "DanglingHandleCheck.h" #include "DerivedMethodShadowingBaseMethodCheck.h" @@ -52,7 +53,6 @@ #include "MultiLevelImplicitPointerConversionCheck.h" #include "MultipleNewInOneExpressionCheck.h" #include "MultipleStatementMacroCheck.h" -#include "MutatingCopyCheck.h" #include "NarrowingConversionsCheck.h" #include "NoEscapeCheck.h" #include "NonZeroEnumToBoolConversionCheck.h" @@ -199,7 +199,8 @@ class BugproneModule : public ClangTidyModule { "bugprone-multiple-new-in-one-expression"); CheckFactories.registerCheck<MultipleStatementMacroCheck>( "bugprone-multiple-statement-macro"); - CheckFactories.registerCheck<MutatingCopyCheck>("bugprone-mutating-copy"); + CheckFactories.registerCheck<CopyConstructorMutatesArgumentCheck>( + "bugprone-copy-constructor-mutates-argument"); CheckFactories.registerCheck<NondeterministicPointerIterationOrderCheck>( "bugprone-nondeterministic-pointer-iteration-order"); CheckFactories.registerCheck<OptionalValueConversionCheck>( diff --git a/clang-tools-extra/clang-tidy/bugprone/CMakeLists.txt b/clang-tools-extra/clang-tidy/bugprone/CMakeLists.txt index 0dfcd3270cac2..e9b149f3f44e8 100644 --- a/clang-tools-extra/clang-tidy/bugprone/CMakeLists.txt +++ b/clang-tools-extra/clang-tidy/bugprone/CMakeLists.txt @@ -53,7 +53,7 @@ add_clang_library(clangTidyBugproneModule STATIC MultiLevelImplicitPointerConversionCheck.cpp MultipleNewInOneExpressionCheck.cpp MultipleStatementMacroCheck.cpp - MutatingCopyCheck.cpp + CopyConstructorMutatesArgumentCheck.cpp NarrowingConversionsCheck.cpp NoEscapeCheck.cpp NonZeroEnumToBoolConversionCheck.cpp diff --git a/clang-tools-extra/clang-tidy/bugprone/MutatingCopyCheck.cpp b/clang-tools-extra/clang-tidy/bugprone/CopyConstructorMutatesArgumentCheck.cpp similarity index 91% rename from clang-tools-extra/clang-tidy/bugprone/MutatingCopyCheck.cpp rename to clang-tools-extra/clang-tidy/bugprone/CopyConstructorMutatesArgumentCheck.cpp index 9485270864618..cbbb1a0070a02 100644 --- a/clang-tools-extra/clang-tidy/bugprone/MutatingCopyCheck.cpp +++ b/clang-tools-extra/clang-tidy/bugprone/CopyConstructorMutatesArgumentCheck.cpp @@ -6,7 +6,7 @@ // //===----------------------------------------------------------------------===// -#include "MutatingCopyCheck.h" +#include "CopyConstructorMutatesArgumentCheck.h" #include "clang/AST/ASTContext.h" #include "clang/ASTMatchers/ASTMatchFinder.h" @@ -18,7 +18,8 @@ static constexpr llvm::StringLiteral SourceDeclName = "ChangedPVD"; static constexpr llvm::StringLiteral MutatingOperatorName = "MutatingOp"; static constexpr llvm::StringLiteral MutatingCallName = "MutatingCall"; -void MutatingCopyCheck::registerMatchers(MatchFinder *Finder) { +void CopyConstructorMutatesArgumentCheck::registerMatchers( + MatchFinder *Finder) { const auto MemberExprOrSourceObject = anyOf( memberExpr(), declRefExpr(to(decl(equalsBoundNode(std::string(SourceDeclName)))))); @@ -60,7 +61,8 @@ void MutatingCopyCheck::registerMatchers(MatchFinder *Finder) { this); } -void MutatingCopyCheck::check(const MatchFinder::MatchResult &Result) { +void CopyConstructorMutatesArgumentCheck::check( + const MatchFinder::MatchResult &Result) { if (const auto *MemberCall = Result.Nodes.getNodeAs<CXXMemberCallExpr>(MutatingCallName)) diag(MemberCall->getBeginLoc(), "call mutates copied object"); diff --git a/clang-tools-extra/clang-tidy/bugprone/MutatingCopyCheck.h b/clang-tools-extra/clang-tidy/bugprone/CopyConstructorMutatesArgumentCheck.h similarity index 65% rename from clang-tools-extra/clang-tidy/bugprone/MutatingCopyCheck.h rename to clang-tools-extra/clang-tidy/bugprone/CopyConstructorMutatesArgumentCheck.h index 9d2c8f12f65fa..c573fd3a49348 100644 --- a/clang-tools-extra/clang-tidy/bugprone/MutatingCopyCheck.h +++ b/clang-tools-extra/clang-tidy/bugprone/CopyConstructorMutatesArgumentCheck.h @@ -6,8 +6,8 @@ // //===----------------------------------------------------------------------===// -#ifndef LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_BUGPRONE_MUTATINGCOPYCHECK_H -#define LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_BUGPRONE_MUTATINGCOPYCHECK_H +#ifndef LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_BUGPRONE_COPYCONSTRUCTORMUTATESARGUMENT_H +#define LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_BUGPRONE_COPYCONSTRUCTORMUTATESARGUMENT_H #include "../ClangTidyCheck.h" @@ -17,10 +17,10 @@ namespace clang::tidy::bugprone { /// in copy constructors and copy assignment operators. /// /// For the user-facing documentation see: -/// https://clang.llvm.org/extra/clang-tidy/checks/bugprone/mutating-copy.html -class MutatingCopyCheck : public ClangTidyCheck { +/// https://clang.llvm.org/extra/clang-tidy/checks/bugprone/copy-constructor-mutates-argument.html +class CopyConstructorMutatesArgumentCheck : public ClangTidyCheck { public: - MutatingCopyCheck(StringRef Name, ClangTidyContext *Context) + CopyConstructorMutatesArgumentCheck(StringRef Name, ClangTidyContext *Context) : ClangTidyCheck(Name, Context) {} bool isLanguageVersionSupported(const LangOptions &LangOpts) const override { return LangOpts.CPlusPlus; @@ -31,4 +31,4 @@ class MutatingCopyCheck : public ClangTidyCheck { } // namespace clang::tidy::bugprone -#endif // LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_BUGPRONE_MUTATINGCOPYCHECK_H +#endif // LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_BUGPRONE_COPYCONSTRUCTORMUTATESARGUMENT_H diff --git a/clang-tools-extra/clang-tidy/cert/CERTTidyModule.cpp b/clang-tools-extra/clang-tidy/cert/CERTTidyModule.cpp index 01f33371f52cc..11cd9ec353ce6 100644 --- a/clang-tools-extra/clang-tidy/cert/CERTTidyModule.cpp +++ b/clang-tools-extra/clang-tidy/cert/CERTTidyModule.cpp @@ -11,7 +11,7 @@ #include "../ClangTidyModuleRegistry.h" #include "../bugprone/BadSignalToKillThreadCheck.h" #include "../bugprone/CommandProcessorCheck.h" -#include "../bugprone/MutatingCopyCheck.h" +#include "../bugprone/CopyConstructorMutatesArgumentCheck.h" #include "../bugprone/PointerArithmeticOnPolymorphicObjectCheck.h" #include "../bugprone/ReservedIdentifierCheck.h" #include "../bugprone/SignalHandlerCheck.h" @@ -280,7 +280,8 @@ class CERTModule : public ClangTidyModule { "cert-oop54-cpp"); CheckFactories.registerCheck<NonTrivialTypesLibcMemoryCallsCheck>( "cert-oop57-cpp"); - CheckFactories.registerCheck<bugprone::MutatingCopyCheck>("cert-oop58-cpp"); + CheckFactories.registerCheck<bugprone::CopyConstructorMutatesArgumentCheck>( + "cert-oop58-cpp"); // C checkers // ARR diff --git a/clang-tools-extra/docs/ReleaseNotes.rst b/clang-tools-extra/docs/ReleaseNotes.rst index 17a2b5c7f9fe1..f339a512f35ac 100644 --- a/clang-tools-extra/docs/ReleaseNotes.rst +++ b/clang-tools-extra/docs/ReleaseNotes.rst @@ -250,8 +250,8 @@ New check aliases keeping initial check as an alias to the new one. - Renamed :doc:`cert-oop58-cpp <clang-tidy/checks/cert/oop58-cpp>` to - :doc:`bugprone-throwing-static-initialization - <clang-tidy/checks/bugprone/mutating-copy>` + :doc:`bugprone-copy-constructor-mutates-argument + <clang-tidy/checks/bugprone/copy-constructor-mutates-argument>` keeping initial check as an alias to the new one. Changes in existing checks diff --git a/clang-tools-extra/docs/clang-tidy/checks/bugprone/mutating-copy.rst b/clang-tools-extra/docs/clang-tidy/checks/bugprone/copy-constructor-mutates-argument.rst similarity index 78% rename from clang-tools-extra/docs/clang-tidy/checks/bugprone/mutating-copy.rst rename to clang-tools-extra/docs/clang-tidy/checks/bugprone/copy-constructor-mutates-argument.rst index 137659ea43791..95c295405d32a 100644 --- a/clang-tools-extra/docs/clang-tidy/checks/bugprone/mutating-copy.rst +++ b/clang-tools-extra/docs/clang-tidy/checks/bugprone/copy-constructor-mutates-argument.rst @@ -1,6 +1,6 @@ -.. title:: clang-tidy - bugprone-mutating-copy +.. title:: clang-tidy - bugprone-copy-constructor-mutates-argument -bugprone-mutating-copy +bugprone-copy-constructor-mutates-argument ====================== Finds assignments to the copied object and its direct or indirect members diff --git a/clang-tools-extra/docs/clang-tidy/checks/cert/oop58-cpp.rst b/clang-tools-extra/docs/clang-tidy/checks/cert/oop58-cpp.rst index 6f16d9c548279..7684f3e8d16e6 100644 --- a/clang-tools-extra/docs/clang-tidy/checks/cert/oop58-cpp.rst +++ b/clang-tools-extra/docs/clang-tidy/checks/cert/oop58-cpp.rst @@ -1,10 +1,10 @@ -.. title:: clang-tidy - cert-mutating-copy +.. title:: clang-tidy - cert-oop58-cpp .. meta:: - :http-equiv=refresh: 5;URL=../bugprone/mutating-copy.html + :http-equiv=refresh: 5;URL=../bugprone/bugprone-copy-constructor-mutates-argument.html cert-oop58-cpp ============== The `cert-oop58-cpp` check is an alias, please see -:doc:`bugprone-mutating-copy <../bugprone/mutating-copy>` +:doc:`bugprone-copy-constructor-mutates-argument <../bugprone/bugprone-copy-constructor-mutates-argument>` for more information. \ No newline at end of file diff --git a/clang-tools-extra/docs/clang-tidy/checks/list.rst b/clang-tools-extra/docs/clang-tidy/checks/list.rst index c7fa88ab0a2e3..18aa247a774c9 100644 --- a/clang-tools-extra/docs/clang-tidy/checks/list.rst +++ b/clang-tools-extra/docs/clang-tidy/checks/list.rst @@ -90,6 +90,7 @@ Clang-Tidy Checks :doc:`bugprone-command-processor <bugprone/command-processor>`, :doc:`bugprone-compare-pointer-to-member-virtual-function <bugprone/compare-pointer-to-member-virtual-function>`, :doc:`bugprone-copy-constructor-init <bugprone/copy-constructor-init>`, "Yes" + :doc:`bugprone-copy-constructor-mutates-argument <bugprone/bugprone-copy-constructor-mutates-argument>`, :doc:`bugprone-crtp-constructor-accessibility <bugprone/crtp-constructor-accessibility>`, "Yes" :doc:`bugprone-dangling-handle <bugprone/dangling-handle>`, :doc:`bugprone-derived-method-shadowing-base-method <bugprone/derived-method-shadowing-base-method>`, @@ -117,7 +118,6 @@ Clang-Tidy Checks :doc:`bugprone-misplaced-pointer-arithmetic-in-alloc <bugprone/misplaced-pointer-arithmetic-in-alloc>`, "Yes" :doc:`bugprone-misplaced-widening-cast <bugprone/misplaced-widening-cast>`, :doc:`bugprone-move-forwarding-reference <bugprone/move-forwarding-reference>`, "Yes" - :doc:`bugprone-mutatinb-copy <bugprone/mutating-copy>`, :doc:`bugprone-multi-level-implicit-pointer-conversion <bugprone/multi-level-implicit-pointer-conversion>`, :doc:`bugprone-multiple-new-in-one-expression <bugprone/multiple-new-in-one-expression>`, :doc:`bugprone-multiple-statement-macro <bugprone/multiple-statement-macro>`, @@ -458,7 +458,7 @@ Check aliases :doc:`cert-msc54-cpp <cert/msc54-cpp>`, :doc:`bugprone-signal-handler <bugprone/signal-handler>`, :doc:`cert-oop11-cpp <cert/oop11-cpp>`, :doc:`performance-move-constructor-init <performance/move-constructor-init>`, :doc:`cert-oop54-cpp <cert/oop54-cpp>`, :doc:`bugprone-unhandled-self-assignment <bugprone/unhandled-self-assignment>`, - :doc:`cert-oop58-cpp <cert/oop58-cpp>`, :doc:`bugprone-mutating-copy <bugprone/mutating-copy>`, + :doc:`cert-oop58-cpp <cert/oop58-cpp>`, :doc:`bugprone-copy-constructor-mutates-argument <bugprone/copy-constructor-mutates-argument>`, :doc:`cert-pos44-c <cert/pos44-c>`, :doc:`bugprone-bad-signal-to-kill-thread <bugprone/bad-signal-to-kill-thread>`, :doc:`cert-pos47-c <cert/pos47-c>`, :doc:`concurrency-thread-canceltype-asynchronous <concurrency/thread-canceltype-asynchronous>`, :doc:`cert-sig30-c <cert/sig30-c>`, :doc:`bugprone-signal-handler <bugprone/signal-handler>`, diff --git a/clang-tools-extra/test/clang-tidy/checkers/cert/oop58-cpp.cpp b/clang-tools-extra/test/clang-tidy/checkers/bugprone/copy-constructor-mutates-argument.cpp similarity index 100% rename from clang-tools-extra/test/clang-tidy/checkers/cert/oop58-cpp.cpp rename to clang-tools-extra/test/clang-tidy/checkers/bugprone/copy-constructor-mutates-argument.cpp diff --git a/clang-tools-extra/test/clang-tidy/checkers/bugprone/mutating-copy.cpp b/clang-tools-extra/test/clang-tidy/checkers/bugprone/mutating-copy.cpp deleted file mode 100644 index 8b93aa3ee54fc..0000000000000 --- a/clang-tools-extra/test/clang-tidy/checkers/bugprone/mutating-copy.cpp +++ /dev/null @@ -1,149 +0,0 @@ -// RUN: %check_clang_tidy %s bugprone-mutating-copy %t - -// Example test cases from CERT rule -// https://wiki.sei.cmu.edu/confluence/display/cplusplus/OOP58-CPP.+Copy+operations+must+not+mutate+the+source+object -namespace test_mutating_noncompliant_example { -class A { - mutable int m; - -public: - A() : m(0) {} - explicit A(int m) : m(m) {} - - A(const A &other) : m(other.m) { - other.m = 0; - // CHECK-MESSAGES: :[[@LINE-1]]:5: warning: mutating copied object - } - - A &operator=(const A &other) { - if (&other != this) { - m = other.m; - other.m = 0; - // CHECK-MESSAGES: :[[@LINE-1]]:7: warning: mutating copied object - } - return *this; - } - - int get_m() const { return m; } -}; -} // namespace test_mutating_noncompliant_example - -namespace test_mutating_compliant_example { -class B { - int m; - -public: - B() : m(0) {} - explicit B(int m) : m(m) {} - - B(const B &other) : m(other.m) {} - B(B &&other) : m(other.m) { - other.m = 0; //no-warning: mutation allowed in move constructor - } - - B &operator=(const B &other) { - if (&other != this) { - m = other.m; - } - return *this; - } - - B &operator=(B &&other) { - m = other.m; - other.m = 0; //no-warning: mutation allowed in move assignment operator - return *this; - } - - int get_m() const { return m; } -}; -} // namespace test_mutating_compliant_example - -namespace test_mutating_pointer { -class C { - C *ptr; - int value; - - C(); - C(C &other) { - other = {}; - // CHECK-MESSAGES: :[[@LINE-1]]:5: warning: mutating copied object - other.ptr = nullptr; - // CHECK-MESSAGES: :[[@LINE-1]]:5: warning: mutating copied object - other.value = 0; - // CHECK-MESSAGES: :[[@LINE-1]]:5: warning: mutating copied object - - // no-warning: mutating a pointee is allowed - other.ptr->value = 0; - *other.ptr = {}; - } -}; -} // namespace test_mutating_pointer - -namespace test_mutating_indirect_member { -struct S { - int x; -}; - -class D { - S s; - D(D &other) { - other.s = {}; - // CHECK-MESSAGES: :[[@LINE-1]]:5: warning: mutating copied object - other.s.x = 0; - // CHECK-MESSAGES: :[[@LINE-1]]:5: warning: mutating copied object - } -}; -} // namespace test_mutating_indirect_member - -namespace test_mutating_other_object { -class E { - E(); - E(E &other) { - E tmp; - // no-warning: mutating an object that is not the source is allowed - tmp = {}; - } -}; -} // namespace test_mutating_other_object - -namespace test_mutating_member_function { -class F { - int a; - -public: - void bad_func() { a = 12; } - void fine_func() const; - void fine_func_2(int x) { x = 5; } - void questionable_func(); - - F(F &other) : a(other.a) { - this->bad_func(); // no-warning: mutating this is allowed - - other.bad_func(); - // CHECK-MESSAGES: :[[@LINE-1]]:5: warning: call mutates copied object - - other.fine_func(); - other.fine_func_2(42); - other.questionable_func(); - } -}; -} // namespace test_mutating_member_function - -namespace test_mutating_function_on_nested_object { -struct S { - int x; - void mutate(int y) { - x = y; - } -}; - -class G { - S s; - G(G &other) { - s.mutate(0); // no-warning: mutating this is allowed - - other.s.mutate(0); - // CHECK-MESSAGES: :[[@LINE-1]]:5: warning: call mutates copied object - } -}; -} // namespace test_mutating_function_on_nested_object >From bc38b0eaa62563c89dfd55ddde60d3320bcbc529 Mon Sep 17 00:00:00 2001 From: Dasha Buka <[email protected]> Date: Sat, 25 Oct 2025 11:18:03 -0700 Subject: [PATCH 4/9] Formatting changes --- clang-tools-extra/clang-tidy/bugprone/CMakeLists.txt | 2 +- .../checks/bugprone/copy-constructor-mutates-argument.rst | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/clang-tools-extra/clang-tidy/bugprone/CMakeLists.txt b/clang-tools-extra/clang-tidy/bugprone/CMakeLists.txt index e9b149f3f44e8..03fcaf2e087da 100644 --- a/clang-tools-extra/clang-tidy/bugprone/CMakeLists.txt +++ b/clang-tools-extra/clang-tidy/bugprone/CMakeLists.txt @@ -18,6 +18,7 @@ add_clang_library(clangTidyBugproneModule STATIC CommandProcessorCheck.cpp ComparePointerToMemberVirtualFunctionCheck.cpp CopyConstructorInitCheck.cpp + CopyConstructorMutatesArgumentCheck.cpp CrtpConstructorAccessibilityCheck.cpp DanglingHandleCheck.cpp DerivedMethodShadowingBaseMethodCheck.cpp @@ -53,7 +54,6 @@ add_clang_library(clangTidyBugproneModule STATIC MultiLevelImplicitPointerConversionCheck.cpp MultipleNewInOneExpressionCheck.cpp MultipleStatementMacroCheck.cpp - CopyConstructorMutatesArgumentCheck.cpp NarrowingConversionsCheck.cpp NoEscapeCheck.cpp NonZeroEnumToBoolConversionCheck.cpp diff --git a/clang-tools-extra/docs/clang-tidy/checks/bugprone/copy-constructor-mutates-argument.rst b/clang-tools-extra/docs/clang-tidy/checks/bugprone/copy-constructor-mutates-argument.rst index 95c295405d32a..28e5015beeaad 100644 --- a/clang-tools-extra/docs/clang-tidy/checks/bugprone/copy-constructor-mutates-argument.rst +++ b/clang-tools-extra/docs/clang-tidy/checks/bugprone/copy-constructor-mutates-argument.rst @@ -1,7 +1,7 @@ .. title:: clang-tidy - bugprone-copy-constructor-mutates-argument bugprone-copy-constructor-mutates-argument -====================== +========================================== Finds assignments to the copied object and its direct or indirect members in copy constructors and copy assignment operators. >From cdde076714d5f5ae0f6de0d4fe31bb94349a9066 Mon Sep 17 00:00:00 2001 From: Dasha Buka <[email protected]> Date: Sat, 25 Oct 2025 11:20:46 -0700 Subject: [PATCH 5/9] Update name of test to bugprone-copy-constructor-mutates-argument --- .../checkers/bugprone/copy-constructor-mutates-argument.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/clang-tools-extra/test/clang-tidy/checkers/bugprone/copy-constructor-mutates-argument.cpp b/clang-tools-extra/test/clang-tidy/checkers/bugprone/copy-constructor-mutates-argument.cpp index 223248cb8847f..9fdbb7af90f90 100644 --- a/clang-tools-extra/test/clang-tidy/checkers/bugprone/copy-constructor-mutates-argument.cpp +++ b/clang-tools-extra/test/clang-tidy/checkers/bugprone/copy-constructor-mutates-argument.cpp @@ -1,4 +1,4 @@ -// RUN: %check_clang_tidy %s cert-oop58-cpp %t +// RUN: %check_clang_tidy %s bugprone-copy-constructor-mutates-argument %t // Example test cases from CERT rule // https://wiki.sei.cmu.edu/confluence/display/cplusplus/OOP58-CPP.+Copy+operations+must+not+mutate+the+source+object >From fe088e0ad4270fb9902c16cc328223b43595a8c1 Mon Sep 17 00:00:00 2001 From: Dasha Buka <[email protected]> Date: Mon, 27 Oct 2025 13:48:55 -0700 Subject: [PATCH 6/9] Add check to header --- .../bugprone/CopyConstructorMutatesArgumentCheck.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/clang-tools-extra/clang-tidy/bugprone/CopyConstructorMutatesArgumentCheck.h b/clang-tools-extra/clang-tidy/bugprone/CopyConstructorMutatesArgumentCheck.h index c573fd3a49348..6ae9524a668d6 100644 --- a/clang-tools-extra/clang-tidy/bugprone/CopyConstructorMutatesArgumentCheck.h +++ b/clang-tools-extra/clang-tidy/bugprone/CopyConstructorMutatesArgumentCheck.h @@ -6,8 +6,8 @@ // //===----------------------------------------------------------------------===// -#ifndef LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_BUGPRONE_COPYCONSTRUCTORMUTATESARGUMENT_H -#define LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_BUGPRONE_COPYCONSTRUCTORMUTATESARGUMENT_H +#ifndef LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_BUGPRONE_COPYCONSTRUCTORMUTATESARGUMENTCHECK_H +#define LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_BUGPRONE_COPYCONSTRUCTORMUTATESARGUMENTCHECK_H #include "../ClangTidyCheck.h" @@ -31,4 +31,4 @@ class CopyConstructorMutatesArgumentCheck : public ClangTidyCheck { } // namespace clang::tidy::bugprone -#endif // LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_BUGPRONE_COPYCONSTRUCTORMUTATESARGUMENT_H +#endif // LLLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_BUGPRONE_COPYCONSTRUCTORMUTATESARGUMENTCHECK_H >From e62c69c5fe7502b18f28e00cf769fc4344e4a1bc Mon Sep 17 00:00:00 2001 From: Dasha Buka <[email protected]> Date: Mon, 27 Oct 2025 15:44:40 -0700 Subject: [PATCH 7/9] Fix typo in comment --- .../clang-tidy/bugprone/CopyConstructorMutatesArgumentCheck.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/clang-tools-extra/clang-tidy/bugprone/CopyConstructorMutatesArgumentCheck.h b/clang-tools-extra/clang-tidy/bugprone/CopyConstructorMutatesArgumentCheck.h index 6ae9524a668d6..0fed57258b0d8 100644 --- a/clang-tools-extra/clang-tidy/bugprone/CopyConstructorMutatesArgumentCheck.h +++ b/clang-tools-extra/clang-tidy/bugprone/CopyConstructorMutatesArgumentCheck.h @@ -31,4 +31,4 @@ class CopyConstructorMutatesArgumentCheck : public ClangTidyCheck { } // namespace clang::tidy::bugprone -#endif // LLLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_BUGPRONE_COPYCONSTRUCTORMUTATESARGUMENTCHECK_H +#endif // LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_BUGPRONE_COPYCONSTRUCTORMUTATESARGUMENTCHECK_H >From a21f963cb441d7a246731b074f45c9d8199989ff Mon Sep 17 00:00:00 2001 From: Dasha Buka <[email protected]> Date: Mon, 27 Oct 2025 16:00:42 -0700 Subject: [PATCH 8/9] Typo in new check name --- clang-tools-extra/docs/clang-tidy/checks/list.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/clang-tools-extra/docs/clang-tidy/checks/list.rst b/clang-tools-extra/docs/clang-tidy/checks/list.rst index 18aa247a774c9..a736596c7cf6d 100644 --- a/clang-tools-extra/docs/clang-tidy/checks/list.rst +++ b/clang-tools-extra/docs/clang-tidy/checks/list.rst @@ -90,7 +90,7 @@ Clang-Tidy Checks :doc:`bugprone-command-processor <bugprone/command-processor>`, :doc:`bugprone-compare-pointer-to-member-virtual-function <bugprone/compare-pointer-to-member-virtual-function>`, :doc:`bugprone-copy-constructor-init <bugprone/copy-constructor-init>`, "Yes" - :doc:`bugprone-copy-constructor-mutates-argument <bugprone/bugprone-copy-constructor-mutates-argument>`, + :doc:`bugprone-copy-constructor-mutates-argument <bugprone/copy-constructor-mutates-argument>`, :doc:`bugprone-crtp-constructor-accessibility <bugprone/crtp-constructor-accessibility>`, "Yes" :doc:`bugprone-dangling-handle <bugprone/dangling-handle>`, :doc:`bugprone-derived-method-shadowing-base-method <bugprone/derived-method-shadowing-base-method>`, >From c6c63c1639c408eeb34864f51f5c64433d91482a Mon Sep 17 00:00:00 2001 From: Dasha Buka <[email protected]> Date: Sun, 2 Nov 2025 13:42:33 -0800 Subject: [PATCH 9/9] Fix ref to moved check --- clang-tools-extra/docs/clang-tidy/checks/cert/oop58-cpp.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/clang-tools-extra/docs/clang-tidy/checks/cert/oop58-cpp.rst b/clang-tools-extra/docs/clang-tidy/checks/cert/oop58-cpp.rst index 7684f3e8d16e6..e435490f0711a 100644 --- a/clang-tools-extra/docs/clang-tidy/checks/cert/oop58-cpp.rst +++ b/clang-tools-extra/docs/clang-tidy/checks/cert/oop58-cpp.rst @@ -1,10 +1,10 @@ .. title:: clang-tidy - cert-oop58-cpp .. meta:: - :http-equiv=refresh: 5;URL=../bugprone/bugprone-copy-constructor-mutates-argument.html + :http-equiv=refresh: 5;URL=../bugprone/copy-constructor-mutates-argument.html cert-oop58-cpp ============== The `cert-oop58-cpp` check is an alias, please see -:doc:`bugprone-copy-constructor-mutates-argument <../bugprone/bugprone-copy-constructor-mutates-argument>` +:doc:`bugprone-copy-constructor-mutates-argument <../bugprone/copy-constructor-mutates-argument>` for more information. \ No newline at end of file _______________________________________________ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
