From a92331dfa561acaf54b28a978653037187fe4c36 Mon Sep 17 00:00:00 2001 From: Alex Kremer Date: Tue, 24 Feb 2026 14:53:44 +0000 Subject: [PATCH 1/9] Enable bugprone checks that have no issues atm --- .clang-tidy | 137 +++++++++++++++++++++++++++------------------------- 1 file changed, 71 insertions(+), 66 deletions(-) diff --git a/.clang-tidy b/.clang-tidy index f7009c4666c..8417dca95c8 100644 --- a/.clang-tidy +++ b/.clang-tidy @@ -1,81 +1,86 @@ --- Checks: "-*, - bugprone-argument-comment + bugprone-argument-comment, + bugprone-assert-side-effect, + bugprone-bad-signal-to-kill-thread, + bugprone-bool-pointer-implicit-conversion, + bugprone-casting-through-void, + bugprone-chained-comparison, + bugprone-compare-pointer-to-member-virtual-function, + bugprone-copy-constructor-init, + bugprone-dangling-handle, + bugprone-dynamic-static-initializers, + bugprone-fold-init-type, + bugprone-forward-declaration-namespace, + bugprone-inaccurate-erase, + bugprone-incorrect-enable-if, + bugprone-incorrect-roundings, + bugprone-infinite-loop, + bugprone-integer-division, + bugprone-lambda-function-name, + bugprone-macro-parentheses, + bugprone-macro-repeated-side-effects, + bugprone-misplaced-operator-in-strlen-in-alloc, + bugprone-misplaced-pointer-arithmetic-in-alloc, + bugprone-misplaced-widening-cast, + bugprone-multi-level-implicit-pointer-conversion, + bugprone-multiple-new-in-one-expression, + bugprone-multiple-statement-macro, + bugprone-no-escape, + bugprone-non-zero-enum-to-bool-conversion, + bugprone-parent-virtual-call, + bugprone-posix-return, + bugprone-redundant-branch-condition, + bugprone-shared-ptr-array-mismatch, + bugprone-signal-handler, + bugprone-signed-char-misuse, + bugprone-sizeof-container, + bugprone-spuriously-wake-up-functions, + bugprone-standalone-empty, + bugprone-string-constructor, + bugprone-string-integer-assignment, + bugprone-string-literal-with-embedded-nul, + bugprone-stringview-nullptr, + bugprone-suspicious-enum-usage, + bugprone-suspicious-include, + bugprone-suspicious-memory-comparison, + bugprone-suspicious-memset-usage, + bugprone-suspicious-realloc-usage, + bugprone-suspicious-semicolon, + bugprone-suspicious-string-compare, + bugprone-swapped-arguments, + bugprone-terminating-continue, + bugprone-throw-keyword-missing, + bugprone-undefined-memory-manipulation, + bugprone-undelegated-constructor, + bugprone-unhandled-exception-at-new, + bugprone-unique-ptr-array-mismatch, + bugprone-unsafe-functions, + bugprone-virtual-near-miss " -# bugprone-assert-side-effect, -# bugprone-bad-signal-to-kill-thread, -# bugprone-bool-pointer-implicit-conversion, -# bugprone-casting-through-void, -# bugprone-chained-comparison, -# bugprone-compare-pointer-to-member-virtual-function, -# bugprone-copy-constructor-init, -# bugprone-crtp-constructor-accessibility, -# bugprone-dangling-handle, -# bugprone-dynamic-static-initializers, +# --- +# checks that have some issues that need to be resolved: +# # bugprone-empty-catch, -# bugprone-fold-init-type, -# bugprone-forward-declaration-namespace, -# bugprone-inaccurate-erase, +# bugprone-crtp-constructor-accessibility, # bugprone-inc-dec-in-conditions, -# bugprone-incorrect-enable-if, -# bugprone-incorrect-roundings, -# bugprone-infinite-loop, -# bugprone-integer-division, -# bugprone-lambda-function-name, -# bugprone-macro-parentheses, -# bugprone-macro-repeated-side-effects, -# bugprone-misplaced-operator-in-strlen-in-alloc, -# bugprone-misplaced-pointer-arithmetic-in-alloc, -# bugprone-misplaced-widening-cast, -# bugprone-move-forwarding-reference, -# bugprone-multi-level-implicit-pointer-conversion, -# bugprone-multiple-new-in-one-expression, -# bugprone-multiple-statement-macro, -# bugprone-no-escape, -# bugprone-non-zero-enum-to-bool-conversion, -# bugprone-optional-value-conversion, -# bugprone-parent-virtual-call, -# bugprone-pointer-arithmetic-on-polymorphic-object, -# bugprone-posix-return, -# bugprone-redundant-branch-condition, # bugprone-reserved-identifier, +# bugprone-move-forwarding-reference, +# bugprone-unused-local-non-trivial-variable, # bugprone-return-const-ref-from-parameter, -# bugprone-shared-ptr-array-mismatch, -# bugprone-signal-handler, -# bugprone-signed-char-misuse, -# bugprone-sizeof-container, +# bugprone-switch-missing-default-case, # bugprone-sizeof-expression, -# bugprone-spuriously-wake-up-functions, -# bugprone-standalone-empty, -# bugprone-string-constructor, -# bugprone-string-integer-assignment, -# bugprone-string-literal-with-embedded-nul, -# bugprone-stringview-nullptr, -# bugprone-suspicious-enum-usage, -# bugprone-suspicious-include, -# bugprone-suspicious-memory-comparison, -# bugprone-suspicious-memset-usage, -# bugprone-suspicious-missing-comma, -# bugprone-suspicious-realloc-usage, -# bugprone-suspicious-semicolon, -# bugprone-suspicious-string-compare, # bugprone-suspicious-stringview-data-usage, -# bugprone-swapped-arguments, -# bugprone-switch-missing-default-case, -# bugprone-terminating-continue, -# bugprone-throw-keyword-missing, +# bugprone-suspicious-missing-comma, +# bugprone-pointer-arithmetic-on-polymorphic-object, +# bugprone-optional-value-conversion, # bugprone-too-small-loop-variable, -# bugprone-undefined-memory-manipulation, -# bugprone-undelegated-constructor, -# bugprone-unhandled-exception-at-new, -# bugprone-unhandled-self-assignment, -# bugprone-unique-ptr-array-mismatch, -# bugprone-unsafe-functions, -# bugprone-unused-local-non-trivial-variable, -# bugprone-unused-raii, # bugprone-unused-return-value, # bugprone-use-after-move, -# bugprone-virtual-near-miss, +# bugprone-unhandled-self-assignment, +# bugprone-unused-raii, +# --- +# # cppcoreguidelines-init-variables, # cppcoreguidelines-misleading-capture-default-by-value, # cppcoreguidelines-no-suspend-with-lock, From f9b392e7723a3252b8f5966a7470a7640421e71b Mon Sep 17 00:00:00 2001 From: Alex Kremer Date: Tue, 24 Feb 2026 16:37:45 +0000 Subject: [PATCH 2/9] Enable all checks that work already --- .clang-tidy | 168 +++++++++++++++++++++++++++------------------------- 1 file changed, 86 insertions(+), 82 deletions(-) diff --git a/.clang-tidy b/.clang-tidy index 8417dca95c8..3aced113b72 100644 --- a/.clang-tidy +++ b/.clang-tidy @@ -56,7 +56,28 @@ Checks: "-*, bugprone-unhandled-exception-at-new, bugprone-unique-ptr-array-mismatch, bugprone-unsafe-functions, - bugprone-virtual-near-miss + bugprone-virtual-near-miss, + cppcoreguidelines-no-suspend-with-lock, + cppcoreguidelines-virtual-class-destructor, + hicpp-ignored-remove-result, + misc-definitions-in-headers, + misc-header-include-cycle, + misc-misplaced-const, + misc-static-assert, + misc-throw-by-value-catch-by-reference, + misc-unused-using-decls, + readability-duplicate-include, + readability-enum-initial-value, + readability-misleading-indentation, + readability-non-const-parameter, + readability-redundant-declaration, + readability-reference-to-constructed-temporary, + modernize-deprecated-headers, + modernize-make-shared, + modernize-make-unique, + performance-implicit-conversion-in-loop, + performance-move-constructor-init, + performance-trivially-destructible " # --- # checks that have some issues that need to be resolved: @@ -79,116 +100,99 @@ Checks: "-*, # bugprone-use-after-move, # bugprone-unhandled-self-assignment, # bugprone-unused-raii, -# --- # -# cppcoreguidelines-init-variables, # cppcoreguidelines-misleading-capture-default-by-value, -# cppcoreguidelines-no-suspend-with-lock, +# cppcoreguidelines-init-variables, # cppcoreguidelines-pro-type-member-init, # cppcoreguidelines-pro-type-static-cast-downcast, -# cppcoreguidelines-rvalue-reference-param-not-moved, # cppcoreguidelines-use-default-member-init, -# cppcoreguidelines-virtual-class-destructor, -# hicpp-ignored-remove-result, +# cppcoreguidelines-rvalue-reference-param-not-moved, +# # llvm-namespace-comment, # misc-const-correctness, -# misc-definitions-in-headers, -# misc-header-include-cycle, # misc-include-cleaner, -# misc-misplaced-const, # misc-redundant-expression, -# misc-static-assert, -# misc-throw-by-value-catch-by-reference, # misc-unused-alias-decls, -# misc-unused-using-decls, -# modernize-concat-nested-namespaces, -# modernize-deprecated-headers, -# modernize-make-shared, -# modernize-make-unique, -# modernize-pass-by-value, -# modernize-type-traits, -# modernize-use-designated-initializers, -# modernize-use-emplace, -# modernize-use-equals-default, -# modernize-use-equals-delete, -# modernize-use-override, -# modernize-use-ranges, -# modernize-use-starts-ends-with, -# modernize-use-std-numbers, -# modernize-use-using, -# performance-faster-string-find, -# performance-for-range-copy, -# performance-implicit-conversion-in-loop, -# performance-inefficient-vector-operation, -# performance-move-const-arg, -# performance-move-constructor-init, -# performance-no-automatic-move, -# performance-trivially-destructible, +# # readability-avoid-nested-conditional-operator, # readability-avoid-return-with-void-value, # readability-braces-around-statements, -# readability-const-return-type, # readability-container-contains, # readability-container-size-empty, # readability-convert-member-functions-to-static, -# readability-duplicate-include, +# readability-const-return-type, # readability-else-after-return, -# readability-enum-initial-value, # readability-implicit-bool-conversion, # readability-inconsistent-declaration-parameter-name, # readability-identifier-naming, # readability-make-member-function-const, # readability-math-missing-parentheses, -# readability-misleading-indentation, -# readability-non-const-parameter, -# readability-redundant-casting, -# readability-redundant-declaration, # readability-redundant-inline-specifier, # readability-redundant-member-init, +# readability-redundant-casting, # readability-redundant-string-init, -# readability-reference-to-constructed-temporary, # readability-simplify-boolean-expr, -# readability-static-accessed-through-instance, # readability-static-definition-in-anonymous-namespace, # readability-suspicious-call-argument, -# readability-use-std-min-max +# readability-use-std-min-max, +# readability-static-accessed-through-instance, +# +# modernize-concat-nested-namespaces, +# modernize-pass-by-value, +# modernize-type-traits, +# modernize-use-designated-initializers, +# modernize-use-emplace, +# modernize-use-equals-default, +# modernize-use-equals-delete, +# modernize-use-override, +# modernize-use-ranges, +# modernize-use-starts-ends-with, +# modernize-use-std-numbers, +# modernize-use-using, +# +# performance-faster-string-find, +# performance-for-range-copy, +# performance-inefficient-vector-operation, +# performance-move-const-arg, +# performance-no-automatic-move, +# --- # -# CheckOptions: -# readability-braces-around-statements.ShortStatementLines: 2 -# readability-identifier-naming.MacroDefinitionCase: UPPER_CASE -# readability-identifier-naming.ClassCase: CamelCase -# readability-identifier-naming.StructCase: CamelCase -# readability-identifier-naming.UnionCase: CamelCase -# readability-identifier-naming.EnumCase: CamelCase -# readability-identifier-naming.EnumConstantCase: CamelCase -# readability-identifier-naming.ScopedEnumConstantCase: CamelCase -# readability-identifier-naming.GlobalConstantCase: UPPER_CASE -# readability-identifier-naming.GlobalConstantPrefix: "k" -# readability-identifier-naming.GlobalVariableCase: CamelCase -# readability-identifier-naming.GlobalVariablePrefix: "g" -# readability-identifier-naming.ConstexprFunctionCase: camelBack -# readability-identifier-naming.ConstexprMethodCase: camelBack -# readability-identifier-naming.ClassMethodCase: camelBack -# readability-identifier-naming.ClassMemberCase: camelBack -# readability-identifier-naming.ClassConstantCase: UPPER_CASE -# readability-identifier-naming.ClassConstantPrefix: "k" -# readability-identifier-naming.StaticConstantCase: UPPER_CASE -# readability-identifier-naming.StaticConstantPrefix: "k" -# readability-identifier-naming.StaticVariableCase: UPPER_CASE -# readability-identifier-naming.StaticVariablePrefix: "k" -# readability-identifier-naming.ConstexprVariableCase: UPPER_CASE -# readability-identifier-naming.ConstexprVariablePrefix: "k" -# readability-identifier-naming.LocalConstantCase: camelBack -# readability-identifier-naming.LocalVariableCase: camelBack -# readability-identifier-naming.TemplateParameterCase: CamelCase -# readability-identifier-naming.ParameterCase: camelBack -# readability-identifier-naming.FunctionCase: camelBack -# readability-identifier-naming.MemberCase: camelBack -# readability-identifier-naming.PrivateMemberSuffix: _ -# readability-identifier-naming.ProtectedMemberSuffix: _ -# readability-identifier-naming.PublicMemberSuffix: "" -# readability-identifier-naming.FunctionIgnoredRegexp: ".*tag_invoke.*" -# bugprone-unsafe-functions.ReportMoreUnsafeFunctions: true +CheckOptions: + # readability-braces-around-statements.ShortStatementLines: 2 + # readability-identifier-naming.MacroDefinitionCase: UPPER_CASE + # readability-identifier-naming.ClassCase: CamelCase + # readability-identifier-naming.StructCase: CamelCase + # readability-identifier-naming.UnionCase: CamelCase + # readability-identifier-naming.EnumCase: CamelCase + # readability-identifier-naming.EnumConstantCase: CamelCase + # readability-identifier-naming.ScopedEnumConstantCase: CamelCase + # readability-identifier-naming.GlobalConstantCase: UPPER_CASE + # readability-identifier-naming.GlobalConstantPrefix: "k" + # readability-identifier-naming.GlobalVariableCase: CamelCase + # readability-identifier-naming.GlobalVariablePrefix: "g" + # readability-identifier-naming.ConstexprFunctionCase: camelBack + # readability-identifier-naming.ConstexprMethodCase: camelBack + # readability-identifier-naming.ClassMethodCase: camelBack + # readability-identifier-naming.ClassMemberCase: camelBack + # readability-identifier-naming.ClassConstantCase: UPPER_CASE + # readability-identifier-naming.ClassConstantPrefix: "k" + # readability-identifier-naming.StaticConstantCase: UPPER_CASE + # readability-identifier-naming.StaticConstantPrefix: "k" + # readability-identifier-naming.StaticVariableCase: UPPER_CASE + # readability-identifier-naming.StaticVariablePrefix: "k" + # readability-identifier-naming.ConstexprVariableCase: UPPER_CASE + # readability-identifier-naming.ConstexprVariablePrefix: "k" + # readability-identifier-naming.LocalConstantCase: camelBack + # readability-identifier-naming.LocalVariableCase: camelBack + # readability-identifier-naming.TemplateParameterCase: CamelCase + # readability-identifier-naming.ParameterCase: camelBack + # readability-identifier-naming.FunctionCase: camelBack + # readability-identifier-naming.MemberCase: camelBack + # readability-identifier-naming.PrivateMemberSuffix: _ + # readability-identifier-naming.ProtectedMemberSuffix: _ + # readability-identifier-naming.PublicMemberSuffix: "" + # readability-identifier-naming.FunctionIgnoredRegexp: ".*tag_invoke.*" + bugprone-unsafe-functions.ReportMoreUnsafeFunctions: true # bugprone-unused-return-value.CheckedReturnTypes: ::std::error_code;::std::error_condition;::std::errc # misc-include-cleaner.IgnoreHeaders: '.*/(detail|impl)/.*;.*(expected|unexpected).*;.*ranges_lower_bound\.h;time.h;stdlib.h;__chrono/.*;fmt/chrono.h;boost/uuid/uuid_hash.hpp' # From b5c8747509bdc54d1ea5e6516307eca8302c4a38 Mon Sep 17 00:00:00 2001 From: Alex Kremer Date: Tue, 24 Feb 2026 17:17:22 +0000 Subject: [PATCH 3/9] Enable clang-tidy in CI if config changed --- .github/workflows/reusable-clang-tidy.yml | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/.github/workflows/reusable-clang-tidy.yml b/.github/workflows/reusable-clang-tidy.yml index 7c300ee26e4..3a8f595432a 100644 --- a/.github/workflows/reusable-clang-tidy.yml +++ b/.github/workflows/reusable-clang-tidy.yml @@ -22,7 +22,8 @@ jobs: if: ${{ inputs.check_only_changed }} runs-on: ubuntu-latest outputs: - any_changed: ${{ steps.changed_files.outputs.any_changed }} + clang_tidy_config_changed: ${{ steps.changed_clang_tidy.outputs.any_changed }} + any_cpp_changed: ${{ steps.changed_files.outputs.any_changed }} all_changed_files: ${{ steps.changed_files.outputs.all_changed_files }} steps: - name: Checkout repository @@ -38,10 +39,17 @@ jobs: **/*.ipp separator: " " + - name: Get changed clang-tidy configuration + id: changed_clang_tidy + uses: tj-actions/changed-files@7dee1b0c1557f278e5c7dc244927139d78c0e22a # v47.0.4 + with: + files: | + .clang-tidy + run-clang-tidy: needs: [determine-files] - if: ${{ always() && !cancelled() && (!inputs.check_only_changed || needs.determine-files.outputs.any_changed == 'true') }} + if: ${{ always() && !cancelled() && (!inputs.check_only_changed || needs.determine-files.outputs.any_cpp_changed == 'true' || needs.determine-files.outputs.clang_tidy_config_changed == 'true') }} uses: ./.github/workflows/reusable-clang-tidy-files.yml with: - files: ${{ inputs.check_only_changed && needs.determine-files.outputs.all_changed_files || '' }} + files: ${{ (needs.determine-files.outputs.clang_tidy_config_changed && '') || (inputs.check_only_changed && needs.determine-files.outputs.all_changed_files || '') }} create_issue_on_failure: ${{ inputs.create_issue_on_failure }} From ce5cea997d9834ac351bcde7edaa13084a22a31a Mon Sep 17 00:00:00 2001 From: Alex Kremer Date: Tue, 24 Feb 2026 17:47:58 +0000 Subject: [PATCH 4/9] Add documentation about running clang-tidy and don't check protobuf/generated files --- .clang-tidy | 2 +- .../workflows/reusable-clang-tidy-files.yml | 2 +- CONTRIBUTING.md | 27 +++++++++++++++++++ 3 files changed, 29 insertions(+), 2 deletions(-) diff --git a/.clang-tidy b/.clang-tidy index 3aced113b72..5f4187b008b 100644 --- a/.clang-tidy +++ b/.clang-tidy @@ -65,6 +65,7 @@ Checks: "-*, misc-misplaced-const, misc-static-assert, misc-throw-by-value-catch-by-reference, + misc-unused-alias-decls, misc-unused-using-decls, readability-duplicate-include, readability-enum-initial-value, @@ -112,7 +113,6 @@ Checks: "-*, # misc-const-correctness, # misc-include-cleaner, # misc-redundant-expression, -# misc-unused-alias-decls, # # readability-avoid-nested-conditional-operator, # readability-avoid-return-with-void-value, diff --git a/.github/workflows/reusable-clang-tidy-files.yml b/.github/workflows/reusable-clang-tidy-files.yml index 432da1d15c0..23bb4082d33 100644 --- a/.github/workflows/reusable-clang-tidy-files.yml +++ b/.github/workflows/reusable-clang-tidy-files.yml @@ -80,7 +80,7 @@ jobs: env: FILES: ${{ inputs.files }} run: | - run-clang-tidy -j ${{ steps.nproc.outputs.nproc }} -p "$BUILD_DIR" $FILES 2>&1 | tee clang-tidy-output.txt + run-clang-tidy -j ${{ steps.nproc.outputs.nproc }} -p "$BUILD_DIR" src test $FILES 2>&1 | tee clang-tidy-output.txt - name: Upload clang-tidy output if: steps.run_clang_tidy.outcome != 'success' diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index a928065ef28..5005b782c81 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -251,6 +251,33 @@ pip3 install pre-commit pre-commit install ``` +## Clang-tidy + +All code must pass `clang-tidy` checks according to the settings in [`.clang-tidy`](./.clang-tidy). + +There is a Continuous Integration job that runs clang-tidy on pull requests. The CI will check: + +- All changed C++ files (`.cpp`, `.h`, `.ipp`) when only code files are modified +- **All files in the repository** when the `.clang-tidy` configuration file is changed + +This ensures that configuration changes don't introduce new warnings across the codebase. + +### Running clang-tidy locally + +Before running clang-tidy, you must build the project to generate required files (particularly protobuf headers). At minimum, build the `xrpl.libpb` target: + +``` +cmake --build build --target xrpl.libpb +``` + +Then run clang-tidy on your local changes: + +``` +run-clang-tidy -p build src test +``` + +This will check all source files in the `src` and `test` directories using the compile commands from your `build` directory. + ## Contracts and instrumentation We are using [Antithesis](https://antithesis.com/) for continuous fuzzing, From cdb8add995a58759a1db7069bd88944638947744 Mon Sep 17 00:00:00 2001 From: Alex Kremer Date: Tue, 24 Feb 2026 17:53:15 +0000 Subject: [PATCH 5/9] Update .github/workflows/reusable-clang-tidy.yml Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- .github/workflows/reusable-clang-tidy.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/reusable-clang-tidy.yml b/.github/workflows/reusable-clang-tidy.yml index 3a8f595432a..7050d3509f5 100644 --- a/.github/workflows/reusable-clang-tidy.yml +++ b/.github/workflows/reusable-clang-tidy.yml @@ -51,5 +51,5 @@ jobs: if: ${{ always() && !cancelled() && (!inputs.check_only_changed || needs.determine-files.outputs.any_cpp_changed == 'true' || needs.determine-files.outputs.clang_tidy_config_changed == 'true') }} uses: ./.github/workflows/reusable-clang-tidy-files.yml with: - files: ${{ (needs.determine-files.outputs.clang_tidy_config_changed && '') || (inputs.check_only_changed && needs.determine-files.outputs.all_changed_files || '') }} + files: ${{ (needs.determine-files.outputs.clang_tidy_config_changed == 'true' && '') || (inputs.check_only_changed && needs.determine-files.outputs.all_changed_files || '') }} create_issue_on_failure: ${{ inputs.create_issue_on_failure }} From 17f87a65a3b22f87df5166c573736abf18749b51 Mon Sep 17 00:00:00 2001 From: Alex Kremer Date: Tue, 24 Feb 2026 18:00:12 +0000 Subject: [PATCH 6/9] Fix CI logic --- .github/workflows/reusable-clang-tidy-files.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/reusable-clang-tidy-files.yml b/.github/workflows/reusable-clang-tidy-files.yml index 23bb4082d33..699cff08d16 100644 --- a/.github/workflows/reusable-clang-tidy-files.yml +++ b/.github/workflows/reusable-clang-tidy-files.yml @@ -78,9 +78,9 @@ jobs: id: run_clang_tidy continue-on-error: true env: - FILES: ${{ inputs.files }} + TARGETS: ${{ inputs.files != '' && inputs.files || 'src test' }} run: | - run-clang-tidy -j ${{ steps.nproc.outputs.nproc }} -p "$BUILD_DIR" src test $FILES 2>&1 | tee clang-tidy-output.txt + run-clang-tidy -j ${{ steps.nproc.outputs.nproc }} -p "${BUILD_DIR}" ${TARGETS} 2>&1 | tee clang-tidy-output.txt - name: Upload clang-tidy output if: steps.run_clang_tidy.outcome != 'success' From 93ef6ae3bb3c0e363fd80f596637e5684011a0ce Mon Sep 17 00:00:00 2001 From: Alex Kremer Date: Wed, 25 Feb 2026 14:27:39 +0000 Subject: [PATCH 7/9] Fix instances of bugprone-empty-catch --- .clang-tidy | 2 +- cspell.config.yaml | 2 ++ src/libxrpl/beast/insight/StatsDCollector.cpp | 2 +- src/libxrpl/nodestore/backend/NuDBFactory.cpp | 2 +- src/libxrpl/protocol/STAmount.cpp | 8 ++++---- src/libxrpl/protocol/STTx.cpp | 4 ++-- src/libxrpl/tx/transactors/XChainBridge.cpp | 2 +- src/test/app/Manifest_test.cpp | 4 ++-- src/test/core/SociDB_test.cpp | 4 ++-- src/test/jtx/impl/Env.cpp | 8 ++++---- src/test/jtx/impl/Oracle.cpp | 2 +- src/test/jtx/impl/WSClient.cpp | 1 + src/tests/libxrpl/basics/scope.cpp | 12 ++++++------ src/xrpld/app/ledger/detail/InboundLedgers.cpp | 2 +- src/xrpld/app/ledger/detail/LedgerMaster.cpp | 2 +- src/xrpld/app/ledger/detail/SkipListAcquire.cpp | 2 +- src/xrpld/app/main/GRPCServer.cpp | 2 +- src/xrpld/app/misc/detail/ValidatorSite.cpp | 4 ++-- src/xrpld/overlay/detail/ConnectAttempt.cpp | 2 +- src/xrpld/rpc/detail/RPCCall.cpp | 2 +- 20 files changed, 36 insertions(+), 33 deletions(-) diff --git a/.clang-tidy b/.clang-tidy index 5f4187b008b..5971b5dd14f 100644 --- a/.clang-tidy +++ b/.clang-tidy @@ -10,6 +10,7 @@ Checks: "-*, bugprone-copy-constructor-init, bugprone-dangling-handle, bugprone-dynamic-static-initializers, + bugprone-empty-catch, bugprone-fold-init-type, bugprone-forward-declaration-namespace, bugprone-inaccurate-erase, @@ -83,7 +84,6 @@ Checks: "-*, # --- # checks that have some issues that need to be resolved: # -# bugprone-empty-catch, # bugprone-crtp-constructor-accessibility, # bugprone-inc-dec-in-conditions, # bugprone-reserved-identifier, diff --git a/cspell.config.yaml b/cspell.config.yaml index e2b20ac0985..98b6be81e70 100644 --- a/cspell.config.yaml +++ b/cspell.config.yaml @@ -176,6 +176,8 @@ words: - nixfmt - nixos - nixpkgs + - NOLINT + - NOLINTNEXTLINE - nonxrp - noripple - nudb diff --git a/src/libxrpl/beast/insight/StatsDCollector.cpp b/src/libxrpl/beast/insight/StatsDCollector.cpp index 8462a00b3d8..143bc51bd83 100644 --- a/src/libxrpl/beast/insight/StatsDCollector.cpp +++ b/src/libxrpl/beast/insight/StatsDCollector.cpp @@ -249,7 +249,7 @@ class StatsDCollectorImp : public StatsDCollector, { m_timer.cancel(); } - catch (boost::system::system_error const&) + catch (boost::system::system_error const&) // NOLINT(bugprone-empty-catch) { // ignored } diff --git a/src/libxrpl/nodestore/backend/NuDBFactory.cpp b/src/libxrpl/nodestore/backend/NuDBFactory.cpp index e8efa464af6..534a9b3d0f3 100644 --- a/src/libxrpl/nodestore/backend/NuDBFactory.cpp +++ b/src/libxrpl/nodestore/backend/NuDBFactory.cpp @@ -83,7 +83,7 @@ class NuDBBackend : public Backend // close can throw and we don't want the destructor to throw. close(); } - catch (nudb::system_error const&) + catch (nudb::system_error const&) // NOLINT(bugprone-empty-catch) { // Don't allow exceptions to propagate out of destructors. // close() has already logged the error. diff --git a/src/libxrpl/protocol/STAmount.cpp b/src/libxrpl/protocol/STAmount.cpp index 650cc4369d7..9503da57a27 100644 --- a/src/libxrpl/protocol/STAmount.cpp +++ b/src/libxrpl/protocol/STAmount.cpp @@ -443,6 +443,7 @@ getRate(STAmount const& offerOut, STAmount const& offerIn) { if (offerOut == beast::zero) return 0; + try { STAmount r = divide(offerIn, offerOut, noIssue()); @@ -454,12 +455,11 @@ getRate(STAmount const& offerOut, STAmount const& offerIn) std::uint64_t ret = r.exponent() + 100; return (ret << (64 - 8)) | r.mantissa(); } - catch (std::exception const&) + catch (...) { + // overflow -- very bad offer + return 0; } - - // overflow -- very bad offer - return 0; } /** diff --git a/src/libxrpl/protocol/STTx.cpp b/src/libxrpl/protocol/STTx.cpp index 0c5e299702e..098ca1a400c 100644 --- a/src/libxrpl/protocol/STTx.cpp +++ b/src/libxrpl/protocol/STTx.cpp @@ -246,10 +246,10 @@ STTx::checkSign(Rules const& rules, STObject const& sigObject) const return signingPubKey.empty() ? checkMultiSign(rules, sigObject) : checkSingleSign(sigObject); } - catch (std::exception const&) + catch (...) { + return Unexpected("Internal signature check failure."); } - return Unexpected("Internal signature check failure."); } Expected diff --git a/src/libxrpl/tx/transactors/XChainBridge.cpp b/src/libxrpl/tx/transactors/XChainBridge.cpp index 30fc9f59e14..64daa6d1eea 100644 --- a/src/libxrpl/tx/transactors/XChainBridge.cpp +++ b/src/libxrpl/tx/transactors/XChainBridge.cpp @@ -1126,8 +1126,8 @@ toClaim(STTx const& tx) } catch (...) { + return std::nullopt; } - return std::nullopt; } template diff --git a/src/test/app/Manifest_test.cpp b/src/test/app/Manifest_test.cpp index a790584ac2f..294d5210d95 100644 --- a/src/test/app/Manifest_test.cpp +++ b/src/test/app/Manifest_test.cpp @@ -71,7 +71,7 @@ class Manifest_test : public beast::unit_test::suite { setupDatabaseDir(getDatabasePath()); } - catch (std::exception const&) + catch (std::exception const&) // NOLINT(bugprone-empty-catch) { } } @@ -81,7 +81,7 @@ class Manifest_test : public beast::unit_test::suite { cleanupDatabaseDir(getDatabasePath()); } - catch (std::exception const&) + catch (std::exception const&) // NOLINT(bugprone-empty-catch) { } } diff --git a/src/test/core/SociDB_test.cpp b/src/test/core/SociDB_test.cpp index a06193ae86f..66b368176d4 100644 --- a/src/test/core/SociDB_test.cpp +++ b/src/test/core/SociDB_test.cpp @@ -58,7 +58,7 @@ class SociDB_test final : public TestSuite { setupDatabaseDir(getDatabasePath()); } - catch (std::exception const&) + catch (std::exception const&) // NOLINT(bugprone-empty-catch) { } } @@ -68,7 +68,7 @@ class SociDB_test final : public TestSuite { cleanupDatabaseDir(getDatabasePath()); } - catch (std::exception const&) + catch (std::exception const&) // NOLINT(bugprone-empty-catch) { } } diff --git a/src/test/jtx/impl/Env.cpp b/src/test/jtx/impl/Env.cpp index df86aaa2e40..4dfd2f2b387 100644 --- a/src/test/jtx/impl/Env.cpp +++ b/src/test/jtx/impl/Env.cpp @@ -587,10 +587,10 @@ Env::st(JTx const& jt) { return sterilize(STTx{std::move(*obj)}); } - catch (std::exception const&) + catch (...) { + return nullptr; } - return nullptr; } std::shared_ptr @@ -613,10 +613,10 @@ Env::ust(JTx const& jt) { return std::make_shared(std::move(*obj)); } - catch (std::exception const&) + catch (...) { + return nullptr; } - return nullptr; } Json::Value diff --git a/src/test/jtx/impl/Oracle.cpp b/src/test/jtx/impl/Oracle.cpp index c9d8c0ce277..302880c9728 100644 --- a/src/test/jtx/impl/Oracle.cpp +++ b/src/test/jtx/impl/Oracle.cpp @@ -339,8 +339,8 @@ validDocumentID(AnyValue const& v) } catch (...) { + return false; } - return false; } } // namespace oracle diff --git a/src/test/jtx/impl/WSClient.cpp b/src/test/jtx/impl/WSClient.cpp index 2b92eb5ec33..84424be2225 100644 --- a/src/test/jtx/impl/WSClient.cpp +++ b/src/test/jtx/impl/WSClient.cpp @@ -107,6 +107,7 @@ class WSClientImpl : public WSClient { stream_.cancel(); } + // NOLINTNEXTLINE(bugprone-empty-catch) catch (boost::system::system_error const&) { // ignored diff --git a/src/tests/libxrpl/basics/scope.cpp b/src/tests/libxrpl/basics/scope.cpp index 309a41ec04b..8efa4a84b10 100644 --- a/src/tests/libxrpl/basics/scope.cpp +++ b/src/tests/libxrpl/basics/scope.cpp @@ -35,7 +35,7 @@ TEST(scope, scope_exit) scope_exit x{[&i]() { i = 5; }}; throw 1; } - catch (...) + catch (...) // NOLINT(bugprone-empty-catch) { } } @@ -47,7 +47,7 @@ TEST(scope, scope_exit) x.release(); throw 1; } - catch (...) + catch (...) // NOLINT(bugprone-empty-catch) { } } @@ -85,7 +85,7 @@ TEST(scope, scope_fail) scope_fail x{[&i]() { i = 5; }}; throw 1; } - catch (...) + catch (...) // NOLINT(bugprone-empty-catch) { } } @@ -97,7 +97,7 @@ TEST(scope, scope_fail) x.release(); throw 1; } - catch (...) + catch (...) // NOLINT(bugprone-empty-catch) { } } @@ -135,7 +135,7 @@ TEST(scope, scope_success) scope_success x{[&i]() { i = 5; }}; throw 1; } - catch (...) + catch (...) // NOLINT(bugprone-empty-catch) { } } @@ -147,7 +147,7 @@ TEST(scope, scope_success) x.release(); throw 1; } - catch (...) + catch (...) // NOLINT(bugprone-empty-catch) { } } diff --git a/src/xrpld/app/ledger/detail/InboundLedgers.cpp b/src/xrpld/app/ledger/detail/InboundLedgers.cpp index a8ae530bded..e17437d64f7 100644 --- a/src/xrpld/app/ledger/detail/InboundLedgers.cpp +++ b/src/xrpld/app/ledger/detail/InboundLedgers.cpp @@ -241,7 +241,7 @@ class InboundLedgersImp : public InboundLedgers newNode->getHash().as_uint256(), std::make_shared(s.begin(), s.end())); } } - catch (std::exception const&) + catch (std::exception const&) // NOLINT(bugprone-empty-catch) { } } diff --git a/src/xrpld/app/ledger/detail/LedgerMaster.cpp b/src/xrpld/app/ledger/detail/LedgerMaster.cpp index 8072b619e17..64bdf04df1f 100644 --- a/src/xrpld/app/ledger/detail/LedgerMaster.cpp +++ b/src/xrpld/app/ledger/detail/LedgerMaster.cpp @@ -1637,7 +1637,7 @@ LedgerMaster::getLedgerBySeq(std::uint32_t index) if (hash) return mLedgerHistory.getLedgerByHash(*hash); } - catch (std::exception const&) + catch (std::exception const&) // NOLINT(bugprone-empty-catch) { // Missing nodes are already handled } diff --git a/src/xrpld/app/ledger/detail/SkipListAcquire.cpp b/src/xrpld/app/ledger/detail/SkipListAcquire.cpp index 0fb1239c499..2191ef965a8 100644 --- a/src/xrpld/app/ledger/detail/SkipListAcquire.cpp +++ b/src/xrpld/app/ledger/detail/SkipListAcquire.cpp @@ -127,7 +127,7 @@ SkipListAcquire::processData( return; } } - catch (...) + catch (...) // NOLINT(bugprone-empty-catch) { } diff --git a/src/xrpld/app/main/GRPCServer.cpp b/src/xrpld/app/main/GRPCServer.cpp index ced252cb71c..c6b5c91e14f 100644 --- a/src/xrpld/app/main/GRPCServer.cpp +++ b/src/xrpld/app/main/GRPCServer.cpp @@ -29,7 +29,7 @@ getEndpoint(std::string const& peer) if (endpoint) return beast::IP::to_asio_endpoint(endpoint.value()); } - catch (std::exception const&) + catch (std::exception const&) // NOLINT(bugprone-empty-catch) { } return {}; diff --git a/src/xrpld/app/misc/detail/ValidatorSite.cpp b/src/xrpld/app/misc/detail/ValidatorSite.cpp index fb68bf5ef43..c4077a1b8be 100644 --- a/src/xrpld/app/misc/detail/ValidatorSite.cpp +++ b/src/xrpld/app/misc/detail/ValidatorSite.cpp @@ -177,7 +177,7 @@ ValidatorSite::stop() { timer_.cancel(); } - catch (boost::system::system_error const&) + catch (boost::system::system_error const&) // NOLINT(bugprone-empty-catch) { } stopping_ = false; @@ -222,7 +222,7 @@ ValidatorSite::makeRequest( { timer_.cancel_one(); } - catch (boost::system::system_error const&) + catch (boost::system::system_error const&) // NOLINT(bugprone-empty-catch) { } }; diff --git a/src/xrpld/overlay/detail/ConnectAttempt.cpp b/src/xrpld/overlay/detail/ConnectAttempt.cpp index c9361a2a5d9..ac0743e9369 100644 --- a/src/xrpld/overlay/detail/ConnectAttempt.cpp +++ b/src/xrpld/overlay/detail/ConnectAttempt.cpp @@ -252,7 +252,7 @@ ConnectAttempt::cancelTimer() timer_.cancel(); stepTimer_.cancel(); } - catch (boost::system::system_error const&) + catch (boost::system::system_error const&) // NOLINT(bugprone-empty-catch) { // ignored } diff --git a/src/xrpld/rpc/detail/RPCCall.cpp b/src/xrpld/rpc/detail/RPCCall.cpp index 7b65daa839a..134cbb34f81 100644 --- a/src/xrpld/rpc/detail/RPCCall.cpp +++ b/src/xrpld/rpc/detail/RPCCall.cpp @@ -1479,7 +1479,7 @@ rpcClient( setup = setup_ServerHandler( config, beast::logstream{logs.journal("HTTPClient").warn()}); } - catch (std::exception const&) + catch (std::exception const&) // NOLINT(bugprone-empty-catch) { // ignore any exceptions, so the command // line client works without a config file From 58e429fa2f7df55ce724956ce594bb3ac2f7f5db Mon Sep 17 00:00:00 2001 From: Alex Kremer Date: Mon, 2 Mar 2026 15:30:03 +0000 Subject: [PATCH 8/9] Fix some review comments --- src/libxrpl/beast/insight/Groups.cpp | 9 ++---- src/libxrpl/beast/insight/NullCollector.cpp | 31 ++++++++----------- src/libxrpl/beast/insight/StatsDCollector.cpp | 27 +++++++--------- 3 files changed, 28 insertions(+), 39 deletions(-) diff --git a/src/libxrpl/beast/insight/Groups.cpp b/src/libxrpl/beast/insight/Groups.cpp index 2b4178a9ca5..3ed972beedc 100644 --- a/src/libxrpl/beast/insight/Groups.cpp +++ b/src/libxrpl/beast/insight/Groups.cpp @@ -32,6 +32,9 @@ class GroupImp : public std::enable_shared_from_this, public Group ~GroupImp() = default; + GroupImp& + operator=(GroupImp const&) = delete; + std::string const& name() const override { @@ -73,10 +76,6 @@ class GroupImp : public std::enable_shared_from_this, public Group { return m_collector->make_meter(make_name(name)); } - -private: - GroupImp& - operator=(GroupImp const&); }; //------------------------------------------------------------------------------ @@ -93,8 +92,6 @@ class GroupsImp : public Groups { } - ~GroupsImp() = default; - Group::ptr const& get(std::string const& name) override { diff --git a/src/libxrpl/beast/insight/NullCollector.cpp b/src/libxrpl/beast/insight/NullCollector.cpp index d8ba67a8e74..fa6fa47eabd 100644 --- a/src/libxrpl/beast/insight/NullCollector.cpp +++ b/src/libxrpl/beast/insight/NullCollector.cpp @@ -24,9 +24,8 @@ class NullHookImpl : public HookImpl public: explicit NullHookImpl() = default; -private: NullHookImpl& - operator=(NullHookImpl const&); + operator=(NullHookImpl const&) = delete; }; //------------------------------------------------------------------------------ @@ -36,14 +35,13 @@ class NullCounterImpl : public CounterImpl public: explicit NullCounterImpl() = default; + NullCounterImpl& + operator=(NullCounterImpl const&) = delete; + void increment(value_type) override { } - -private: - NullCounterImpl& - operator=(NullCounterImpl const&); }; //------------------------------------------------------------------------------ @@ -53,14 +51,13 @@ class NullEventImpl : public EventImpl public: explicit NullEventImpl() = default; + NullEventImpl& + operator=(NullEventImpl const&) = delete; + void notify(value_type const&) override { } - -private: - NullEventImpl& - operator=(NullEventImpl const&); }; //------------------------------------------------------------------------------ @@ -70,6 +67,9 @@ class NullGaugeImpl : public GaugeImpl public: explicit NullGaugeImpl() = default; + NullGaugeImpl& + operator=(NullGaugeImpl const&) = delete; + void set(value_type) override { @@ -79,10 +79,6 @@ class NullGaugeImpl : public GaugeImpl increment(difference_type) override { } - -private: - NullGaugeImpl& - operator=(NullGaugeImpl const&); }; //------------------------------------------------------------------------------ @@ -92,14 +88,13 @@ class NullMeterImpl : public MeterImpl public: explicit NullMeterImpl() = default; + NullMeterImpl& + operator=(NullMeterImpl const&) = delete; + void increment(value_type) override { } - -private: - NullMeterImpl& - operator=(NullMeterImpl const&); }; //------------------------------------------------------------------------------ diff --git a/src/libxrpl/beast/insight/StatsDCollector.cpp b/src/libxrpl/beast/insight/StatsDCollector.cpp index 143bc51bd83..f4d561e60de 100644 --- a/src/libxrpl/beast/insight/StatsDCollector.cpp +++ b/src/libxrpl/beast/insight/StatsDCollector.cpp @@ -85,9 +85,11 @@ class StatsDCounterImpl : public CounterImpl, public StatsDMetricBase { public: StatsDCounterImpl(std::string const& name, std::shared_ptr const& impl); - ~StatsDCounterImpl() override; + StatsDCounterImpl& + operator=(StatsDCounterImpl const&) = delete; + void increment(CounterImpl::value_type amount) override; @@ -99,9 +101,6 @@ class StatsDCounterImpl : public CounterImpl, public StatsDMetricBase do_process() override; private: - StatsDCounterImpl& - operator=(StatsDCounterImpl const&); - std::shared_ptr m_impl; std::string m_name; CounterImpl::value_type m_value; @@ -114,9 +113,11 @@ class StatsDEventImpl : public EventImpl { public: StatsDEventImpl(std::string const& name, std::shared_ptr const& impl); - ~StatsDEventImpl() = default; + StatsDEventImpl& + operator=(StatsDEventImpl const&) = delete; + void notify(EventImpl::value_type const& value) override; @@ -126,9 +127,6 @@ class StatsDEventImpl : public EventImpl do_process(); private: - StatsDEventImpl& - operator=(StatsDEventImpl const&); - std::shared_ptr m_impl; std::string m_name; }; @@ -139,9 +137,11 @@ class StatsDGaugeImpl : public GaugeImpl, public StatsDMetricBase { public: StatsDGaugeImpl(std::string const& name, std::shared_ptr const& impl); - ~StatsDGaugeImpl() override; + StatsDGaugeImpl& + operator=(StatsDGaugeImpl const&) = delete; + void set(GaugeImpl::value_type value) override; void @@ -157,9 +157,6 @@ class StatsDGaugeImpl : public GaugeImpl, public StatsDMetricBase do_process() override; private: - StatsDGaugeImpl& - operator=(StatsDGaugeImpl const&); - std::shared_ptr m_impl; std::string m_name; GaugeImpl::value_type m_last_value; @@ -178,6 +175,9 @@ class StatsDMeterImpl : public MeterImpl, public StatsDMetricBase ~StatsDMeterImpl() override; + StatsDMeterImpl& + operator=(StatsDMeterImpl const&) = delete; + void increment(MeterImpl::value_type amount) override; @@ -189,9 +189,6 @@ class StatsDMeterImpl : public MeterImpl, public StatsDMetricBase do_process() override; private: - StatsDMeterImpl& - operator=(StatsDMeterImpl const&); - std::shared_ptr m_impl; std::string m_name; MeterImpl::value_type m_value; From bbc7952e387634067c1b4c2958a347bdc8530ef0 Mon Sep 17 00:00:00 2001 From: Alex Kremer Date: Mon, 2 Mar 2026 15:46:10 +0000 Subject: [PATCH 9/9] Revert "Fix some review comments" This reverts commit 58e429fa2f7df55ce724956ce594bb3ac2f7f5db. --- src/libxrpl/beast/insight/Groups.cpp | 9 ++++-- src/libxrpl/beast/insight/NullCollector.cpp | 31 +++++++++++-------- src/libxrpl/beast/insight/StatsDCollector.cpp | 27 +++++++++------- 3 files changed, 39 insertions(+), 28 deletions(-) diff --git a/src/libxrpl/beast/insight/Groups.cpp b/src/libxrpl/beast/insight/Groups.cpp index 3ed972beedc..2b4178a9ca5 100644 --- a/src/libxrpl/beast/insight/Groups.cpp +++ b/src/libxrpl/beast/insight/Groups.cpp @@ -32,9 +32,6 @@ class GroupImp : public std::enable_shared_from_this, public Group ~GroupImp() = default; - GroupImp& - operator=(GroupImp const&) = delete; - std::string const& name() const override { @@ -76,6 +73,10 @@ class GroupImp : public std::enable_shared_from_this, public Group { return m_collector->make_meter(make_name(name)); } + +private: + GroupImp& + operator=(GroupImp const&); }; //------------------------------------------------------------------------------ @@ -92,6 +93,8 @@ class GroupsImp : public Groups { } + ~GroupsImp() = default; + Group::ptr const& get(std::string const& name) override { diff --git a/src/libxrpl/beast/insight/NullCollector.cpp b/src/libxrpl/beast/insight/NullCollector.cpp index fa6fa47eabd..d8ba67a8e74 100644 --- a/src/libxrpl/beast/insight/NullCollector.cpp +++ b/src/libxrpl/beast/insight/NullCollector.cpp @@ -24,8 +24,9 @@ class NullHookImpl : public HookImpl public: explicit NullHookImpl() = default; +private: NullHookImpl& - operator=(NullHookImpl const&) = delete; + operator=(NullHookImpl const&); }; //------------------------------------------------------------------------------ @@ -35,13 +36,14 @@ class NullCounterImpl : public CounterImpl public: explicit NullCounterImpl() = default; - NullCounterImpl& - operator=(NullCounterImpl const&) = delete; - void increment(value_type) override { } + +private: + NullCounterImpl& + operator=(NullCounterImpl const&); }; //------------------------------------------------------------------------------ @@ -51,13 +53,14 @@ class NullEventImpl : public EventImpl public: explicit NullEventImpl() = default; - NullEventImpl& - operator=(NullEventImpl const&) = delete; - void notify(value_type const&) override { } + +private: + NullEventImpl& + operator=(NullEventImpl const&); }; //------------------------------------------------------------------------------ @@ -67,9 +70,6 @@ class NullGaugeImpl : public GaugeImpl public: explicit NullGaugeImpl() = default; - NullGaugeImpl& - operator=(NullGaugeImpl const&) = delete; - void set(value_type) override { @@ -79,6 +79,10 @@ class NullGaugeImpl : public GaugeImpl increment(difference_type) override { } + +private: + NullGaugeImpl& + operator=(NullGaugeImpl const&); }; //------------------------------------------------------------------------------ @@ -88,13 +92,14 @@ class NullMeterImpl : public MeterImpl public: explicit NullMeterImpl() = default; - NullMeterImpl& - operator=(NullMeterImpl const&) = delete; - void increment(value_type) override { } + +private: + NullMeterImpl& + operator=(NullMeterImpl const&); }; //------------------------------------------------------------------------------ diff --git a/src/libxrpl/beast/insight/StatsDCollector.cpp b/src/libxrpl/beast/insight/StatsDCollector.cpp index f4d561e60de..143bc51bd83 100644 --- a/src/libxrpl/beast/insight/StatsDCollector.cpp +++ b/src/libxrpl/beast/insight/StatsDCollector.cpp @@ -85,10 +85,8 @@ class StatsDCounterImpl : public CounterImpl, public StatsDMetricBase { public: StatsDCounterImpl(std::string const& name, std::shared_ptr const& impl); - ~StatsDCounterImpl() override; - StatsDCounterImpl& - operator=(StatsDCounterImpl const&) = delete; + ~StatsDCounterImpl() override; void increment(CounterImpl::value_type amount) override; @@ -101,6 +99,9 @@ class StatsDCounterImpl : public CounterImpl, public StatsDMetricBase do_process() override; private: + StatsDCounterImpl& + operator=(StatsDCounterImpl const&); + std::shared_ptr m_impl; std::string m_name; CounterImpl::value_type m_value; @@ -113,10 +114,8 @@ class StatsDEventImpl : public EventImpl { public: StatsDEventImpl(std::string const& name, std::shared_ptr const& impl); - ~StatsDEventImpl() = default; - StatsDEventImpl& - operator=(StatsDEventImpl const&) = delete; + ~StatsDEventImpl() = default; void notify(EventImpl::value_type const& value) override; @@ -127,6 +126,9 @@ class StatsDEventImpl : public EventImpl do_process(); private: + StatsDEventImpl& + operator=(StatsDEventImpl const&); + std::shared_ptr m_impl; std::string m_name; }; @@ -137,10 +139,8 @@ class StatsDGaugeImpl : public GaugeImpl, public StatsDMetricBase { public: StatsDGaugeImpl(std::string const& name, std::shared_ptr const& impl); - ~StatsDGaugeImpl() override; - StatsDGaugeImpl& - operator=(StatsDGaugeImpl const&) = delete; + ~StatsDGaugeImpl() override; void set(GaugeImpl::value_type value) override; @@ -157,6 +157,9 @@ class StatsDGaugeImpl : public GaugeImpl, public StatsDMetricBase do_process() override; private: + StatsDGaugeImpl& + operator=(StatsDGaugeImpl const&); + std::shared_ptr m_impl; std::string m_name; GaugeImpl::value_type m_last_value; @@ -175,9 +178,6 @@ class StatsDMeterImpl : public MeterImpl, public StatsDMetricBase ~StatsDMeterImpl() override; - StatsDMeterImpl& - operator=(StatsDMeterImpl const&) = delete; - void increment(MeterImpl::value_type amount) override; @@ -189,6 +189,9 @@ class StatsDMeterImpl : public MeterImpl, public StatsDMetricBase do_process() override; private: + StatsDMeterImpl& + operator=(StatsDMeterImpl const&); + std::shared_ptr m_impl; std::string m_name; MeterImpl::value_type m_value;