On Monday, 20 July 2020 08:40:06 PDT Oswald Buddenhagen wrote:
> anyway, this can be trivially bypassed by just using an arbitrary
> address and subtracting the offset. or using offsetof, indeed. in any
> case it's 3 minutes of work. 

Sorry, an arbitrary address won't work either because it's still a 
dereference.

Suppose:

    const auto dummy = static_cast<Object *>(0x4000);
    const auto member = &dummy->member;
    qptrdiff offset = quintptr(member) - quintptr(dummy)
    return static_cast<Object *>(quintptr(this) - offset);

The problem is that the first line is creating a pointer to a memory location 
that does not have a valid Object object. So when the second line does 
        dummy->member
this expression is UB. It doesn't matter that the compiler usually implements 
the full expression &dummy->member as arithmetic on the pointers without 
dereferencing them; from the language's point of view, a dereference did 
happen and therefore it's UB. This is no different than:
        Object *ptr = nullptr;
        ptr->staticFunction();
See commit 88cf9402e336fddeb673c92f3c14da47a9f8450b[1].

Also note how both ASan and UBSan are likely to complain. Whatever our 
implementation is, it must pass both sanitisers.

[1] https://code.qt.io/cgit/qt/qtbase.git/commit/?
id=88cf9402e336fddeb673c92f3c14da47a9f8450b
-- 
Thiago Macieira - thiago.macieira (AT) intel.com
  Software Architect - Intel DPG Cloud Engineering



_______________________________________________
Development mailing list
Development@qt-project.org
https://lists.qt-project.org/listinfo/development

Reply via email to