diff options
-rw-r--r-- | compilerplugins/clang/badstatics.cxx | 59 | ||||
-rw-r--r-- | vcl/source/filter/wmf/winmtf.cxx | 5 | ||||
-rw-r--r-- | vcl/source/filter/wmf/winmtf.hxx | 1 |
3 files changed, 55 insertions, 10 deletions
diff --git a/compilerplugins/clang/badstatics.cxx b/compilerplugins/clang/badstatics.cxx index 136e1db90d20..c41b12d560b4 100644 --- a/compilerplugins/clang/badstatics.cxx +++ b/compilerplugins/clang/badstatics.cxx @@ -25,23 +25,68 @@ public: } } + /*static*/ std::pair<bool, FieldDecl const*> isBadStaticType( + QualType const& rType, FieldDecl const*const pCurrentFieldDecl) + { + QualType const pCanonical(rType.getUnqualifiedType().getCanonicalType()); + RecordType const*const pRecordType(pCanonical->getAs<RecordType>()); + if (!pRecordType) { + return std::make_pair(false, nullptr); + } + auto const type(pCanonical.getAsString()); + if ( type == "class Image" + || type == "class Bitmap" + || type == "class BitmapEx" + ) + { + return std::make_pair(true, pCurrentFieldDecl); + } + RecordDecl const*const pDefinition(pRecordType->getDecl()->getDefinition()); + assert(pDefinition); + CXXRecordDecl const*const pDecl(dyn_cast<CXXRecordDecl>(pDefinition)); + assert(pDecl); + for (auto it = pDecl->field_begin(); it != pDecl->field_end(); ++it) { + auto const ret(isBadStaticType((*it)->getType(), *it)); + if (ret.first) { + return ret; + } + } + for (auto it = pDecl->bases_begin(); it != pDecl->bases_end(); ++it) { + auto const ret(isBadStaticType((*it).getType(), pCurrentFieldDecl)); + if (ret.first) { + return ret; + } + } + for (auto it = pDecl->vbases_begin(); it != pDecl->vbases_end(); ++it) { + auto const ret(isBadStaticType((*it).getType(), pCurrentFieldDecl)); + if (ret.first) { + return ret; + } + } + return std::make_pair(false, nullptr); + } + bool VisitVarDecl(VarDecl const*const pVarDecl) { if (ignoreLocation(pVarDecl)) { return true; } - if (pVarDecl->hasGlobalStorage()) { - auto const type(pVarDecl->getType().getUnqualifiedType().getCanonicalType().getAsString()); - if ( type == "class Image" - || type == "class Bitmap" - || type == "class BitmapEx" - ) - { + if (pVarDecl->hasGlobalStorage() + && pVarDecl->isThisDeclarationADefinition()) + { + auto const ret(isBadStaticType(pVarDecl->getType(), nullptr)); + if (ret.first) { report(DiagnosticsEngine::Warning, "bad static variable causes crash on shutdown", pVarDecl->getLocation()) << pVarDecl->getSourceRange(); + if (ret.second != nullptr) { + report(DiagnosticsEngine::Remark, + "... due to this member", + ret.second->getLocation()) + << ret.second->getSourceRange(); + } } } diff --git a/vcl/source/filter/wmf/winmtf.cxx b/vcl/source/filter/wmf/winmtf.cxx index c9f87508dd59..93c6b1a444f6 100644 --- a/vcl/source/filter/wmf/winmtf.cxx +++ b/vcl/source/filter/wmf/winmtf.cxx @@ -944,12 +944,11 @@ sal_uInt32 WinMtfOutput::SetRasterOp( sal_uInt32 nRasterOp ) if ( nRasterOp != mnRop ) { mnRop = nRasterOp; - static WinMtfFillStyle aNopFillStyle; static WinMtfLineStyle aNopLineStyle; if ( mbNopMode && ( nRasterOp != R2_NOP ) ) { // changing modes from R2_NOP so set pen and brush - maFillStyle = aNopFillStyle; + maFillStyle = m_NopFillStyle; maLineStyle = aNopLineStyle; mbNopMode = false; } @@ -968,7 +967,7 @@ sal_uInt32 WinMtfOutput::SetRasterOp( sal_uInt32 nRasterOp ) meRasterOp = ROP_OVERPAINT; if( !mbNopMode ) { - aNopFillStyle = maFillStyle; + m_NopFillStyle = maFillStyle; aNopLineStyle = maLineStyle; maFillStyle = WinMtfFillStyle( Color( COL_TRANSPARENT ), true ); maLineStyle = WinMtfLineStyle( Color( COL_TRANSPARENT ), true ); diff --git a/vcl/source/filter/wmf/winmtf.hxx b/vcl/source/filter/wmf/winmtf.hxx index 01269700e0bc..bb1bbf2a4ccf 100644 --- a/vcl/source/filter/wmf/winmtf.hxx +++ b/vcl/source/filter/wmf/winmtf.hxx @@ -545,6 +545,7 @@ class WinMtfOutput WinMtfLineStyle maLineStyle; WinMtfFillStyle maLatestFillStyle; WinMtfFillStyle maFillStyle; + WinMtfFillStyle m_NopFillStyle; vcl::Font maLatestFont; vcl::Font maFont; sal_uInt32 mnLatestTextAlign; |