office-gobmx/compilerplugins/clang/constmove.cxx
Stephan Bergmann 4c9093c954 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>
2022-11-11 19:37:16 +01:00

85 lines
2.3 KiB
C++

/* -*- 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: */