The SDK's <https://wiki.openoffice.org/wiki/Documentation/DevGuide/ProUNO/Java/ Transparent_Use_of_Office_UNO_Components> on all platforms included the Windows- specific unowinreg.dll in generated jars (so that those jars, when distributed to a Windows environment, would find a LO installation by inspecting the Windows registry). That unowinreg.dll was originally built as a 32-bit DLL (though when building a 64-bit Windows LO, it happened to be built as a 64-bit DLL). For non-Windows LO builds, it could either be built locally with a MinGW toolchain (--enable-build-unowinreg) or downloaded from dev-www.libreoffice.org. However, that had various issues: For one, unowinreg.dll was not necessarily available in a distributed jar as a 64-bit DLL for use with a 64-bit JRE on Windows. (Theoretically, running such a jar with a 32-bit JRE to access a 64-bit LO installation's URE jars could have worked. But practically, those URE jars in turn require native DLLs, which would then not have been available as 32-bit DLLs for use in the 32-bit JRE.) For another, at least the unowinreg.dll resulting from --enable-build-unowinreg on Fedora 33 would have had a dependency on libgcc_s_dw2-1.dll that would generally not have been available in a target Windows environment. There appears to be no pure Java way to read the Windows registry, but instead of using a native code DLL for that, it appears to work just as well to call out to reg.exe and parse its output. This removes the --enable-build-unowinreg and --with-mingw-cross-compiler configuration options. (The sole use of the MinGW toolchain in LO was for building unowinreg.dll.) Change-Id: I3283ea38c884d3221a205e5ab6ec99a2691ef474 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/107140 Reviewed-by: Noel Grandin <noel.grandin@collabora.co.uk> Reviewed-by: Stephan Bergmann <sbergman@redhat.com> Tested-by: Jenkins
317 lines
12 KiB
C++
317 lines
12 KiB
C++
/* -*- 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/.
|
|
*/
|
|
|
|
#ifndef LO_CLANG_SHARED_PLUGINS
|
|
|
|
#include <algorithm>
|
|
#include <cassert>
|
|
#include <limits>
|
|
#include <set>
|
|
#include <string>
|
|
|
|
#include "clang/AST/Attr.h"
|
|
|
|
#include "plugin.hxx"
|
|
|
|
namespace {
|
|
|
|
bool isJniFunction(NamedDecl const * decl) {
|
|
auto const fdecl = dyn_cast<FunctionDecl>(decl);
|
|
if (fdecl == nullptr
|
|
|| !(decl->getDeclContext()->getDeclKind() == Decl::LinkageSpec
|
|
&& decl->getDeclContext()->getParent()->isTranslationUnit())
|
|
|| !fdecl->isExternC())
|
|
{
|
|
return false;
|
|
}
|
|
auto const id = decl->getIdentifier();
|
|
return id != nullptr && id->getName().startswith("Java_");
|
|
}
|
|
|
|
class ReservedId:
|
|
public loplugin::FilteringPlugin<ReservedId>
|
|
{
|
|
public:
|
|
explicit ReservedId(loplugin::InstantiationData const & data): FilteringPlugin(data)
|
|
{}
|
|
|
|
void run() override;
|
|
void postRun() override;
|
|
|
|
bool VisitNamedDecl(NamedDecl const * decl);
|
|
|
|
private:
|
|
enum class Kind {
|
|
Ok, DoubleUnderscore, UnderscoreUppercase, UnderscoreLowercase };
|
|
|
|
Kind determineKind(llvm::StringRef const & id);
|
|
|
|
bool isInLokIncludeFile(SourceLocation spellingLocation) const;
|
|
|
|
bool isApi(NamedDecl const * decl);
|
|
};
|
|
|
|
void ReservedId::run() {
|
|
//TODO: Rules for C?
|
|
if (TraverseDecl(compiler.getASTContext().getTranslationUnitDecl()))
|
|
postRun();
|
|
}
|
|
|
|
void ReservedId::postRun() {
|
|
if( compiler.hasPreprocessor())
|
|
{
|
|
auto & prep = compiler.getPreprocessor();
|
|
for (auto const & m: prep.macros(false)) {
|
|
auto id = m.first->getName();
|
|
if (determineKind(id) != Kind::Ok
|
|
&& id != "_ATL_APARTMENT_THREADED"
|
|
// extensions/source/activex/StdAfx2.h
|
|
&& id != "_ATL_STATIC_REGISTRY"
|
|
// extensions/source/activex/StdAfx2.h
|
|
&& id != "_GLIBCXX_CDTOR_CALLABI"
|
|
&& id != "_HAS_AUTO_PTR_ETC" // unotools/source/i18n/resmgr.cxx
|
|
&& id != "_LIBCPP_ENABLE_CXX17_REMOVED_AUTO_PTR" // unotools/source/i18n/resmgr.cxx
|
|
&& id != "_MAX_PATH" // Windows
|
|
&& id != "_POSIX_SOURCE"
|
|
&& id != "_USE_MATH_DEFINES" // include/sal/config.h, Windows
|
|
&& id != "_WIN32_DCOM" // embedserv/source/embed/esdll.cxx
|
|
&& id != "_WTL_NO_CSTRING"
|
|
// fpicker/source/win32/filepicker/platform_vista.h (TODO:
|
|
// needed?)
|
|
&& id != "__ASSERT_MACROS_DEFINE_VERSIONS_WITHOUT_UNDERSCORES"
|
|
&& id != "__Column_FWD_DEFINED__"
|
|
// connectivity/source/inc/ado/Awrapadox.hxx, MS SDK
|
|
// adoctint.h
|
|
&& id != "__Group_FWD_DEFINED__"
|
|
// connectivity/source/inc/ado/Awrapadox.hxx, MS SDK
|
|
// adoctint.h
|
|
&& id != "__Index_FWD_DEFINED__"
|
|
// connectivity/source/inc/ado/Awrapadox.hxx, MS SDK
|
|
// adoctint.h
|
|
&& id != "__Key_FWD_DEFINED__"
|
|
// connectivity/source/inc/ado/Awrapadox.hxx, MS SDK
|
|
// adoctint.h
|
|
&& id != "__ORCUS_STATIC_LIB"
|
|
&& id != "__Table_FWD_DEFINED__"
|
|
// connectivity/source/inc/ado/Awrapadox.hxx, MS SDK
|
|
// adoctint.h
|
|
&& id != "__USE_GNU"
|
|
&& id != "__User_FWD_DEFINED__")
|
|
// connectivity/source/inc/ado/Awrapadox.hxx, MS SDK
|
|
// adoctint.h
|
|
{
|
|
auto d = prep.getLocalMacroDirectiveHistory(m.first);
|
|
for (;;) {
|
|
if (d->getKind() == MacroDirective::MD_Define) {
|
|
auto loc = d->getLocation();
|
|
if (loc.isValid() && !ignoreLocation(loc)) {
|
|
auto file = getFilenameOfLocation(loc);
|
|
if (!loplugin::isSamePathname(
|
|
file,
|
|
SRCDIR
|
|
"/include/cppuhelper/implbase_ex_post.hxx")
|
|
&& !loplugin::isSamePathname(
|
|
file,
|
|
SRCDIR
|
|
"/include/cppuhelper/implbase_ex_pre.hxx"))
|
|
{
|
|
report(
|
|
DiagnosticsEngine::Warning,
|
|
"reserved macro identifier", loc);
|
|
}
|
|
}
|
|
}
|
|
d = d->getPrevious();
|
|
if (d == nullptr) {
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
bool ReservedId::VisitNamedDecl(NamedDecl const * decl) {
|
|
auto spelLoc = compiler.getSourceManager().getSpellingLoc(
|
|
decl->getLocation());
|
|
if (ignoreLocation(spelLoc)) {
|
|
return true;
|
|
}
|
|
auto filename = getFilenameOfLocation(spelLoc);
|
|
if (loplugin::hasPathnamePrefix(filename, SRCDIR "/bridges/source/cpp_uno/")
|
|
&& filename.endswith("share.hxx"))
|
|
{
|
|
return true;
|
|
}
|
|
auto const id = decl->getIdentifier();
|
|
if (id == nullptr) {
|
|
return true;
|
|
}
|
|
auto const s = id->getName();
|
|
switch (determineKind(s)) {
|
|
case Kind::Ok:
|
|
break;
|
|
case Kind::DoubleUnderscore:
|
|
/*TODO*/if(s=="BIFF__5"||s=="XML__COLON"||s=="XML__EMPTY"||s=="XML__UNKNOWN_")break;
|
|
if (!(isApi(decl) || isJniFunction(decl))
|
|
&& s != "__CERT_DecodeDERCertificate"
|
|
// xmlsecurity/source/xmlsec/nss/nssrenam.h
|
|
&& s != "__CERT_NewTempCertificate"
|
|
// xmlsecurity/source/xmlsec/nss/nssrenam.h
|
|
&& s != "__CTFont"
|
|
// vcl/source/window/cairo_cairo.cxx -> include/vcl/sysdata.hxx
|
|
&& s != "__CxxDetectRethrow"
|
|
// bridges/source/cpp_uno/msvc_win32_x86-64/mscx.hxx
|
|
&& s != "__GLXcontextRec" // vcl/unx/glxtest.cxx
|
|
&& s != "__GLXFBConfigRec" // vcl/unx/glxtest.cxx
|
|
&& s != "__PK11_GetKeyData"
|
|
// xmlsecurity/source/xmlsec/nss/nssrenam.h
|
|
&& s != "__current_exception" // bridges/inc/except.hxx, Windows
|
|
&& s != "__data_start") // sal/osl/unx/system.cxx
|
|
{
|
|
report(
|
|
DiagnosticsEngine::Warning,
|
|
"identifier %select{beginning with|containing}0 a double"
|
|
" underscore is reserved",
|
|
decl->getLocation())
|
|
<< compiler.getLangOpts().CPlusPlus << decl->getSourceRange();
|
|
}
|
|
break;
|
|
case Kind::UnderscoreUppercase:
|
|
if (!isApi(decl)
|
|
&& s != "_ADOColumn"
|
|
// connectivity/source/inc/ado/Awrapadox.hxx, MS SDK adoctint.h
|
|
&& s != "_ADOGroup"
|
|
// connectivity/source/inc/ado/Awrapadox.hxx, MS SDK adoctint.h
|
|
&& s != "_ADOIndex"
|
|
// connectivity/source/inc/ado/Awrapadox.hxx, MS SDK adoctint.h
|
|
&& s != "_ADOKey"
|
|
// connectivity/source/inc/ado/Awrapadox.hxx, MS SDK adoctint.h
|
|
&& s != "_ADOTable"
|
|
// connectivity/source/inc/ado/Awrapadox.hxx, MS SDK adoctint.h
|
|
&& s != "_ADOUser"
|
|
// connectivity/source/inc/ado/Awrapadox.hxx, MS SDK adoctint.h
|
|
&& s != "_FcPattern" // vcl/inc/unx/fc_fontoptions.hxx
|
|
&& s != "_GdkDisplay"
|
|
// vcl/unx/gtk/xid_fullscreen_on_all_monitors.c
|
|
&& s != "_GdkEvent" // vcl/unx/gtk/xid_fullscreen_on_all_monitors.c
|
|
&& s != "_GdkScreen" // vcl/unx/gtk/xid_fullscreen_on_all_monitors.c
|
|
&& s != "_GdkWindow"
|
|
// vcl/unx/gtk/xid_fullscreen_on_all_monitors.c
|
|
&& s != "_GstVideoOverlay"
|
|
// avmedia/source/gstreamer/gstplayer.hxx
|
|
&& s != "_Module" // extensions/source/activex/StdAfx2.h, CComModule
|
|
&& s != "_XRegion" // vcl/unx/generic/gdi/x11cairotextrender.cxx
|
|
&& s != "_XTrap") // vcl/unx/generic/gdi/xrender_peer.hxx
|
|
{
|
|
report(
|
|
DiagnosticsEngine::Warning,
|
|
"identifier beginning with an underscore followed by an"
|
|
" uppercase letter is reserved",
|
|
decl->getLocation())
|
|
<< decl->getSourceRange();
|
|
}
|
|
break;
|
|
case Kind::UnderscoreLowercase:
|
|
if (decl->getDeclContext()->isTranslationUnit()
|
|
&& !isa<ParmVarDecl>(decl) && !isApi(decl)
|
|
&& s != "_cairo" && s != "_cairo_surface"
|
|
// tools/source/ref/errinf.cxx -> include/vcl/window.hxx ->
|
|
// include/vcl/outdev.hxx -> include/vcl/cairo.hxx
|
|
&& s != "_cairo_font_options"
|
|
// vcl/source/window/accessibility.cxx -> vcl/inc/salinst.hxx
|
|
&& s != "_cairo_user_data_key"
|
|
// vcl/headless/svpbmp.cxx -> vcl/inc/headless/svpgdi.hxx
|
|
&& s != "_end" // sal/osl/unx/system.cxx
|
|
&& s != "_rtl_Locale"
|
|
// i18nlangtag/source/isolang/mslangid.cxx ->
|
|
// include/i18nlangtag/languagetag.hxx
|
|
&& s != "_uno_ExtEnvironment"
|
|
// cppu/source/threadpool/threadident.cxx ->
|
|
// threadpool/current.hxx
|
|
&& s != "_xmlTextWriter") // include/svl/poolitem.hxx
|
|
{
|
|
report(
|
|
DiagnosticsEngine::Warning,
|
|
"identifier beginning with an underscore followed by a"
|
|
" lowercase letter is reserved in the global namespace",
|
|
decl->getLocation())
|
|
<< decl->getSourceRange();
|
|
}
|
|
break;
|
|
}
|
|
return true;
|
|
}
|
|
|
|
ReservedId::Kind ReservedId::determineKind(llvm::StringRef const & id) {
|
|
if (compiler.getLangOpts().CPlusPlus
|
|
&& id.find("__") != llvm::StringRef::npos)
|
|
{
|
|
return Kind::DoubleUnderscore;
|
|
}
|
|
if (id.size() >= 2 && id[0] == '_') {
|
|
auto c = id[1];
|
|
if (c == '_') {
|
|
return Kind::DoubleUnderscore;
|
|
}
|
|
if (c >= 'A' && c <= 'Z') {
|
|
return Kind::UnderscoreUppercase;
|
|
}
|
|
if (c >= 'a' && c <= 'z') {
|
|
return Kind::UnderscoreLowercase;
|
|
}
|
|
}
|
|
return Kind::Ok;
|
|
}
|
|
|
|
bool ReservedId::isInLokIncludeFile(SourceLocation spellingLocation) const {
|
|
return loplugin::hasPathnamePrefix(
|
|
getFilenameOfLocation(spellingLocation),
|
|
SRCDIR "/include/LibreOfficeKit/");
|
|
}
|
|
|
|
bool ReservedId::isApi(NamedDecl const * decl) {
|
|
auto const fdecl = dyn_cast<FunctionDecl>(decl);
|
|
if (fdecl != nullptr) {
|
|
decl = fdecl->getCanonicalDecl();
|
|
} else {
|
|
auto const tdecl = dyn_cast<TagDecl>(decl);
|
|
if (tdecl != nullptr) {
|
|
decl = tdecl->getCanonicalDecl();
|
|
}
|
|
}
|
|
auto const loc = compiler.getSourceManager().getSpellingLoc(
|
|
decl->getLocation());
|
|
if (!(isInUnoIncludeFile(loc) || isInLokIncludeFile(loc))
|
|
|| isa<ParmVarDecl>(decl))
|
|
{
|
|
return false;
|
|
}
|
|
auto const ctx = decl->getDeclContext();
|
|
if (ctx->isTranslationUnit()
|
|
|| (ctx->getDeclKind() == Decl::LinkageSpec
|
|
&& ctx->getParent()->isTranslationUnit()))
|
|
{
|
|
return true;
|
|
}
|
|
if (ctx->isNamespace()) {
|
|
auto const id = dyn_cast<NamespaceDecl>(ctx)->getIdentifier();
|
|
return !(id == nullptr || id->getName() == "detail");
|
|
}
|
|
return false;
|
|
}
|
|
|
|
loplugin::Plugin::Registration<ReservedId> reservedid("reservedid");
|
|
|
|
}
|
|
|
|
#endif // LO_CLANG_SHARED_PLUGINS
|
|
|
|
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|