diff options
author | Noel Grandin <noel.grandin@collabora.co.uk> | 2017-09-27 16:08:59 +0200 |
---|---|---|
committer | Noel Grandin <noel.grandin@collabora.co.uk> | 2017-09-29 10:37:47 +0200 |
commit | a599eeab786ecbe1b5b6509e3c792e5c1ba31248 (patch) | |
tree | 73e530ebe30d10eb61856b7c7986ce87eb9705e3 | |
parent | loplugin:unusedfields improve finding callee (diff) | |
download | core-a599eeab786ecbe1b5b6509e3c792e5c1ba31248.tar.gz core-a599eeab786ecbe1b5b6509e3c792e5c1ba31248.zip |
check for unnecessary DLLPUBLIC annotations
on classes which are fully defined in a header file
Rename the dllprivate plugin to dllmacro and add the functionality
there.
Change-Id: I4581d551c46a8f61213d95973f323359d08278d8
26 files changed, 143 insertions, 111 deletions
diff --git a/chart2/source/inc/CommonFunctors.hxx b/chart2/source/inc/CommonFunctors.hxx index 8b11df32f3ea..e8cdb12d6ba1 100644 --- a/chart2/source/inc/CommonFunctors.hxx +++ b/chart2/source/inc/CommonFunctors.hxx @@ -50,7 +50,7 @@ template< typename T > <p>In case no number can be generated from the Any, NaN (see rtl::math::SetNAN()) is returned.</p> */ -struct OOO_DLLPUBLIC_CHARTTOOLS AnyToDouble +struct AnyToDouble { double operator() ( const css::uno::Any & rAny ) { @@ -64,7 +64,7 @@ struct OOO_DLLPUBLIC_CHARTTOOLS AnyToDouble /** unary function to convert css::uno::Any into an OUString. */ -struct OOO_DLLPUBLIC_CHARTTOOLS AnyToString +struct AnyToString { OUString operator() ( const css::uno::Any & rAny ) { @@ -93,7 +93,7 @@ struct OOO_DLLPUBLIC_CHARTTOOLS AnyToString <p>For conversion rtl::math::StringToDouble is used.</p> */ -struct OOO_DLLPUBLIC_CHARTTOOLS OUStringToDouble +struct OUStringToDouble { double operator() ( const OUString & rStr ) { @@ -111,7 +111,7 @@ struct OOO_DLLPUBLIC_CHARTTOOLS OUStringToDouble <p>For conversion rtl::math::DoubleToOUString is used.</p> */ -struct OOO_DLLPUBLIC_CHARTTOOLS DoubleToOUString +struct DoubleToOUString { OUString operator() ( double fNumber ) { diff --git a/chart2/source/inc/PropertyHelper.hxx b/chart2/source/inc/PropertyHelper.hxx index 52a38edfed6c..4051d00f9e78 100644 --- a/chart2/source/inc/PropertyHelper.hxx +++ b/chart2/source/inc/PropertyHelper.hxx @@ -138,7 +138,7 @@ OOO_DLLPUBLIC_CHARTTOOLS void setEmptyPropertyValueDefault( tPropertyValueMap & } // namespace PropertyHelper -struct OOO_DLLPUBLIC_CHARTTOOLS PropertyNameLess +struct PropertyNameLess { bool operator() ( const css::beans::Property & first, const css::beans::Property & second ) diff --git a/compilerplugins/clang/dllmacro.cxx b/compilerplugins/clang/dllmacro.cxx new file mode 100644 index 000000000000..538203f88942 --- /dev/null +++ b/compilerplugins/clang/dllmacro.cxx @@ -0,0 +1,111 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * 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 "plugin.hxx" +#include <iostream> +#include <fstream> + +/** + Check the usage of the various DLL visibility macros. + */ +class DllMacro final: + public RecursiveASTVisitor<DllMacro>, public loplugin::Plugin +{ +public: + explicit DllMacro(InstantiationData const & data): Plugin(data) {} + + bool VisitNamedDecl(NamedDecl const * decl); + +private: + void run() override { + // DISABLE_DYNLOADING makes SAL_DLLPUBLIC_{EXPORT,IMPORT,TEMPLATE} expand + // to visibility("hidden") attributes, which would cause bogus warnings + // here (e.g., in UBSan builds that explicitly define DISABLE_DYNLOADING + // in jurt/source/pipe/staticsalhack.cxx); alternatively, change + // include/sal/types.h to make those SAL_DLLPUBLIC_* expand to nothing + // for DISABLE_DYNLOADING: + if (!compiler.getPreprocessor().getIdentifierInfo("DISABLE_DYNLOADING") + ->hasMacroDefinition()) + { + TraverseDecl(compiler.getASTContext().getTranslationUnitDecl()); + } + } +}; + +bool DllMacro::VisitNamedDecl(NamedDecl const * decl) { + if (!decl->getLocation().isInvalid() && ignoreLocation(decl)) { + return true; + } + auto a = decl->getAttr<VisibilityAttr>(); + if (a == nullptr) { + return true; + } + if (compiler.getSourceManager().isMacroBodyExpansion( + decl->getLocation()) + && (Lexer::getImmediateMacroName( + decl->getLocation(), compiler.getSourceManager(), + compiler.getLangOpts()) + == "Q_OBJECT")) // from /usr/include/QtCore/qobjectdefs.h + { + return true; + } + if (a->getVisibility() == VisibilityAttr::Hidden) { + auto p = dyn_cast<RecordDecl>(decl->getDeclContext()); + if (p == nullptr) { + report( + DiagnosticsEngine::Warning, + "top-level declaration redundantly marked as DLLPRIVATE", + a->getLocation()) + << decl->getSourceRange(); + } else if (p->getVisibility() == HiddenVisibility) { + report( + DiagnosticsEngine::Warning, + ("declaration nested in DLLPRIVATE declaration redundantly" + " marked as DLLPRIVATE"), + a->getLocation()) + << decl->getSourceRange(); + report( + DiagnosticsEngine::Note, "parent declaration is here", + p->getLocation()) + << p->getSourceRange(); + } + } + else if (a->getVisibility() == VisibilityAttr::Default) { + auto p = dyn_cast<CXXRecordDecl>(decl); + if (p && p->isCompleteDefinition() && !p->getDescribedClassTemplate()) { + // don't know what these macros mean, leave them alone + auto macroLoc = a->getLocation(); + while (compiler.getSourceManager().isMacroBodyExpansion(macroLoc)) { + auto macroName = Lexer::getImmediateMacroName( + macroLoc, compiler.getSourceManager(), + compiler.getLangOpts()); + if (macroName == "SAL_EXCEPTION_DLLPUBLIC_EXPORT") + return true; + if (macroName == "VCL_PLUGIN_PUBLIC") + return true; + macroLoc = compiler.getSourceManager().getImmediateMacroCallerLoc(macroLoc); + } + for (auto it = p->method_begin(); it != p->method_end(); ++it) { + if (!it->hasInlineBody()) { + return true; + } + } + report( + DiagnosticsEngine::Warning, + "unnecessary *DLLPUBLIC declaration for class completely defined in header file", + a->getLocation()) + << decl->getSourceRange(); + } + } + return true; +} + +static loplugin::Plugin::Registration<DllMacro> reg("dllmacro"); + +/* vim:set shiftwidth=4 softtabstop=4 expandtab cinoptions=b1,g0,N-s cinkeys+=0=break: */ diff --git a/compilerplugins/clang/dllprivate.cxx b/compilerplugins/clang/dllprivate.cxx deleted file mode 100644 index 05cf26d7d5d2..000000000000 --- a/compilerplugins/clang/dllprivate.cxx +++ /dev/null @@ -1,79 +0,0 @@ -/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ -/* - * 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 "plugin.hxx" - -namespace { - -class Visitor final: - public RecursiveASTVisitor<Visitor>, public loplugin::Plugin -{ -public: - explicit Visitor(InstantiationData const & data): Plugin(data) {} - - bool VisitNamedDecl(NamedDecl const * decl) { - if (!decl->getLocation().isInvalid()&&ignoreLocation(decl)) { - return true; - } - auto a = decl->getAttr<VisibilityAttr>(); - if (a == nullptr || a->getVisibility() != VisibilityAttr::Hidden) { - return true; - } - if (compiler.getSourceManager().isMacroBodyExpansion( - decl->getLocation()) - && (Lexer::getImmediateMacroName( - decl->getLocation(), compiler.getSourceManager(), - compiler.getLangOpts()) - == "Q_OBJECT")) // from /usr/include/QtCore/qobjectdefs.h - { - return true; - } - auto p = dyn_cast<RecordDecl>(decl->getDeclContext()); - if (p == nullptr) { - report( - DiagnosticsEngine::Warning, - "top-level declaration redundantly marked as DLLPRIVATE", - a->getLocation()) - << decl->getSourceRange(); - } else if (p->getVisibility() == HiddenVisibility) { - report( - DiagnosticsEngine::Warning, - ("declaration nested in DLLPRIVATE declaration redundantly" - " marked as DLLPRIVATE"), - a->getLocation()) - << decl->getSourceRange(); - report( - DiagnosticsEngine::Note, "parent declaration is here", - p->getLocation()) - << p->getSourceRange(); - } - return true; - } - -private: - void run() override { - // DISABLE_DYNLOADING makes SAL_DLLPUBLIC_{EXPORT,IMPORT,TEMPLATE} expand - // to visibility("hidden") attributes, which would cause bogus warnings - // here (e.g., in UBSan builds that explicitly define DISABLE_DYNLOADING - // in jurt/source/pipe/staticsalhack.cxx); alternatively, change - // include/sal/types.h to make those SAL_DLLPUBLIC_* expand to nothing - // for DISABLE_DYNLOADING: - if (!compiler.getPreprocessor().getIdentifierInfo("DISABLE_DYNLOADING") - ->hasMacroDefinition()) - { - TraverseDecl(compiler.getASTContext().getTranslationUnitDecl()); - } - } -}; - -static loplugin::Plugin::Registration<Visitor> reg("dllprivate"); - -} - -/* vim:set shiftwidth=4 softtabstop=4 expandtab cinoptions=b1,g0,N-s cinkeys+=0=break: */ diff --git a/connectivity/source/inc/RowFunctionParser.hxx b/connectivity/source/inc/RowFunctionParser.hxx index df2c7ba2bf4e..5c494728a9f5 100644 --- a/connectivity/source/inc/RowFunctionParser.hxx +++ b/connectivity/source/inc/RowFunctionParser.hxx @@ -55,7 +55,7 @@ public: /** This exception is thrown, when the arithmetic expression parser failed to parse a string. */ -struct OOO_DLLPUBLIC_DBTOOLS ParseError +struct ParseError { ParseError( const char* ) {} }; diff --git a/desktop/source/deployment/inc/dp_ucb.h b/desktop/source/deployment/inc/dp_ucb.h index 3c97fc6a1e89..19b6e1b9702b 100644 --- a/desktop/source/deployment/inc/dp_ucb.h +++ b/desktop/source/deployment/inc/dp_ucb.h @@ -36,7 +36,7 @@ class Content; namespace dp_misc { -struct DESKTOP_DEPLOYMENTMISC_DLLPUBLIC StrTitle +struct StrTitle { static css::uno::Sequence< OUString > getTitleSequence() { diff --git a/include/basegfx/color/bcolor.hxx b/include/basegfx/color/bcolor.hxx index 300f8db81e81..c612a5d6dfd8 100644 --- a/include/basegfx/color/bcolor.hxx +++ b/include/basegfx/color/bcolor.hxx @@ -42,7 +42,7 @@ namespace basegfx @see B3DTuple */ - class SAL_WARN_UNUSED BASEGFX_DLLPUBLIC BColor : public B3DTuple + class SAL_WARN_UNUSED BColor : public B3DTuple { public: /** Create a Color with red, green and blue components from [0.0 to 1.0] diff --git a/include/basegfx/matrix/b2dhommatrixtools.hxx b/include/basegfx/matrix/b2dhommatrixtools.hxx index c60a6ac96c21..f0559fdf8f11 100644 --- a/include/basegfx/matrix/b2dhommatrixtools.hxx +++ b/include/basegfx/matrix/b2dhommatrixtools.hxx @@ -148,7 +148,7 @@ namespace basegfx { namespace utils { - class BASEGFX_DLLPUBLIC B2DHomMatrixBufferedDecompose + class B2DHomMatrixBufferedDecompose { private: B2DVector maScale; diff --git a/include/basegfx/numeric/ftools.hxx b/include/basegfx/numeric/ftools.hxx index 35a1a35111b2..cf7a05316bc7 100644 --- a/include/basegfx/numeric/ftools.hxx +++ b/include/basegfx/numeric/ftools.hxx @@ -148,7 +148,7 @@ namespace basegfx */ BASEGFX_DLLPUBLIC double snapToNearestMultiple(double v, const double fStep); - class BASEGFX_DLLPUBLIC fTools + class fTools { public: /// Get threshold value for equalZero and friends diff --git a/include/basegfx/pixel/bpixel.hxx b/include/basegfx/pixel/bpixel.hxx index ed1dadc06a09..7eee516c2cff 100644 --- a/include/basegfx/pixel/bpixel.hxx +++ b/include/basegfx/pixel/bpixel.hxx @@ -27,7 +27,7 @@ namespace basegfx { - class BASEGFX_DLLPUBLIC BPixel + class BPixel { protected: union diff --git a/include/comphelper/propertycontainerhelper.hxx b/include/comphelper/propertycontainerhelper.hxx index 513aa88f4993..23f9757e0336 100644 --- a/include/comphelper/propertycontainerhelper.hxx +++ b/include/comphelper/propertycontainerhelper.hxx @@ -32,7 +32,7 @@ namespace comphelper // infos about one single property -struct COMPHELPER_DLLPUBLIC PropertyDescription +struct PropertyDescription { // the possibilities where a property holding object may be located enum class LocationType diff --git a/include/connectivity/FValue.hxx b/include/connectivity/FValue.hxx index d2fbfd47e9ba..9fa8d09199e6 100644 --- a/include/connectivity/FValue.hxx +++ b/include/connectivity/FValue.hxx @@ -472,7 +472,7 @@ namespace connectivity /// TSetBound is a functor to set the bound value with e.q. for_each call - struct OOO_DLLPUBLIC_DBTOOLS TSetBound + struct TSetBound { bool m_bBound; TSetBound(bool _bBound) : m_bBound(_bBound){} @@ -482,7 +482,7 @@ namespace connectivity /// TSetBound is a functor to set the bound value with e.q. for_each call - struct OOO_DLLPUBLIC_DBTOOLS TSetRefBound + struct TSetRefBound { bool m_bBound; TSetRefBound(bool _bBound) : m_bBound(_bBound){} diff --git a/include/filter/msfilter/dffrecordheader.hxx b/include/filter/msfilter/dffrecordheader.hxx index acd0d2539889..cddc2e3d2447 100644 --- a/include/filter/msfilter/dffrecordheader.hxx +++ b/include/filter/msfilter/dffrecordheader.hxx @@ -26,7 +26,7 @@ #include <tools/solar.h> #include <tools/stream.hxx> -class MSFILTER_DLLPUBLIC DffRecordHeader +class DffRecordHeader { public: sal_uInt8 nRecVer; // may be DFF_PSFLAG_CONTAINER diff --git a/include/filter/msfilter/mscodec.hxx b/include/filter/msfilter/mscodec.hxx index b0ab818449ae..8a409800407a 100644 --- a/include/filter/msfilter/mscodec.hxx +++ b/include/filter/msfilter/mscodec.hxx @@ -476,13 +476,13 @@ struct MSFILTER_DLLPUBLIC EncryptionVerifierRC4 EncryptionVerifierRC4(); }; -struct MSFILTER_DLLPUBLIC StandardEncryptionInfo +struct StandardEncryptionInfo { EncryptionStandardHeader header; EncryptionVerifierAES verifier; }; -struct MSFILTER_DLLPUBLIC RC4EncryptionInfo +struct RC4EncryptionInfo { EncryptionStandardHeader header; EncryptionVerifierRC4 verifier; diff --git a/include/filter/msfilter/svdfppt.hxx b/include/filter/msfilter/svdfppt.hxx index 2be1cd00dbb0..2895b98fbf0b 100644 --- a/include/filter/msfilter/svdfppt.hxx +++ b/include/filter/msfilter/svdfppt.hxx @@ -117,7 +117,7 @@ struct SdHyperlinkEntry }; // Helper class for reading the PPT InteractiveInfoAtom -struct MSFILTER_DLLPUBLIC PptInteractiveInfoAtom +struct PptInteractiveInfoAtom { sal_uInt32 nSoundRef; sal_uInt32 nExHyperlinkId; diff --git a/include/filter/msfilter/util.hxx b/include/filter/msfilter/util.hxx index 8aa01f5be952..1d3bae385677 100644 --- a/include/filter/msfilter/util.hxx +++ b/include/filter/msfilter/util.hxx @@ -70,7 +70,7 @@ MSFILTER_DLLPUBLIC OString ConvertColor( const Color &rColor, bool bAutoColor = /** Paper size in 1/100 millimeters. */ -struct MSFILTER_DLLPUBLIC ApiPaperSize +struct ApiPaperSize { sal_Int32 mnWidth; sal_Int32 mnHeight; diff --git a/include/svx/transfrmhelper.hxx b/include/svx/transfrmhelper.hxx index d5f293dbc10a..481814b298c5 100644 --- a/include/svx/transfrmhelper.hxx +++ b/include/svx/transfrmhelper.hxx @@ -24,7 +24,7 @@ #include <tools/fldunit.hxx> #include <tools/mapunit.hxx> -class SVX_DLLPUBLIC TransfrmHelper +class TransfrmHelper { public: static void ConvertRect(basegfx::B2DRange& rRange, const sal_uInt16 nDigits, const MapUnit ePoolUnit, const FieldUnit eDlgUnit) diff --git a/include/svx/xmlexchg.hxx b/include/svx/xmlexchg.hxx index 6d2c0bfc1bae..044422e15406 100644 --- a/include/svx/xmlexchg.hxx +++ b/include/svx/xmlexchg.hxx @@ -42,7 +42,7 @@ namespace svx //= OXFormsDescriptor - struct SVX_DLLPUBLIC OXFormsDescriptor { + struct OXFormsDescriptor { OUString szName; OUString szServiceName; diff --git a/include/tools/svborder.hxx b/include/tools/svborder.hxx index 9eef88819847..e1fa1b5356b1 100644 --- a/include/tools/svborder.hxx +++ b/include/tools/svborder.hxx @@ -23,7 +23,7 @@ #include <tools/toolsdllapi.h> #include <tools/gen.hxx> -class SAL_WARN_UNUSED TOOLS_DLLPUBLIC SvBorder +class SAL_WARN_UNUSED SvBorder { long nTop, nRight, nBottom, nLeft; diff --git a/include/vcl/bitmap.hxx b/include/vcl/bitmap.hxx index 0be13c12bf3e..904530b3e5f0 100644 --- a/include/vcl/bitmap.hxx +++ b/include/vcl/bitmap.hxx @@ -110,7 +110,7 @@ enum class BmpFilter Unknown = 65535 }; -class VCL_DLLPUBLIC BmpFilterParam +class BmpFilterParam { public: diff --git a/include/vcl/commandevent.hxx b/include/vcl/commandevent.hxx index 778348b3d1a3..464734fe4f94 100644 --- a/include/vcl/commandevent.hxx +++ b/include/vcl/commandevent.hxx @@ -206,7 +206,7 @@ enum class ShowDialogId About = 2, }; -class VCL_DLLPUBLIC CommandDialogData +class CommandDialogData { ShowDialogId m_nDialogId; public: @@ -242,7 +242,7 @@ enum class MediaCommand NextTrackHold = 21,// Button Right holding pressed. }; -class VCL_DLLPUBLIC CommandMediaData +class CommandMediaData { MediaCommand m_nMediaId; bool m_bPassThroughToOS; @@ -270,7 +270,7 @@ public: sal_uLong GetEnd() const { return mnEnd; } }; -class VCL_DLLPUBLIC CommandSwipeData +class CommandSwipeData { double mnVelocityX; public: @@ -286,7 +286,7 @@ public: }; -class VCL_DLLPUBLIC CommandLongPressData +class CommandLongPressData { double mnX; double mnY; diff --git a/include/vcl/pointr.hxx b/include/vcl/pointr.hxx index 8370b9f9d296..405a5a875e38 100644 --- a/include/vcl/pointr.hxx +++ b/include/vcl/pointr.hxx @@ -23,7 +23,7 @@ #include <vcl/dllapi.h> #include <vcl/ptrstyle.hxx> -class VCL_DLLPUBLIC Pointer +class Pointer { PointerStyle meStyle; diff --git a/sc/inc/colorscale.hxx b/sc/inc/colorscale.hxx index 0d33f1bb7146..2a2004e5673b 100644 --- a/sc/inc/colorscale.hxx +++ b/sc/inc/colorscale.hxx @@ -91,7 +91,7 @@ enum ScAxisPosition } -struct SC_DLLPUBLIC ScDataBarFormatData +struct ScDataBarFormatData { ScDataBarFormatData(): maAxisColor(COL_BLACK), diff --git a/sw/inc/ndindex.hxx b/sw/inc/ndindex.hxx index 51c716d85a5a..494ebb85e017 100644 --- a/sw/inc/ndindex.hxx +++ b/sw/inc/ndindex.hxx @@ -129,7 +129,7 @@ inline std::ostream &operator <<(std::ostream& s, const SwNodeIndex& index) // SwRange -class SW_DLLPUBLIC SwNodeRange +class SwNodeRange { public: SwNodeIndex aStart; diff --git a/sw/source/filter/inc/fltshell.hxx b/sw/source/filter/inc/fltshell.hxx index 34f1ab8862dc..c021f8514c9f 100644 --- a/sw/source/filter/inc/fltshell.hxx +++ b/sw/source/filter/inc/fltshell.hxx @@ -47,7 +47,7 @@ inline bool SwFltGetFlag(sal_uLong nFieldFlags, int no) //Subvert the Node/Content system to get positions which don't update as //content is appended to them -struct SW_DLLPUBLIC SwFltPosition +struct SwFltPosition { public: SwNodeIndex m_nNode; diff --git a/vcl/inc/headless/svpgdi.hxx b/vcl/inc/headless/svpgdi.hxx index 5879c1bfdf44..7130d1153d6b 100644 --- a/vcl/inc/headless/svpgdi.hxx +++ b/vcl/inc/headless/svpgdi.hxx @@ -71,7 +71,7 @@ typedef void (*damageHandler)(void* handle, sal_Int32 nExtentsX, sal_Int32 nExtentsY, sal_Int32 nExtentsWidth, sal_Int32 nExtentsHeight); -struct VCL_DLLPUBLIC DamageHandler +struct DamageHandler { void *handle; damageHandler damaged; |