http://gcc.gnu.org/bugzilla/show_bug.cgi?id=60546

--- Comment #22 from linzj <manjian2006 at gmail dot com> ---
(In reply to Jakub Jelinek from comment #21)
> What is not satisfying?
> 
> struct QualifiedNameComponents {
>     StringImpl* m_prefix;
>     StringImpl* m_localName;
>     StringImpl* m_namespace;
> };
> ...
>     template<typename T, UChar Converter(T)> static inline unsigned
> computeHash(const T* data, unsigned length)
>     {
>         StringHasher hasher;
>         bool rem = length & 1;
>         length >>= 1;
>         while (length--) {
>             hasher.addCharacters(Converter(data[0]), Converter(data[1]));
>             data += 2;
>         }
>         if (rem)
>             hasher.addCharacter(Converter(*data));
>         return hasher.hash();
>     }
> ...
>     template<size_t length> static inline unsigned hashMemory(const void*
> data)
>     {
>         typedef int dummylength_must_be_a_multible_of_four [(!(length % 4))
> ? 1 : -1];
>         return computeHash<UChar>(static_cast<const UChar*>(data), length /
> sizeof(UChar));
>     }
> ...
> inline unsigned hashComponents(const QualifiedNameComponents& buf)
> {
>     return StringHasher::hashMemory<sizeof(QualifiedNameComponents)>(&buf);
> }
> struct QualifiedNameHash {
>     static unsigned hash(const QualifiedName& name) { return
> hash(name.impl()); }
>     static unsigned hash(const QualifiedName::QualifiedNameImpl* name)
>     {
>         QualifiedNameComponents c = { name->m_prefix.impl(),
> name->m_localName.impl(), name->m_namespace.impl() };
>         return hashComponents(c);
>     }
>     static bool equal(const QualifiedName& a, const QualifiedName& b) {
> return a == b; }
>     static bool equal(const QualifiedName::QualifiedNameImpl* a, const
> QualifiedName::QualifiedNameImpl* b) { return a == b; }
>     static const bool safeToCompareToEmptyOrDeleted = false;
> };
> 
> is a clear aliasing violation and thus undefined behavior when called.
> The `c' object has object type QualifiedNameComponents, whose subobjects
> have type pointer to StringImpl.  In computeHash you are then reading the
> object using the UChar (unsigned short) effective type, only char or
> unsigned char types can be used for that, see e.g. [basic.types]/2, or read
> -fstrict-aliasing documentation in info gcc.
> For g++, you could read the object through say typedef UChar UCharMayAlias
> __attribute__((__may_alias__));, or you can say std::memcpy the object into
> an correspondigly sized array of UChar and hash that rather than the
> original object, etc.
Thank you for your reply.It helps me a lot.
I have found a virtual register "table_26" coming from hell,no one generates
this register but use as the base of the m_table.Tree representation must have
damages because that violation.

Reply via email to