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:
parent
bcee366d82
commit
fb745b54d2
7 changed files with 121 additions and 4 deletions
|
@ -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,
|
||||
|
|
87
compilerplugins/clang/reftotemp.cxx
Normal file
87
compilerplugins/clang/reftotemp.cxx
Normal 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: */
|
25
compilerplugins/clang/test/reftotemp.cxx
Normal file
25
compilerplugins/clang/test/reftotemp.cxx
Normal 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: */
|
|
@ -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());
|
||||
}
|
||||
|
|
|
@ -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 \
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Reference in a new issue