compilerplugins/clang/constmove.cxx | 85 +++++++++++++++++++++++++++ compilerplugins/clang/test/constmove.cxx | 25 +++++++ solenv/CompilerTest_compilerplugins_clang.mk | 1 3 files changed, 111 insertions(+)
New commits: commit 4c9093c95445c154c4ce7db1756ca936ea0752ca Author: Stephan Bergmann <sberg...@redhat.com> AuthorDate: Fri Nov 11 10:09:16 2022 +0100 Commit: Stephan Bergmann <sberg...@redhat.com> CommitDate: Fri Nov 11 19:37:16 2022 +0100 New loplugin:constmove "Find occurrences of std::move on const-qualified types. While there might theoretically be legitimate uses for such (for which this plugin would generate false positives and would need to be updated), in practice they tend to point at suspicious code that should be cleaned up in some way." (All issues found for a Linux build have already been addressed with eleven recent commits mentioning in their commit messages: "I came across this code with an upcoming loplugin:constmove that flags suspicious uses of std::move involving const-qualified types.") Change-Id: I891a66eb0ec5f9b7d93536bbccea0359893383df Reviewed-on: https://gerrit.libreoffice.org/c/core/+/142589 Tested-by: Jenkins Reviewed-by: Stephan Bergmann <sberg...@redhat.com> diff --git a/compilerplugins/clang/constmove.cxx b/compilerplugins/clang/constmove.cxx new file mode 100644 index 000000000000..63bafa188979 --- /dev/null +++ b/compilerplugins/clang/constmove.cxx @@ -0,0 +1,85 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4; fill-column: 100 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +// Find occurrences of std::move on const-qualified types. While there might theoretically be +// legitimate uses for such (for which this plugin would generate false positives and would need to +// be updated), in practice they tend to point at suspicious code that should be cleaned up in some +// way. + +#ifndef LO_CLANG_SHARED_PLUGINS + +#include "check.hxx" +#include "plugin.hxx" + +namespace +{ +class ConstMove final : public loplugin::FilteringPlugin<ConstMove> +{ +public: + explicit ConstMove(loplugin::InstantiationData const& data) + : FilteringPlugin(data) + { + } + + bool preRun() override { return compiler.getLangOpts().CPlusPlus; } + + void run() override + { + if (preRun()) + { + TraverseDecl(compiler.getASTContext().getTranslationUnitDecl()); + } + } + + bool VisitCallExpr(CallExpr const* expr) + { + if (ignoreLocation(expr)) + { + return true; + } + auto const t = expr->getType(); + if (!t.isConstQualified()) + { + return true; + } + auto const d = expr->getDirectCallee(); + if (d == nullptr) + { + return true; + } + if (!loplugin::DeclCheck(d).Function("move").StdNamespace()) + { + return true; + } + switch (expr->getNumArgs()) + { + case 0: + return true; + case 1: + break; + default: + if (!isa<CXXDefaultArgExpr>(expr->getArg(1))) + { + return true; + } + break; + } + report(DiagnosticsEngine::Warning, "suspicious 'std::move' from %0 to const-qualified %1", + expr->getExprLoc()) + << expr->getArg(0)->IgnoreImplicit()->getType() << t << expr->getSourceRange(); + return true; + } +}; + +static loplugin::Plugin::Registration<ConstMove> constmove("constmove"); +} + +#endif + +/* vim:set shiftwidth=4 softtabstop=4 expandtab cinoptions=b1,g0,N-s cinkeys+=0=break: */ diff --git a/compilerplugins/clang/test/constmove.cxx b/compilerplugins/clang/test/constmove.cxx new file mode 100644 index 000000000000..f6d2ed3ac9bf --- /dev/null +++ b/compilerplugins/clang/test/constmove.cxx @@ -0,0 +1,25 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4; fill-column: 100 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +#include <utility> + +struct S +{ +}; + +void f(S const& s1, S s2) +{ + // expected-error-re@+1 {{suspicious 'std::move' from 'const S' to const-qualified '{{.+}}' (aka 'const S') [loplugin:constmove]}} + S v1(std::move(s1)); + (void)v1; + S v2(std::move(s2)); + (void)v2; +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab cinoptions=b1,g0,N-s cinkeys+=0=break: */ diff --git a/solenv/CompilerTest_compilerplugins_clang.mk b/solenv/CompilerTest_compilerplugins_clang.mk index 631217b2be1b..6e77d57cc2b3 100644 --- a/solenv/CompilerTest_compilerplugins_clang.mk +++ b/solenv/CompilerTest_compilerplugins_clang.mk @@ -20,6 +20,7 @@ $(eval $(call gb_CompilerTest_add_exception_objects,compilerplugins_clang, \ compilerplugins/clang/test/commaoperator \ compilerplugins/clang/test/conditionalstring \ compilerplugins/clang/test/constmethod \ + compilerplugins/clang/test/constmove \ compilerplugins/clang/test/consttobool \ compilerplugins/clang/test/cow_wrapper \ compilerplugins/clang/test/cppunitassertequals \