summaryrefslogtreecommitdiff
path: root/compilerplugins/clang
diff options
context:
space:
mode:
authorStephan Bergmann <sbergman@redhat.com>2022-11-11 10:09:16 +0100
committerStephan Bergmann <sbergman@redhat.com>2022-11-11 19:37:16 +0100
commit4c9093c95445c154c4ce7db1756ca936ea0752ca (patch)
tree4233f634d3d671fe0be167a6b5b6146d6250c2ca /compilerplugins/clang
parentc725028f15c36fc626d9ad8cdc288eb73c3e2643 (diff)
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 <sbergman@redhat.com>
Diffstat (limited to 'compilerplugins/clang')
-rw-r--r--compilerplugins/clang/constmove.cxx85
-rw-r--r--compilerplugins/clang/test/constmove.cxx25
2 files changed, 110 insertions, 0 deletions
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: */