From d91d3536eb82075aec25f3772c4209e15b7b3060 Mon Sep 17 00:00:00 2001 From: Marc Mutz Date: Thu, 7 Jul 2016 10:57:03 +0200 Subject: Unbreak ubsan developer-build GCC's undefined-behavior sanitizer checks that the declared type of the object is a base class of the dynamic type of the object on each access to a member of a class type. It therefore requires the typeinfo for these types, which for polymorphic types is emitted in the TU where the vtable is emitted, too. QtPatternist::AtomicValue is a polymorphic non- exported class, so this failed at link-time. Ditto for the other cases. Fix by autotest-exporting the classes. Also, where applicable, de-inline the dtors, so the vtable (and typeinfo) are pinned to one TU. Change-Id: I5c47be779a3833433a7108a79a57d61a93ab5494 Reviewed-by: Thiago Macieira --- src/xmlpatterns/data/qitem_p.h | 3 +-- src/xmlpatterns/expr/qgeneralcomparison.cpp | 5 +++++ src/xmlpatterns/expr/qgeneralcomparison_p.h | 5 +++-- src/xmlpatterns/expr/qnamespaceconstructor.cpp | 5 +++++ src/xmlpatterns/expr/qnamespaceconstructor_p.h | 3 ++- src/xmlpatterns/expr/qpath.cpp | 5 +++++ src/xmlpatterns/expr/qpath_p.h | 3 ++- src/xmlpatterns/expr/qsinglecontainer.cpp | 5 +++++ src/xmlpatterns/expr/qsinglecontainer_p.h | 4 +++- src/xmlpatterns/expr/qtemplate.cpp | 5 +++++ src/xmlpatterns/expr/qtemplate_p.h | 4 ++-- src/xmlpatterns/expr/qvaluecomparison.cpp | 5 +++++ src/xmlpatterns/expr/qvaluecomparison_p.h | 5 +++-- src/xmlpatterns/expr/qvariablereference.cpp | 5 +++++ src/xmlpatterns/expr/qvariablereference_p.h | 3 ++- src/xmlpatterns/functions/qfunctionfactory_p.h | 2 +- src/xmlpatterns/type/qitemtype_p.h | 2 +- src/xmlpatterns/type/qsequencetype_p.h | 2 +- 18 files changed, 56 insertions(+), 15 deletions(-) diff --git a/src/xmlpatterns/data/qitem_p.h b/src/xmlpatterns/data/qitem_p.h index c89add1..c5a168d 100644 --- a/src/xmlpatterns/data/qitem_p.h +++ b/src/xmlpatterns/data/qitem_p.h @@ -105,8 +105,7 @@ namespace QPatternist * @ingroup Patternist_xdm * @author Frans Englich */ - class AtomicValue : public QSharedData - , public CppCastingHelper + class Q_AUTOTEST_EXPORT AtomicValue : public QSharedData, public CppCastingHelper { public: virtual ~AtomicValue(); diff --git a/src/xmlpatterns/expr/qgeneralcomparison.cpp b/src/xmlpatterns/expr/qgeneralcomparison.cpp index d11b130..1c2ca4c 100644 --- a/src/xmlpatterns/expr/qgeneralcomparison.cpp +++ b/src/xmlpatterns/expr/qgeneralcomparison.cpp @@ -56,6 +56,11 @@ GeneralComparison::GeneralComparison(const Expression::Ptr &op1, { } +/*! \internal */ +GeneralComparison::~GeneralComparison() +{ +} + bool GeneralComparison::generalCompare(const Item &op1, const Item &op2, const DynamicContext::Ptr &context) const diff --git a/src/xmlpatterns/expr/qgeneralcomparison_p.h b/src/xmlpatterns/expr/qgeneralcomparison_p.h index f4bbed3..6a66fa9 100644 --- a/src/xmlpatterns/expr/qgeneralcomparison_p.h +++ b/src/xmlpatterns/expr/qgeneralcomparison_p.h @@ -64,8 +64,8 @@ namespace QPatternist * @author Frans Englich * @ingroup Patternist_expressions */ - class GeneralComparison : public PairContainer, - public ComparisonPlatform { @@ -74,6 +74,7 @@ namespace QPatternist const AtomicComparator::Operator op, const Expression::Ptr &op2, const bool isBackwardsCompat = false); + ~GeneralComparison(); virtual bool evaluateEBV(const DynamicContext::Ptr &) const; virtual Expression::Ptr typeCheck(const StaticContext::Ptr &context, diff --git a/src/xmlpatterns/expr/qnamespaceconstructor.cpp b/src/xmlpatterns/expr/qnamespaceconstructor.cpp index b9ed98b..882f9c0 100644 --- a/src/xmlpatterns/expr/qnamespaceconstructor.cpp +++ b/src/xmlpatterns/expr/qnamespaceconstructor.cpp @@ -44,6 +44,11 @@ NamespaceConstructor::NamespaceConstructor(const QXmlName nb) : m_binding(nb) Q_ASSERT(!m_binding.isNull()); } +/*! \internal */ +NamespaceConstructor::~NamespaceConstructor() +{ +} + void NamespaceConstructor::evaluateToSequenceReceiver(const DynamicContext::Ptr &context) const { context->outputReceiver()->namespaceBinding(m_binding); diff --git a/src/xmlpatterns/expr/qnamespaceconstructor_p.h b/src/xmlpatterns/expr/qnamespaceconstructor_p.h index 1ac1b5d..6a025a1 100644 --- a/src/xmlpatterns/expr/qnamespaceconstructor_p.h +++ b/src/xmlpatterns/expr/qnamespaceconstructor_p.h @@ -57,10 +57,11 @@ namespace QPatternist * @author Frans Englich * @ingroup Patternist_expressions */ - class NamespaceConstructor : public EmptyContainer + class Q_AUTOTEST_EXPORT NamespaceConstructor : public EmptyContainer { public: NamespaceConstructor(const QXmlName nb); + ~NamespaceConstructor(); virtual void evaluateToSequenceReceiver(const DynamicContext::Ptr &context) const; diff --git a/src/xmlpatterns/expr/qpath.cpp b/src/xmlpatterns/expr/qpath.cpp index 4d1e42c..0128cf3 100644 --- a/src/xmlpatterns/expr/qpath.cpp +++ b/src/xmlpatterns/expr/qpath.cpp @@ -55,6 +55,11 @@ Path::Path(const Expression::Ptr &operand1, { } +/*! \internal */ +Path::~Path() +{ +} + Item::Iterator::Ptr Path::mapToSequence(const Item &item, const DynamicContext::Ptr &context) const { diff --git a/src/xmlpatterns/expr/qpath_p.h b/src/xmlpatterns/expr/qpath_p.h index 687fafb..51b5728 100644 --- a/src/xmlpatterns/expr/qpath_p.h +++ b/src/xmlpatterns/expr/qpath_p.h @@ -59,7 +59,7 @@ namespace QPatternist * @author Frans Englich * @ingroup Patternist_expressions */ - class Path : public PairContainer + class Q_AUTOTEST_EXPORT Path : public PairContainer { public: enum Kind @@ -88,6 +88,7 @@ namespace QPatternist Path(const Expression::Ptr &operand1, const Expression::Ptr &operand2, const Kind kind = RegularPath); + ~Path(); virtual Item::Iterator::Ptr evaluateSequence(const DynamicContext::Ptr &context) const; virtual Item evaluateSingleton(const DynamicContext::Ptr &context) const; diff --git a/src/xmlpatterns/expr/qsinglecontainer.cpp b/src/xmlpatterns/expr/qsinglecontainer.cpp index c973313..bf544ab 100644 --- a/src/xmlpatterns/expr/qsinglecontainer.cpp +++ b/src/xmlpatterns/expr/qsinglecontainer.cpp @@ -45,6 +45,11 @@ SingleContainer::SingleContainer(const Expression::Ptr &operand) : m_operand(ope Q_ASSERT(operand); } +/*! \internal */ +SingleContainer::~SingleContainer() +{ +} + Expression::List SingleContainer::operands() const { Expression::List list; diff --git a/src/xmlpatterns/expr/qsinglecontainer_p.h b/src/xmlpatterns/expr/qsinglecontainer_p.h index baf061c..3dbfb80 100644 --- a/src/xmlpatterns/expr/qsinglecontainer_p.h +++ b/src/xmlpatterns/expr/qsinglecontainer_p.h @@ -56,9 +56,11 @@ namespace QPatternist * @author Frans Englich * @ingroup Patternist_expressions */ - class SingleContainer : public Expression + class Q_AUTOTEST_EXPORT SingleContainer : public Expression { public: + ~SingleContainer(); + virtual Expression::List operands() const; virtual void setOperands(const Expression::List &operands); diff --git a/src/xmlpatterns/expr/qtemplate.cpp b/src/xmlpatterns/expr/qtemplate.cpp index a5cd165..3d5d948 100644 --- a/src/xmlpatterns/expr/qtemplate.cpp +++ b/src/xmlpatterns/expr/qtemplate.cpp @@ -40,6 +40,11 @@ QT_BEGIN_NAMESPACE using namespace QPatternist; +/*! \internal */ +Template::~Template() +{ +} + const SourceLocationReflection* Template::actualReflection() const { return this; diff --git a/src/xmlpatterns/expr/qtemplate_p.h b/src/xmlpatterns/expr/qtemplate_p.h index 2cc0eba..84669a8 100644 --- a/src/xmlpatterns/expr/qtemplate_p.h +++ b/src/xmlpatterns/expr/qtemplate_p.h @@ -72,8 +72,7 @@ namespace QPatternist * @ingroup Patternist_expressions * @since 4.5 */ - class Template : public QSharedData - , public SourceLocationReflection + class Q_AUTOTEST_EXPORT Template : public QSharedData, public SourceLocationReflection { public: @@ -85,6 +84,7 @@ namespace QPatternist , m_reqType(reqType) { } + ~Template(); Expression::Ptr body; diff --git a/src/xmlpatterns/expr/qvaluecomparison.cpp b/src/xmlpatterns/expr/qvaluecomparison.cpp index 09ecfef..1726666 100644 --- a/src/xmlpatterns/expr/qvaluecomparison.cpp +++ b/src/xmlpatterns/expr/qvaluecomparison.cpp @@ -51,6 +51,11 @@ ValueComparison::ValueComparison(const Expression::Ptr &op1, { } +/*! \internal */ +ValueComparison::~ValueComparison() +{ +} + Item ValueComparison::evaluateSingleton(const DynamicContext::Ptr &context) const { const Item it1(m_operand1->evaluateSingleton(context)); diff --git a/src/xmlpatterns/expr/qvaluecomparison_p.h b/src/xmlpatterns/expr/qvaluecomparison_p.h index c65c74a..37dd3a7 100644 --- a/src/xmlpatterns/expr/qvaluecomparison_p.h +++ b/src/xmlpatterns/expr/qvaluecomparison_p.h @@ -64,13 +64,14 @@ namespace QPatternist * @author Frans Englich * @ingroup Patternist_expressions */ - class ValueComparison : public PairContainer, - public ComparisonPlatform + class Q_AUTOTEST_EXPORT ValueComparison + : public PairContainer, public ComparisonPlatform { public: ValueComparison(const Expression::Ptr &op1, const AtomicComparator::Operator op, const Expression::Ptr &op2); + ~ValueComparison(); virtual Item evaluateSingleton(const DynamicContext::Ptr &) const; diff --git a/src/xmlpatterns/expr/qvariablereference.cpp b/src/xmlpatterns/expr/qvariablereference.cpp index ed5ba36..e2c5548 100644 --- a/src/xmlpatterns/expr/qvariablereference.cpp +++ b/src/xmlpatterns/expr/qvariablereference.cpp @@ -42,6 +42,11 @@ VariableReference::VariableReference(const VariableSlotID slotP) : m_varSlot(slo Q_ASSERT(m_varSlot > -1); } +/*! \internal */ +VariableReference::~VariableReference() +{ +} + Expression::Properties VariableReference::properties() const { return DisableElimination; diff --git a/src/xmlpatterns/expr/qvariablereference_p.h b/src/xmlpatterns/expr/qvariablereference_p.h index d8676a6..1ca6ade 100644 --- a/src/xmlpatterns/expr/qvariablereference_p.h +++ b/src/xmlpatterns/expr/qvariablereference_p.h @@ -58,7 +58,7 @@ namespace QPatternist * @author Frans Englich * @ingroup Patternist_expressions */ - class VariableReference : public EmptyContainer + class Q_AUTOTEST_EXPORT VariableReference : public EmptyContainer { public: typedef QExplicitlySharedDataPointer Ptr; @@ -70,6 +70,7 @@ namespace QPatternist * @param slot must be a valid slot. That is, zero or larger. */ VariableReference(const VariableSlotID slot); + ~VariableReference(); /** * @returns the slot that this reference communicates through. diff --git a/src/xmlpatterns/functions/qfunctionfactory_p.h b/src/xmlpatterns/functions/qfunctionfactory_p.h index 187edad..5759ac0 100644 --- a/src/xmlpatterns/functions/qfunctionfactory_p.h +++ b/src/xmlpatterns/functions/qfunctionfactory_p.h @@ -68,7 +68,7 @@ namespace QPatternist * Language (XPath) 2.0, Definition: Function signatures * @author Frans Englich */ - class FunctionFactory : public QSharedData + class Q_AUTOTEST_EXPORT FunctionFactory : public QSharedData { public: diff --git a/src/xmlpatterns/type/qitemtype_p.h b/src/xmlpatterns/type/qitemtype_p.h index bea6bc2..7cfad06 100644 --- a/src/xmlpatterns/type/qitemtype_p.h +++ b/src/xmlpatterns/type/qitemtype_p.h @@ -69,7 +69,7 @@ namespace QPatternist * @ingroup Patternist_types * @author Frans Englich */ - class ItemType : public virtual QSharedData + class Q_AUTOTEST_EXPORT ItemType : public virtual QSharedData { public: /** diff --git a/src/xmlpatterns/type/qsequencetype_p.h b/src/xmlpatterns/type/qsequencetype_p.h index 0828d58..870972a 100644 --- a/src/xmlpatterns/type/qsequencetype_p.h +++ b/src/xmlpatterns/type/qsequencetype_p.h @@ -69,7 +69,7 @@ namespace QPatternist * @see XML * Path Language (XPath) 2.0, 2.5.3 SequenceType Syntax */ - class SequenceType : public virtual QSharedData + class Q_AUTOTEST_EXPORT SequenceType : public virtual QSharedData { public: inline SequenceType() -- cgit v1.2.1