diff options
author | Noel Grandin <noel.grandin@collabora.co.uk> | 2017-03-24 08:31:25 +0200 |
---|---|---|
committer | Noel Grandin <noel.grandin@collabora.co.uk> | 2017-03-24 08:57:01 +0000 |
commit | f0593478571009139cd12bac11a9b38e51c42f96 (patch) | |
tree | 7901d4c671ac3a8d8622cccabbffbbdf91f5cc6a | |
parent | ad5bf6b72c89caf0ed7110e4a84e2d6bf1807a24 (diff) |
loplugin:unusedfields
improve the plugin to find fields which are only assigned to in the
constructor
Change-Id: I95b5be238ebba83d950ca15093abdd1849740359
Reviewed-on: https://gerrit.libreoffice.org/35613
Tested-by: Jenkins <ci@libreoffice.org>
Reviewed-by: Noel Grandin <noel.grandin@collabora.co.uk>
-rw-r--r-- | compilerplugins/clang/unusedfields.cxx | 30 | ||||
-rwxr-xr-x | compilerplugins/clang/unusedfields.py | 20 | ||||
-rw-r--r-- | include/basic/sbxvar.hxx | 1 | ||||
-rw-r--r-- | include/vcl/outdev.hxx | 1 | ||||
-rw-r--r-- | vcl/source/app/svapp.cxx | 12 | ||||
-rw-r--r-- | xmlsecurity/inc/macrosecurity.hxx | 2 | ||||
-rw-r--r-- | xmlsecurity/source/component/documentdigitalsignatures.cxx | 2 | ||||
-rw-r--r-- | xmlsecurity/source/dialogs/macrosecurity.cxx | 2 |
8 files changed, 32 insertions, 38 deletions
diff --git a/compilerplugins/clang/unusedfields.cxx b/compilerplugins/clang/unusedfields.cxx index 94a1cb6300d9..04c51195eaf3 100644 --- a/compilerplugins/clang/unusedfields.cxx +++ b/compilerplugins/clang/unusedfields.cxx @@ -57,7 +57,8 @@ bool operator < (const MyFieldInfo &lhs, const MyFieldInfo &rhs) // try to limit the voluminous output a little -static std::set<MyFieldInfo> touchedSet; +static std::set<MyFieldInfo> touchedFromInsideSet; +static std::set<MyFieldInfo> touchedFromConstructorSet; static std::set<MyFieldInfo> touchedFromOutsideSet; static std::set<MyFieldInfo> readFromSet; static std::set<MyFieldInfo> definitionSet; @@ -76,8 +77,10 @@ public: // dump all our output in one write call - this is to try and limit IO "crosstalk" between multiple processes // writing to the same logfile std::string output; - for (const MyFieldInfo & s : touchedSet) - output += "touch:\t" + s.parentClass + "\t" + s.fieldName + "\n"; + for (const MyFieldInfo & s : touchedFromInsideSet) + output += "inside:\t" + s.parentClass + "\t" + s.fieldName + "\n"; + for (const MyFieldInfo & s : touchedFromConstructorSet) + output += "constructor:\t" + s.parentClass + "\t" + s.fieldName + "\n"; for (const MyFieldInfo & s : touchedFromOutsideSet) output += "outside:\t" + s.parentClass + "\t" + s.fieldName + "\n"; for (const MyFieldInfo & s : readFromSet) @@ -100,7 +103,7 @@ public: bool VisitDeclRefExpr( const DeclRefExpr* ); private: MyFieldInfo niceName(const FieldDecl*); - void checkForTouchedFromOutside(const FieldDecl* fieldDecl, const Expr* memberExpr, const MyFieldInfo& fieldInfo); + void checkTouched(const FieldDecl* fieldDecl, const Expr* memberExpr); }; MyFieldInfo UnusedFields::niceName(const FieldDecl* fieldDecl) @@ -193,7 +196,7 @@ bool UnusedFields::VisitMemberExpr( const MemberExpr* memberExpr ) // for the touched-from-outside analysis - checkForTouchedFromOutside(fieldDecl, memberExpr, fieldInfo); + checkTouched(fieldDecl, memberExpr); // for the write-only analysis @@ -281,19 +284,18 @@ bool UnusedFields::VisitDeclRefExpr( const DeclRefExpr* declRefExpr ) if (isInUnoIncludeFile(compiler.getSourceManager().getSpellingLoc(fieldDecl->getLocation()))) { return true; } - MyFieldInfo fieldInfo = niceName(fieldDecl); - touchedSet.insert(fieldInfo); - checkForTouchedFromOutside(fieldDecl, declRefExpr, fieldInfo); + checkTouched(fieldDecl, declRefExpr); return true; } -void UnusedFields::checkForTouchedFromOutside(const FieldDecl* fieldDecl, const Expr* memberExpr, const MyFieldInfo& fieldInfo) { +void UnusedFields::checkTouched(const FieldDecl* fieldDecl, const Expr* memberExpr) { const FunctionDecl* memberExprParentFunction = parentFunctionDecl(memberExpr); const CXXMethodDecl* methodDecl = dyn_cast_or_null<CXXMethodDecl>(memberExprParentFunction); + MyFieldInfo fieldInfo = niceName(fieldDecl); + // it's touched from somewhere outside a class if (!methodDecl) { - touchedSet.insert(fieldInfo); touchedFromOutsideSet.insert(fieldInfo); return; } @@ -303,9 +305,13 @@ void UnusedFields::checkForTouchedFromOutside(const FieldDecl* fieldDecl, const // ignore move/copy operator, it's self->self } else if (constructorDecl && (constructorDecl->isCopyConstructor() || constructorDecl->isMoveConstructor())) { // ignore move/copy constructor, it's self->self + } else if (constructorDecl && memberExprParentFunction->getParent() == fieldDecl->getParent()) { + // if the field is touched from inside it's parent class constructor + touchedFromConstructorSet.insert(fieldInfo); } else { - touchedSet.insert(fieldInfo); - if (memberExprParentFunction->getParent() != fieldDecl->getParent()) { + if (memberExprParentFunction->getParent() == fieldDecl->getParent()) { + touchedFromInsideSet.insert(fieldInfo); + } else { touchedFromOutsideSet.insert(fieldInfo); } } diff --git a/compilerplugins/clang/unusedfields.py b/compilerplugins/clang/unusedfields.py index 7bf910f62d80..77e6446e18e3 100755 --- a/compilerplugins/clang/unusedfields.py +++ b/compilerplugins/clang/unusedfields.py @@ -8,7 +8,8 @@ definitionSet = set() protectedAndPublicDefinitionSet = set() # set of tuple(type, name) definitionToSourceLocationMap = dict() definitionToTypeMap = dict() -callSet = set() +touchedFromInsideSet = set() +touchedFromConstructorSet = set() readFromSet = set() sourceLocationSet = set() touchedFromOutsideSet = set() @@ -45,20 +46,20 @@ with io.open("loplugin.unusedfields.log", "rb", buffering=1024*1024) as txt: if access == "protected" or access == "public": protectedAndPublicDefinitionSet.add(fieldInfo) definitionToSourceLocationMap[fieldInfo] = tokens[5] - elif tokens[0] == "touch:": - callSet.add(parseFieldInfo(tokens)) - elif tokens[0] == "read:": - readFromSet.add(parseFieldInfo(tokens)) - elif tokens[0] == "read:": - readFromSet.add(parseFieldInfo(tokens)) + elif tokens[0] == "inside:": + touchedFromInsideSet.add(parseFieldInfo(tokens)) + elif tokens[0] == "constructor:": + touchedFromConstructorSet.add(parseFieldInfo(tokens)) elif tokens[0] == "outside:": touchedFromOutsideSet.add(parseFieldInfo(tokens)) + elif tokens[0] == "read:": + readFromSet.add(parseFieldInfo(tokens)) else: print( "unknown line: " + line) # Invert the definitionToSourceLocationMap # If we see more than one method at the same sourceLocation, it's being autogenerated as part of a template -# and we should just ignore +# and we should just ignore it sourceLocationToDefinitionMap = {} for k, v in definitionToSourceLocationMap.iteritems(): sourceLocationToDefinitionMap[v] = sourceLocationToDefinitionMap.get(v, []) @@ -68,9 +69,10 @@ for k, definitions in sourceLocationToDefinitionMap.iteritems(): for d in definitions: definitionSet.remove(d) +# Calculate untouched or untouched-except-for-in-constructor untouchedSet = set() for d in definitionSet: - if d in callSet: + if d in touchedFromOutsideSet or d in touchedFromInsideSet: continue srcLoc = definitionToSourceLocationMap[d]; # this is all representations of on-disk data structures diff --git a/include/basic/sbxvar.hxx b/include/basic/sbxvar.hxx index 90127f28a1e9..5645a6cb409f 100644 --- a/include/basic/sbxvar.hxx +++ b/include/basic/sbxvar.hxx @@ -58,7 +58,6 @@ struct SbxValues sal_Int16* pInteger; sal_uInt32* pULong; sal_Int32* pLong; - int* pInt; sal_uInt64* puInt64; sal_Int64* pnInt64; diff --git a/include/vcl/outdev.hxx b/include/vcl/outdev.hxx index f3a407eae2e4..90591a9c00a0 100644 --- a/include/vcl/outdev.hxx +++ b/include/vcl/outdev.hxx @@ -403,7 +403,6 @@ private: mutable bool mbInitTextColor : 1; mutable bool mbInitClipRegion : 1; mutable bool mbClipRegionSet : 1; - mutable bool mbKerning : 1; mutable bool mbNewFont : 1; mutable bool mbTextLines : 1; mutable bool mbTextSpecial : 1; diff --git a/vcl/source/app/svapp.cxx b/vcl/source/app/svapp.cxx index 6184596f8ad5..ecd87c90637a 100644 --- a/vcl/source/app/svapp.cxx +++ b/vcl/source/app/svapp.cxx @@ -170,19 +170,11 @@ struct ImplPostEventData ImplSVEvent * mnEventId; KeyEvent maKeyEvent; MouseEvent maMouseEvent; - ZoomEvent maZoomEvent; - ScrollEvent maScrollEvent; - ImplPostEventData( VclEventId nEvent, vcl::Window* pWin, const KeyEvent& rKeyEvent ) : + ImplPostEventData( VclEventId nEvent, vcl::Window* pWin, const KeyEvent& rKeyEvent ) : mnEvent( nEvent ), mpWin( pWin ), mnEventId( nullptr ), maKeyEvent( rKeyEvent ) {} - ImplPostEventData( VclEventId nEvent, vcl::Window* pWin, const MouseEvent& rMouseEvent ) : + ImplPostEventData( VclEventId nEvent, vcl::Window* pWin, const MouseEvent& rMouseEvent ) : mnEvent( nEvent ), mpWin( pWin ), mnEventId( nullptr ), maMouseEvent( rMouseEvent ) {} -#if !HAVE_FEATURE_DESKTOP - ImplPostEventData( VclEventId nEvent, vcl::Window* pWin, const ZoomEvent& rZoomEvent ) : - mnEvent( nEvent ), mpWin( pWin ), mnEventId( 0 ), maZoomEvent( rZoomEvent ) {} - ImplPostEventData( VclEventId nEvent, vcl::Window* pWin, const ScrollEvent& rScrollEvent ) : - mnEvent( nEvent ), mpWin( pWin ), mnEventId( 0 ), maScrollEvent( rScrollEvent ) {} -#endif }; Application* GetpApp() diff --git a/xmlsecurity/inc/macrosecurity.hxx b/xmlsecurity/inc/macrosecurity.hxx index b5bd77f61030..e02537c07c44 100644 --- a/xmlsecurity/inc/macrosecurity.hxx +++ b/xmlsecurity/inc/macrosecurity.hxx @@ -50,7 +50,6 @@ private: VclPtr<OKButton> m_pOkBtn; VclPtr<PushButton> m_pResetBtn; - css::uno::Reference< css::uno::XComponentContext > mxCtx; css::uno::Reference< css::xml::crypto::XSecurityEnvironment > mxSecurityEnvironment; SvtSecurityOptions maSecOptions; @@ -63,7 +62,6 @@ private: DECL_LINK( OkBtnHdl, Button*, void ); public: MacroSecurity(vcl::Window* pParent, - const css::uno::Reference< css::uno::XComponentContext>& rxCtx, const css::uno::Reference< css::xml::crypto::XSecurityEnvironment >& rxSecurityEnvironment); virtual ~MacroSecurity() override; virtual void dispose() override; diff --git a/xmlsecurity/source/component/documentdigitalsignatures.cxx b/xmlsecurity/source/component/documentdigitalsignatures.cxx index 34bce199d2fb..95f249af12b6 100644 --- a/xmlsecurity/source/component/documentdigitalsignatures.cxx +++ b/xmlsecurity/source/component/documentdigitalsignatures.cxx @@ -400,7 +400,7 @@ void DocumentDigitalSignatures::manageTrustedSources( ) if (aSignatureManager.init()) xSecEnv = aSignatureManager.getSecurityEnvironment(); - ScopedVclPtrInstance< MacroSecurity > aDlg( nullptr, mxCtx, xSecEnv ); + ScopedVclPtrInstance< MacroSecurity > aDlg( nullptr, xSecEnv ); aDlg->Execute(); } diff --git a/xmlsecurity/source/dialogs/macrosecurity.cxx b/xmlsecurity/source/dialogs/macrosecurity.cxx index ac06fabfaac3..63a112361280 100644 --- a/xmlsecurity/source/dialogs/macrosecurity.cxx +++ b/xmlsecurity/source/dialogs/macrosecurity.cxx @@ -56,10 +56,8 @@ IMPL_LINK_NOARG(MacroSecurity, OkBtnHdl, Button*, void) } MacroSecurity::MacroSecurity( vcl::Window* _pParent, - const css::uno::Reference< css::uno::XComponentContext> &_rxCtx, const css::uno::Reference< css::xml::crypto::XSecurityEnvironment >& _rxSecurityEnvironment) : TabDialog(_pParent, "MacroSecurityDialog", "xmlsec/ui/macrosecuritydialog.ui") - , mxCtx(_rxCtx) , mxSecurityEnvironment(_rxSecurityEnvironment) { get(m_pTabCtrl, "tabcontrol"); |