new loplugin:reftotemp

look for places where we are taking a reference (i.e. "&") to a
temporary object, which is misleading.

Change-Id: Id0eb4dce3f1ca559f86e02edcbea3ca17bea8e76
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/175978
Reviewed-by: Noel Grandin <noel.grandin@collabora.co.uk>
Tested-by: Jenkins
This commit is contained in:
Noel Grandin 2024-11-04 08:15:21 +02:00
parent bcee366d82
commit fb745b54d2
7 changed files with 121 additions and 4 deletions

View file

@ -56,6 +56,10 @@ bool RangedForCopy::VisitCXXForRangeStmt( const CXXForRangeStmt* stmt )
if (!type->isRecordType() || type->isReferenceType() || type->isPointerType())
return true;
if (auto exprWithCleanups = dyn_cast<ExprWithCleanups>(varDecl->getInit()))
if (dyn_cast<CXXBindTemporaryExpr>(exprWithCleanups->getSubExpr()->IgnoreImpCasts()))
return true;
if (loplugin::TypeCheck(type).Class("__bit_const_reference").StdNamespace())
{
// With libc++ without _LIBCPP_ABI_BITSET_VECTOR_BOOL_CONST_SUBSCRIPT_RETURN_BOOL,

View file

@ -0,0 +1,87 @@
/* -*- 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/.
*/
#ifndef LO_CLANG_SHARED_PLUGINS
#include <cassert>
#include <stack>
#include "check.hxx"
#include "plugin.hxx"
#include "config_clang.h"
/**
look for places where we take a reference (i.e. "&") to a temporary value.
Which is rather dodgy.
*/
namespace
{
class RefToTemp final : public loplugin::FilteringPlugin<RefToTemp>
{
public:
explicit RefToTemp(loplugin::InstantiationData const& data)
: FilteringPlugin(data)
{
}
bool VisitVarDecl(const VarDecl* varDecl)
{
if (ignoreLocation(varDecl))
return true;
// reference parameters might have a default temporary value, which is ok
if (isa<ParmVarDecl>(varDecl))
return true;
if (!varDecl->getType()->isReferenceType())
return true;
if (!varDecl->getInit())
return true;
if (!isTemporaryValue(varDecl->getInit()))
return true;
report(DiagnosticsEngine::Warning, "taking reference to temporary value",
varDecl->getBeginLoc())
<< varDecl->getSourceRange();
return true;
}
bool isTemporaryValue(const Expr* expr)
{
if (dyn_cast<MaterializeTemporaryExpr>(expr))
return true;
if (auto exprWithCleanups = dyn_cast<ExprWithCleanups>(expr))
if (dyn_cast_or_null<MaterializeTemporaryExpr>(
exprWithCleanups->getSubExpr()->IgnoreImpCasts()))
return true;
return false;
}
bool preRun() override
{
if (!compiler.getLangOpts().CPlusPlus)
return false;
return true;
}
private:
void run() override
{
if (preRun())
{
TraverseDecl(compiler.getASTContext().getTranslationUnitDecl());
}
}
};
loplugin::Plugin::Registration<RefToTemp> reftotemp("reftotemp");
}
#endif
/* vim:set shiftwidth=4 softtabstop=4 expandtab cinoptions=b1,g0,N-s cinkeys+=0=break: */

View file

@ -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 <sal/config.h>
#include <rtl/string.hxx>
#include <rtl/ustring.hxx>
namespace test1
{
OUString getString();
void f()
{
// expected-error@+1 {{taking reference to temporary value [loplugin:reftotemp]}}
const OUString& rToTemp = getString();
(void)rToTemp;
}
}
/* vim:set shiftwidth=4 softtabstop=4 expandtab cinoptions=b1,g0,N-s cinkeys+=0=break: */

View file

@ -28,7 +28,7 @@ namespace dbaui
CharSetListBox::CharSetListBox(std::unique_ptr<weld::ComboBox> xControl)
: m_xControl(std::move(xControl))
{
for (auto const& charset : m_aCharSets)
for (auto const charset : m_aCharSets)
{
m_xControl->append_text(charset.getDisplayName());
}

View file

@ -71,6 +71,7 @@ $(eval $(call gb_CompilerTest_add_exception_objects,compilerplugins_clang, \
compilerplugins/clang/test/redundantpreprocessor \
compilerplugins/clang/test/refcounting \
compilerplugins/clang/test/referencecasting \
compilerplugins/clang/test/reftotemp \
compilerplugins/clang/test/returnconstval \
compilerplugins/clang/test/salcall \
compilerplugins/clang/test/sallogareas \

View file

@ -1272,7 +1272,7 @@ SwTextPortion *SwTextFormatter::WhichTextPor( SwTextFormatInfo &rInf ) const
rtl::Reference<SwXTextDocument> xDocumentMetadataAccess(pShell->GetBaseModel());
const css::uno::Reference<css::rdf::XResource> xSubject(xRet, uno::UNO_QUERY);
const uno::Reference<rdf::XRepository>& xRepository =
const uno::Reference<rdf::XRepository> xRepository =
xDocumentMetadataAccess->getRDFRepository();
const uno::Reference<container::XEnumeration> xEnum(
xRepository->getStatements(xSubject, xODF_SHADING, nullptr), uno::UNO_SET_THROW);

View file

@ -891,7 +891,7 @@ static Color getBookmarkColor(const SwTextNode& rNode, const sw::mark::Bookmark*
static uno::Reference< rdf::XURI > xODF_SHADING(
rdf::URI::createKnown(xContext, rdf::URIs::LO_EXT_SHADING), uno::UNO_SET_THROW);
const uno::Reference<rdf::XRepository>& xRepository =
const uno::Reference<rdf::XRepository> xRepository =
xModel->getRDFRepository();
const uno::Reference<container::XEnumeration> xEnum(
xRepository->getStatements(xSubject, xODF_SHADING, nullptr), uno::UNO_SET_THROW);
@ -935,7 +935,7 @@ static OUString getBookmarkType(const SwTextNode& rNode, const sw::mark::Bookmar
uno::Reference<rdf::XDocumentMetadataAccess> xDocumentMetadataAccess(
pShell->GetBaseModel());
const uno::Reference<rdf::XRepository>& xRepository =
const uno::Reference<rdf::XRepository> xRepository =
xDocumentMetadataAccess->getRDFRepository();
const uno::Reference<container::XEnumeration> xEnum(
xRepository->getStatements(xSubject, xODF_PREFIX, nullptr), uno::UNO_SET_THROW);