diff options
author | Filipe Cabecinhas <me@filcab.net> | 2016-02-27 19:57:44 +0000 |
---|---|---|
committer | Filipe Cabecinhas <me@filcab.net> | 2016-02-27 19:57:44 +0000 |
commit | b7692bc3e9ad2691fc07261904b88fb15f30696b (patch) | |
tree | 9d736b0af062008f795da5b1a86adb5ba3012082 /llvm/lib/CodeGen/MachineScheduler.cpp | |
parent | d3a746722145571d94123b9886deee7922e7083c (diff) | |
download | bcm5719-llvm-b7692bc3e9ad2691fc07261904b88fb15f30696b.tar.gz bcm5719-llvm-b7692bc3e9ad2691fc07261904b88fb15f30696b.zip |
[UBSan] Fix isDerivedFromAtOffset on iOS ARM64
Summary:
iOS on ARM64 doesn't unique RTTI.
Ref: clang's iOS64CXXABI::shouldRTTIBeUnique()
Due to this, pointer-equality will not necessarily work in this
architecture, across dylib boundaries.
dynamic_cast<>() will (as expected) still work, since Apple ships with
one prepared for this, but we can't rely on the type names being
pointer-equal.
I've limited the expensive strcmp check to the specific architecture
which needs it.
Example which triggers this bug:
lib.h:
struct X {
virtual ~X() {}
};
X *libCall();
lib.mm:
X *libCall() {
return new X;
}
prog.mm:
int main() {
X *px = libCall();
delete px;
}
Expected output: Nothing
Actual output:
<unknown>: runtime error: member call on address 0x00017001ef50 which does not point to an object of type 'X'
0x00017001ef50: note: object is of type 'X'
00 00 00 00 60 00 0f 00 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
^~~~~~~~~~~~~~~~~~~~~~~
vptr for ‘X’
Reviewers: kubabrecka, samsonov, eugenis, rsmith
Subscribers: aemerson, llvm-commits, rengolin
Differential Revision: http://reviews.llvm.org/D11502
llvm-svn: 262147
Diffstat (limited to 'llvm/lib/CodeGen/MachineScheduler.cpp')
0 files changed, 0 insertions, 0 deletions