summaryrefslogtreecommitdiff
path: root/compilerplugins
diff options
context:
space:
mode:
authorNoel Grandin <noel.grandin@collabora.co.uk>2019-09-25 18:25:20 +0200
committerNoel Grandin <noel.grandin@collabora.co.uk>2019-09-26 08:04:37 +0200
commite7a1d057c414b78fdd685f1de0008efc820bfa51 (patch)
tree0ad5c99c0079a4e1bdd524dfcf29c89065fe51fd /compilerplugins
parent2a38ec580b3b6ffe11276462547a41c467a51197 (diff)
new loplugin virtualdead
to look for virtual methods where all of the implementations of that method do nothing useful Change-Id: I623456ade1c55fe8048d23f69cb692540378daa4 Reviewed-on: https://gerrit.libreoffice.org/79579 Tested-by: Jenkins Reviewed-by: Noel Grandin <noel.grandin@collabora.co.uk>
Diffstat (limited to 'compilerplugins')
-rw-r--r--compilerplugins/clang/virtualdead.cxx267
-rwxr-xr-xcompilerplugins/clang/virtualdead.py63
-rw-r--r--compilerplugins/clang/virtualdead.results303
3 files changed, 633 insertions, 0 deletions
diff --git a/compilerplugins/clang/virtualdead.cxx b/compilerplugins/clang/virtualdead.cxx
new file mode 100644
index 000000000000..dd6e311193b8
--- /dev/null
+++ b/compilerplugins/clang/virtualdead.cxx
@@ -0,0 +1,267 @@
+/* -*- 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 "check.hxx"
+
+#include <cassert>
+#include <string>
+#include <iostream>
+#include <set>
+#include <fstream>
+
+/**
+Look for virtual methods where all of the overrides either
+(a) do nothing
+(b) all return the same value
+
+The process goes something like this:
+ $ make check
+ $ make FORCE_COMPILE_ALL=1 COMPILER_PLUGIN_TOOL='VirtualDead' check
+ $ ./compilerplugins/clang/VirtualDead.py
+ $ for dir in *; do make FORCE_COMPILE_ALL=1 UPDATE_FILES=$dir COMPILER_PLUGIN_TOOL='removevirtuals' $dir; done
+
+Note that the actual process may involve a fair amount of undoing, hand editing, and general messing around
+to get it to work :-)
+*/
+
+namespace
+{
+struct MyFuncInfo
+{
+ std::string name;
+ std::string sourceLocation;
+ std::string returnValue;
+};
+bool operator<(const MyFuncInfo& lhs, const MyFuncInfo& rhs)
+{
+ return std::tie(lhs.name, lhs.returnValue) < std::tie(rhs.name, rhs.returnValue);
+}
+
+// try to limit the voluminous output a little
+static std::set<MyFuncInfo> definitionSet;
+
+class VirtualDead : public RecursiveASTVisitor<VirtualDead>, public loplugin::Plugin
+{
+public:
+ explicit VirtualDead(loplugin::InstantiationData const& data)
+ : Plugin(data)
+ {
+ }
+
+ virtual void run() override
+ {
+ TraverseDecl(compiler.getASTContext().getTranslationUnitDecl());
+
+ // 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 MyFuncInfo& s : definitionSet)
+ output += "virtual:\t" + s.name + "\t" + s.sourceLocation + "\t" + s.returnValue + "\n";
+ std::ofstream myfile;
+ myfile.open(WORKDIR "/loplugin.virtualdead.log", std::ios::app | std::ios::out);
+ myfile << output;
+ myfile.close();
+ }
+ bool shouldVisitTemplateInstantiations() const { return true; }
+ bool shouldVisitImplicitCode() const { return true; }
+
+ bool VisitCXXMethodDecl(const CXXMethodDecl* decl);
+
+private:
+ std::string getCallValue(const Expr* arg);
+ std::string toString(SourceLocation loc);
+ void markSuperclassMethods(const CXXMethodDecl* methodDecl, std::string returnValue);
+};
+
+std::string niceName(const CXXMethodDecl* cxxMethodDecl)
+{
+ while (cxxMethodDecl->getTemplateInstantiationPattern())
+ cxxMethodDecl = dyn_cast<CXXMethodDecl>(cxxMethodDecl->getTemplateInstantiationPattern());
+ while (cxxMethodDecl->getInstantiatedFromMemberFunction())
+ cxxMethodDecl = dyn_cast<CXXMethodDecl>(cxxMethodDecl->getInstantiatedFromMemberFunction());
+ std::string s = cxxMethodDecl->getReturnType().getCanonicalType().getAsString() + " "
+ + cxxMethodDecl->getQualifiedNameAsString() + "(";
+ for (const ParmVarDecl* pParmVarDecl : cxxMethodDecl->parameters())
+ {
+ s += pParmVarDecl->getType().getCanonicalType().getAsString();
+ s += ",";
+ }
+ s += ")";
+ if (cxxMethodDecl->isConst())
+ {
+ s += "const";
+ }
+ return s;
+}
+
+bool VirtualDead::VisitCXXMethodDecl(const CXXMethodDecl* methodDecl)
+{
+ if (ignoreLocation(methodDecl))
+ return true;
+ if (!methodDecl->isVirtual() || methodDecl->isDeleted())
+ return true;
+ if (isa<CXXDestructorDecl>(methodDecl))
+ return true;
+ // ignore stuff that forms part of the stable URE interface
+ if (isInUnoIncludeFile(methodDecl->getCanonicalDecl()))
+ return true;
+
+ if (!methodDecl->isThisDeclarationADefinition())
+ return true;
+
+ std::string returnValue;
+
+ auto body = methodDecl->getBody();
+ if (body)
+ {
+ auto compoundStmt = dyn_cast<CompoundStmt>(body);
+ if (!compoundStmt)
+ returnValue = "empty";
+ else if (compoundStmt->size() == 0)
+ returnValue = "empty";
+ else
+ {
+ if (auto returnStmt = dyn_cast<ReturnStmt>(*compoundStmt->body_begin()))
+ {
+ if (!returnStmt->getRetValue())
+ returnValue = "empty";
+ else
+ returnValue = getCallValue(returnStmt->getRetValue());
+ }
+ else
+ returnValue = "unknown-stmt";
+ }
+ }
+ else
+ returnValue = "empty";
+
+ markSuperclassMethods(methodDecl, returnValue);
+
+ return true;
+}
+
+void VirtualDead::markSuperclassMethods(const CXXMethodDecl* methodDecl, std::string returnValue)
+{
+ if (methodDecl->size_overridden_methods() == 0)
+ {
+ std::string aNiceName = niceName(methodDecl);
+ definitionSet.insert(
+ { aNiceName, toString(methodDecl->getCanonicalDecl()->getLocation()), returnValue });
+ return;
+ }
+
+ for (auto iter = methodDecl->begin_overridden_methods();
+ iter != methodDecl->end_overridden_methods(); ++iter)
+ {
+ const CXXMethodDecl* overriddenMethod = *iter;
+ markSuperclassMethods(overriddenMethod, returnValue);
+ }
+}
+
+std::string VirtualDead::getCallValue(const Expr* arg)
+{
+ arg = arg->IgnoreParenCasts();
+ if (isa<CXXDefaultArgExpr>(arg))
+ {
+ arg = dyn_cast<CXXDefaultArgExpr>(arg)->getExpr();
+ }
+ arg = arg->IgnoreParenCasts();
+ // ignore this, it seems to trigger an infinite recursion
+ if (isa<UnaryExprOrTypeTraitExpr>(arg))
+ return "unknown1";
+ if (arg->isValueDependent())
+ return "unknown2";
+ APSInt x1;
+ if (compat::EvaluateAsInt(arg, x1, compiler.getASTContext()))
+ {
+ return x1.toString(10);
+ }
+ if (isa<CXXNullPtrLiteralExpr>(arg))
+ {
+ return "0";
+ }
+ if (isa<MaterializeTemporaryExpr>(arg))
+ {
+ const CXXBindTemporaryExpr* strippedArg
+ = dyn_cast_or_null<CXXBindTemporaryExpr>(arg->IgnoreParenCasts());
+ if (strippedArg)
+ {
+ auto temp = dyn_cast<CXXTemporaryObjectExpr>(strippedArg->getSubExpr());
+ if (temp->getNumArgs() == 0)
+ {
+ if (loplugin::TypeCheck(temp->getType())
+ .Class("OUString")
+ .Namespace("rtl")
+ .GlobalNamespace())
+ {
+ return "\"\"";
+ }
+ if (loplugin::TypeCheck(temp->getType())
+ .Class("OString")
+ .Namespace("rtl")
+ .GlobalNamespace())
+ {
+ return "\"\"";
+ }
+ return "defaultConstruct";
+ }
+ }
+ }
+
+ // Get the expression contents.
+ // This helps us find params which are always initialised with something like "OUString()".
+ SourceManager& SM = compiler.getSourceManager();
+ SourceLocation startLoc = compat::getBeginLoc(arg);
+ SourceLocation endLoc = compat::getEndLoc(arg);
+ const char* p1 = SM.getCharacterData(startLoc);
+ const char* p2 = SM.getCharacterData(endLoc);
+ if (!p1 || !p2 || (p2 - p1) < 0 || (p2 - p1) > 40)
+ {
+ return "unknown3";
+ }
+ unsigned n = Lexer::MeasureTokenLength(endLoc, SM, compiler.getLangOpts());
+ std::string s(p1, p2 - p1 + n);
+ // strip linefeed and tab characters so they don't interfere with the parsing of the log file
+ std::replace(s.begin(), s.end(), '\r', ' ');
+ std::replace(s.begin(), s.end(), '\n', ' ');
+ std::replace(s.begin(), s.end(), '\t', ' ');
+
+ // now normalize the value. For some params, like OUString, we can pass it as OUString() or "" and they are the same thing
+ if (s == "OUString()")
+ s = "\"\"";
+ else if (s == "OString()")
+ s = "\"\"";
+ else if (s == "aEmptyOUStr") //sw
+ s = "\"\"";
+ else if (s == "EMPTY_OUSTRING") //sc
+ s = "\"\"";
+ else if (s == "GetEmptyOUString()") //sc
+ s = "\"\"";
+
+ if (s[0] == '"' || s[0] == '\'')
+ return s;
+ return "unknown4";
+}
+
+std::string VirtualDead::toString(SourceLocation loc)
+{
+ SourceLocation expansionLoc = compiler.getSourceManager().getExpansionLoc(loc);
+ StringRef name = compiler.getSourceManager().getFilename(expansionLoc);
+ std::string sourceLocation
+ = std::string(name.substr(strlen(SRCDIR) + 1)) + ":"
+ + std::to_string(compiler.getSourceManager().getSpellingLineNumber(expansionLoc));
+ loplugin::normalizeDotDotInFilePath(sourceLocation);
+ return sourceLocation;
+}
+
+loplugin::Plugin::Registration<VirtualDead> X("virtualdead", false);
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/compilerplugins/clang/virtualdead.py b/compilerplugins/clang/virtualdead.py
new file mode 100755
index 000000000000..e32b5d788cb5
--- /dev/null
+++ b/compilerplugins/clang/virtualdead.py
@@ -0,0 +1,63 @@
+#!/usr/bin/python
+
+import sys
+import re
+import io
+
+callDict = dict() # callInfo tuple -> callValue
+
+# clang does not always use exactly the same numbers in the type-parameter vars it generates
+# so I need to substitute them to ensure we can match correctly.
+normalizeTypeParamsRegex = re.compile(r"type-parameter-\d+-\d+")
+def normalizeTypeParams( line ):
+ return normalizeTypeParamsRegex.sub("type-parameter-?-?", line)
+
+# reading as binary (since we known it is pure ascii) is much faster than reading as unicode
+with io.open("workdir/loplugin.virtualdead.log", "rb", buffering=1024*1024) as txt:
+ for line in txt:
+ try:
+ tokens = line.strip().split("\t")
+ nameAndParams = normalizeTypeParams(tokens[1])
+ sourceLocation = tokens[2]
+ returnValue = tokens[3]
+ callInfo = (nameAndParams, sourceLocation)
+ if not callInfo in callDict:
+ callDict[callInfo] = set()
+ callDict[callInfo].add(returnValue)
+ except IndexError:
+ print "problem with line " + line.strip()
+ raise
+
+tmp1list = list()
+for callInfo, callValues in callDict.iteritems():
+ nameAndParams = callInfo[1]
+ if len(callValues) != 1:
+ continue
+ callValue = next(iter(callValues))
+ if "unknown-stmt" in callValue:
+ continue
+ if "unknown3" in callValue:
+ continue
+ if "unknown4" in callValue:
+ continue
+ if "pure" in callValue:
+ continue
+ sourceLoc = callInfo[1]
+ if sourceLoc.startswith("workdir/"):
+ continue
+ functionSig = callInfo[0]
+ tmp1list.append((sourceLoc, functionSig, callValue))
+
+
+# sort results by filename:lineno
+def natural_sort_key(s, _nsre=re.compile('([0-9]+)')):
+ return [int(text) if text.isdigit() else text.lower()
+ for text in re.split(_nsre, s)]
+tmp1list.sort(key=lambda v: natural_sort_key(v[0]))
+
+# print out the results
+with open("compilerplugins/clang/virtualdead.results", "wt") as f:
+ for v in tmp1list:
+ f.write(v[0] + "\n")
+ f.write(" " + v[1] + "\n")
+ f.write(" " + v[2] + "\n")
diff --git a/compilerplugins/clang/virtualdead.results b/compilerplugins/clang/virtualdead.results
new file mode 100644
index 000000000000..dbe267b1ee4f
--- /dev/null
+++ b/compilerplugins/clang/virtualdead.results
@@ -0,0 +1,303 @@
+basctl/source/inc/bastypes.hxx:191
+ _Bool basctl::BaseWindow::CanClose()
+ 1
+basic/source/comp/codegen.cxx:464
+ void OffSetAccumulator::start(const unsigned char *,)
+ empty
+basic/source/comp/codegen.cxx:476
+ _Bool OffSetAccumulator::processParams()
+ 0
+basic/source/comp/codegen.cxx:526
+ _Bool BufferTransformer::processParams()
+ 1
+chart2/source/controller/dialogs/ChartTypeDialogController.hxx:99
+ _Bool chart::ChartTypeDialogController::shouldShow_DeepStackingControl()const
+ 0
+chart2/source/controller/sidebar/ChartSidebarSelectionListener.hxx:30
+ void chart::sidebar::ChartSidebarSelectionListenerParent::SelectionInvalid()
+ empty
+dbaccess/source/ui/inc/IUpdateHelper.hxx:38
+ void dbaui::IUpdateHelper::moveToInsertRow()
+ empty
+desktop/source/deployment/registry/inc/dp_backenddb.hxx:119
+ class rtl::OUString dp_registry::backend::BackendDb::getDbNSName()
+ "http://openoffi
+extensions/source/bibliography/loadlisteneradapter.hxx:111
+ void bib::OLoadListener::_unloaded(const struct com::sun::star::lang::EventObject &,)
+ empty
+extensions/source/propctrlr/commoncontrol.hxx:127
+ short pcr::CommonBehaviourControl::getControlType()
+ unknown2
+extensions/source/propctrlr/commoncontrol.hxx:129
+ class com::sun::star::uno::Reference<class com::sun::star::inspection::XPropertyControlContext> pcr::CommonBehaviourControl::getControlContext()
+ unknown2
+extensions/source/propctrlr/commoncontrol.hxx:133
+ class com::sun::star::uno::Reference<class com::sun::star::awt::XWindow> pcr::CommonBehaviourControl::getControlWindow()
+ unknown2
+extensions/source/propctrlr/commoncontrol.hxx:135
+ unsigned char pcr::CommonBehaviourControl::isModified()
+ unknown2
+forms/source/xforms/datatypes.hxx:237
+ class com::sun::star::uno::Reference<class com::sun::star::beans::XPropertySetInfo> xforms::ODerivedDataType::getPropertySetInfo()
+ unknown2
+forms/source/xforms/namedcollection.hxx:80
+ class com::sun::star::uno::Type NamedCollection::getElementType()
+ unknown2
+forms/source/xforms/namedcollection.hxx:85
+ unsigned char NamedCollection::hasElements()
+ unknown2
+forms/source/xforms/namedcollection.hxx:99
+ class com::sun::star::uno::Sequence<class rtl::OUString> NamedCollection::getElementNames()
+ unknown2
+forms/source/xforms/namedcollection.hxx:104
+ unsigned char NamedCollection::hasByName(const class rtl::OUString &,)
+ unknown2
+Gui/qaccessible.h:465
+ class QObject * QAccessibleInterface::object()const
+ 0
+Gui/qaccessible.h:466
+ class QWindow * QAccessibleInterface::window()const
+ 0
+Gui/qaccessible.h:478
+ int QAccessibleInterface::indexOfChild(const class QAccessibleInterface *,)const
+ 0
+Gui/qaccessible.h:482
+ void QAccessibleInterface::setText(enum QAccessible::Text,const class QString &,)
+ empty
+Gui/qaccessible.h:612
+ _Bool QAccessibleTableInterface::isColumnSelected(int,)const
+ 1
+Gui/qaccessible.h:613
+ _Bool QAccessibleTableInterface::isRowSelected(int,)const
+ 1
+Gui/qaccessible.h:619
+ void QAccessibleTableInterface::modelChange(class QAccessibleTableModelChangeEvent *,)
+ empty
+include/basegfx/utils/systemdependentdata.hxx:122
+ unsigned int basegfx::SystemDependentData::getHoldCyclesInSeconds()const
+ 60
+include/basegfx/utils/unopolypolygon.hxx:97
+ void basegfx::unotools::UnoPolyPolygon::modifying()const
+ empty
+include/canvas/base/bitmapcanvasbase.hxx:80
+ unsigned char canvas::BitmapCanvasBase::hasAlpha()
+ 1
+include/canvas/base/bufferedgraphicdevicebase.hxx:95
+ class com::sun::star::uno::Reference<class com::sun::star::rendering::XBufferController> canvas::BufferedGraphicDeviceBase::getBufferController()
+ unknown2
+include/canvas/base/bufferedgraphicdevicebase.hxx:108
+ void canvas::BufferedGraphicDeviceBase::destroyBuffers()
+ empty
+include/canvas/base/graphicdevicebase.hxx:230
+ class com::sun::star::uno::Reference<class com::sun::star::lang::XMultiServiceFactory> canvas::GraphicDeviceBase::getParametricPolyPolygonFactory()
+ unknown2
+include/canvas/base/graphicdevicebase.hxx:235
+ unsigned char canvas::GraphicDeviceBase::hasFullScreenMode()
+ 0
+include/canvas/base/graphicdevicebase.hxx:240
+ unsigned char canvas::GraphicDeviceBase::enterFullScreenMode(unsigned char,)
+ 0
+include/canvas/base/graphicdevicebase.hxx:246
+ class com::sun::star::uno::Reference<class com::sun::star::uno::XInterface> canvas::GraphicDeviceBase::createInstance(const class rtl::OUString &,)
+ unknown2
+include/canvas/base/graphicdevicebase.hxx:254
+ class com::sun::star::uno::Reference<class com::sun::star::uno::XInterface> canvas::GraphicDeviceBase::createInstanceWithArguments(const class rtl::OUString &,const class com::sun::star::uno::Sequence<class com::sun::star::uno::Any> &,)
+ unknown2
+include/canvas/base/graphicdevicebase.hxx:306
+ void canvas::GraphicDeviceBase::removePropertyChangeListener(const class rtl::OUString &,const class com::sun::star::uno::Reference<class com::sun::star::beans::XPropertyChangeListener> &,)
+ empty
+include/canvas/base/graphicdevicebase.hxx:319
+ void canvas::GraphicDeviceBase::removeVetoableChangeListener(const class rtl::OUString &,const class com::sun::star::uno::Reference<class com::sun::star::beans::XVetoableChangeListener> &,)
+ empty
+include/comphelper/servicedecl.hxx:164
+ class rtl::OUString comphelper::service_decl::detail::OwnServiceImpl::getImplementationName()
+ unknown2
+include/comphelper/servicedecl.hxx:167
+ unsigned char comphelper::service_decl::detail::OwnServiceImpl::supportsService(const class rtl::OUString &,)
+ unknown2
+include/comphelper/servicedecl.hxx:171
+ class com::sun::star::uno::Sequence<class rtl::OUString> comphelper::service_decl::detail::OwnServiceImpl::getSupportedServiceNames()
+ unknown2
+include/connectivity/sdbcx/IRefreshable.hxx:31
+ void connectivity::sdbcx::IRefreshableGroups::refreshGroups()
+ empty
+include/editeng/splwrap.hxx:105
+ _Bool SvxSpellWrapper::HasOtherCnt()
+ 0
+include/filter/msfilter/msdffimp.hxx:546
+ _Bool SvxMSDffManager::ShapeHasText(unsigned long,unsigned long,)const
+ 1
+include/svl/svdde.hxx:237
+ class DdeData * DdeTopic::Get(enum SotClipboardFormatId,)
+ 0
+include/svl/svdde.hxx:238
+ _Bool DdeTopic::Put(const class DdeData *,)
+ 0
+include/svl/svdde.hxx:239
+ _Bool DdeTopic::Execute(const class rtl::OUString *,)
+ 0
+include/svl/svdde.hxx:241
+ _Bool DdeTopic::MakeItem(const class rtl::OUString &,)
+ 0
+include/svl/svdde.hxx:244
+ _Bool DdeTopic::StartAdviseLoop()
+ 0
+include/svl/undo.hxx:168
+ void SfxUndoListener::undoManagerDying()
+ empty
+include/svtools/unoevent.hxx:199
+ unsigned short SvEventDescriptor::getMacroItemWhich()const
+ 108
+include/svx/selectioncontroller.hxx:68
+ _Bool sdr::SelectionController::TakeFormatPaintBrush(class std::shared_ptr<class SfxItemSet> &,)
+ 0
+include/svx/svdobj.hxx:711
+ _Bool SdrObject::IsNode()const
+ 1
+include/test/text/xtextcontent.hxx:29
+ _Bool apitest::XTextContent::isAttachSupported()
+ 1
+include/ucbhelper/resultset.hxx:425
+ void ucbhelper::ResultSetDataSupplier::close()
+ empty
+include/unotools/desktopterminationobserver.hxx:35
+ _Bool utl::ITerminationListener::queryTermination()const
+ 1
+include/vbahelper/vbacollectionimpl.hxx:290
+ int ScVbaCollectionBase::getCount()
+ unknown2
+include/vbahelper/vbacollectionimpl.hxx:324
+ unsigned char ScVbaCollectionBase::hasElements()
+ unknown2
+include/vbahelper/vbahelperinterface.hxx:77
+ int InheritedHelperInterfaceImpl::getCreator()
+ 1400204879
+include/vbahelper/vbahelperinterface.hxx:81
+ class com::sun::star::uno::Reference<class ooo::vba::XHelperInterface> InheritedHelperInterfaceImpl::getParent()
+ unknown2
+include/vbahelper/vbahelperinterface.hxx:91
+ class rtl::OUString InheritedHelperInterfaceImpl::getImplementationName()
+ unknown2
+include/vbahelper/vbareturntypes.hxx:41
+ type-parameter-?-? ooo::vba::DefaultReturnHelper::getValue()
+ unknown2
+include/vcl/accessibletable.hxx:94
+ class rtl::OUString vcl::table::IAccessibleTable::GetRowDescription(int,)const
+ "row description"
+include/vcl/accessibletable.hxx:96
+ class rtl::OUString vcl::table::IAccessibleTable::GetColumnDescription(unsigned short,)const
+ "col description"
+sc/source/core/opencl/formulagroupcl.cxx:1059
+ void sc::opencl::DynamicKernelSlidingArgument::GenSlidingWindowFunction(class std::__cxx11::basic_stringstream<char> &,)
+ empty
+sc/source/core/opencl/opbase.hxx:203
+ _Bool sc::opencl::OpBase::takeNumeric()const
+ 1
+sc/source/ui/vba/vbacondition.hxx:41
+ class rtl::OUString ScVbaCondition::Formula1()
+ unknown2
+sc/source/ui/vba/vbacondition.hxx:42
+ class rtl::OUString ScVbaCondition::Formula2()
+ unknown2
+sc/source/ui/vba/vbasheetobject.hxx:117
+ class rtl::OUString ScVbaSheetObjectBase::implGetBaseName()const
+ "Button"
+sc/source/ui/vba/vbasheetobjects.cxx:141
+ class rtl::OUString ScVbaObjectContainer::implGetShapeServiceName()const
+ "com.sun.star.drawing.ControlShape"
+sd/source/ui/inc/smarttag.hxx:59
+ _Bool sd::SmartTag::RequestHelp(const class HelpEvent &,)
+ 0
+sd/source/ui/inc/smarttag.hxx:171
+ _Bool sd::SmartHdl::isMarkable()const
+ 0
+slideshow/source/engine/animationfactory.cxx:443
+ void slideshow::internal::(anonymous namespace)::GenericAnimation::prefetch(const class std::shared_ptr<class slideshow::internal::AnimatableShape> &,const class std::shared_ptr<class slideshow::internal::ShapeAttributeLayer> &,)
+ empty
+slideshow/source/inc/slide.hxx:118
+ void slideshow::internal::Slide::disablePaintOverlay()
+ empty
+svx/source/inc/docrecovery.hxx:162
+ void svx::DocRecovery::IRecoveryUpdateListener::start()
+ empty
+sw/inc/IDocumentState.hxx:48
+ void IDocumentState::SetLoaded()
+ empty
+sw/source/core/inc/swblocks.hxx:81
+ enum SwImpBlocks::FileType SwImpBlocks::GetFileType()const
+ 3
+sw/source/uibase/inc/imaildsplistener.hxx:43
+ void IMailDispatcherListener::started(class rtl::Reference<class MailDispatcher>,)
+ empty
+sw/source/uibase/inc/imaildsplistener.hxx:48
+ void IMailDispatcherListener::stopped(class rtl::Reference<class MailDispatcher>,)
+ empty
+vcl/inc/salframe.hxx:145
+ void SalFrame::SetRepresentedURL(const class rtl::OUString &,)
+ empty
+vcl/inc/salframe.hxx:147
+ void SalFrame::DrawMenuBar()
+ empty
+vcl/inc/salframe.hxx:201
+ _Bool SalFrame::MapUnicodeToKeyCode(char16_t,struct o3tl::strong_int<unsigned short, struct LanguageTypeTag>,class vcl::KeyCode &,)
+ 0
+vcl/inc/salgdiimpl.hxx:115
+ _Bool SalGraphicsImpl::drawPolyLineBezier(unsigned int,const struct SalPoint *,const enum PolyFlags *,)
+ 0
+vcl/inc/salgdiimpl.hxx:120
+ _Bool SalGraphicsImpl::drawPolygonBezier(unsigned int,const struct SalPoint *,const enum PolyFlags *,)
+ 0
+vcl/inc/salgdiimpl.hxx:125
+ _Bool SalGraphicsImpl::drawPolyPolygonBezier(unsigned int,const unsigned int *,const struct SalPoint *const *,const enum PolyFlags *const *,)
+ 0
+vcl/inc/salgdiimpl.hxx:166
+ _Bool SalGraphicsImpl::drawEPS(long,long,long,long,void *,unsigned int,)
+ 0
+vcl/inc/salinst.hxx:92
+ _Bool SalInstance::SVMainHook(int *,)
+ 0
+vcl/inc/salmenu.hxx:77
+ void SalMenu::GetSystemMenuData(struct SystemMenuData *,)
+ empty
+vcl/inc/salmenu.hxx:80
+ _Bool SalMenu::AddMenuBarButton(const struct SalMenuButtonItem &,)
+ 0
+vcl/inc/salmenu.hxx:81
+ void SalMenu::RemoveMenuBarButton(unsigned short,)
+ empty
+vcl/inc/salobj.hxx:49
+ void SalObject::Enable(_Bool,)
+ empty
+vcl/inc/salprn.hxx:85
+ int SalInfoPrinter::GetLandscapeAngle(const class ImplJobSetup *,)
+ 900
+vcl/inc/salprn.hxx:116
+ enum SalPrinterError SalPrinter::GetErrorCode()
+ 0
+vcl/inc/unx/saldata.hxx:54
+ void X11SalData::initNWF()
+ empty
+vcl/inc/unx/saldata.hxx:55
+ void X11SalData::deInitNWF()
+ empty
+vcl/inc/wizdlg.hxx:214
+ _Bool vcl::RoadmapWizard::leaveState(short,)
+ 1
+writerfilter/inc/ooxml/OOXMLDocument.hxx:216
+ void writerfilter::ooxml::OOXMLDocument::setXNoteType(unsigned int,)
+ empty
+writerfilter/source/dmapper/LoggedResources.hxx:93
+ void writerfilter::LoggedStream::lcl_info(const class std::__cxx11::basic_string<char, struct std::char_traits<char>, class std::allocator<char> > &,)
+ empty
+writerfilter/source/ooxml/OOXMLFactory.hxx:72
+ void writerfilter::ooxml::OOXMLFactory_ns::startAction(class writerfilter::ooxml::OOXMLFastContextHandler *,)
+ empty
+writerfilter/source/ooxml/OOXMLFactory.hxx:73
+ void writerfilter::ooxml::OOXMLFactory_ns::charactersAction(class writerfilter::ooxml::OOXMLFastContextHandler *,const class rtl::OUString &,)
+ empty
+writerfilter/source/ooxml/OOXMLFactory.hxx:74
+ void writerfilter::ooxml::OOXMLFactory_ns::endAction(class writerfilter::ooxml::OOXMLFastContextHandler *,)
+ empty
+writerfilter/source/ooxml/OOXMLFactory.hxx:75
+ void writerfilter::ooxml::OOXMLFactory_ns::attributeAction(class writerfilter::ooxml::OOXMLFastContextHandler *,int,const class tools::SvRef<class writerfilter::ooxml::OOXMLValue> &,)
+ empty