[compiler-rt] r262147 - [UBSan] Fix isDerivedFromAtOffset on iOS ARM64

Alexey Samsonov via llvm-commits llvm-commits at lists.llvm.org
Mon Feb 29 10:49:38 PST 2016


Hi Filipe,

Thanks for resurrecting and landing this!

On Sat, Feb 27, 2016 at 11:57 AM, Filipe Cabecinhas via llvm-commits <
llvm-commits at lists.llvm.org> wrote:

> Author: filcab
> Date: Sat Feb 27 13:57:44 2016
> New Revision: 262147
>
> URL: http://llvm.org/viewvc/llvm-project?rev=262147&view=rev
> Log:
> [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
>
> Added:
>     compiler-rt/trunk/test/ubsan/TestCases/TypeCheck/Helpers/
>     compiler-rt/trunk/test/ubsan/TestCases/TypeCheck/Helpers/lit.local.cfg
>
> compiler-rt/trunk/test/ubsan/TestCases/TypeCheck/Helpers/vptr-non-unique-typeinfo-lib.cpp
>
> compiler-rt/trunk/test/ubsan/TestCases/TypeCheck/Helpers/vptr-non-unique-typeinfo-lib.h
>
> compiler-rt/trunk/test/ubsan/TestCases/TypeCheck/vptr-non-unique-typeinfo.cpp
> Modified:
>     compiler-rt/trunk/lib/sanitizer_common/sanitizer_platform.h
>     compiler-rt/trunk/lib/ubsan/ubsan_type_hash_itanium.cc
>
> Modified: compiler-rt/trunk/lib/sanitizer_common/sanitizer_platform.h
> URL:
> http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/sanitizer_common/sanitizer_platform.h?rev=262147&r1=262146&r2=262147&view=diff
>
> ==============================================================================
> --- compiler-rt/trunk/lib/sanitizer_common/sanitizer_platform.h (original)
> +++ compiler-rt/trunk/lib/sanitizer_common/sanitizer_platform.h Sat Feb 27
> 13:57:44 2016
> @@ -162,4 +162,10 @@
>  # define MSC_PREREQ(version) 0
>  #endif
>
> +#if defined(__arm64__) && SANITIZER_IOS
> +# define SANITIZER_NON_UNIQUE_TYPEINFO 1
> +#else
> +# define SANITIZER_NON_UNIQUE_TYPEINFO 0
> +#endif
> +
>  #endif // SANITIZER_PLATFORM_H
>
> Modified: compiler-rt/trunk/lib/ubsan/ubsan_type_hash_itanium.cc
> URL:
> http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/ubsan/ubsan_type_hash_itanium.cc?rev=262147&r1=262146&r2=262147&view=diff
>
> ==============================================================================
> --- compiler-rt/trunk/lib/ubsan/ubsan_type_hash_itanium.cc (original)
> +++ compiler-rt/trunk/lib/ubsan/ubsan_type_hash_itanium.cc Sat Feb 27
> 13:57:44 2016
> @@ -115,7 +115,9 @@ static __ubsan::HashValue *getTypeCacheH
>  static bool isDerivedFromAtOffset(const abi::__class_type_info *Derived,
>                                    const abi::__class_type_info *Base,
>                                    sptr Offset) {
> -  if (Derived->__type_name == Base->__type_name)
> +  if (Derived->__type_name == Base->__type_name ||
> +      (SANITIZER_NON_UNIQUE_TYPEINFO &&
> +       !internal_strcmp(Derived->__type_name, Base->__type_name)))
>      return Offset == 0;
>
>    if (const abi::__si_class_type_info *SI =
>
> Added:
> compiler-rt/trunk/test/ubsan/TestCases/TypeCheck/Helpers/lit.local.cfg
> URL:
> http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/test/ubsan/TestCases/TypeCheck/Helpers/lit.local.cfg?rev=262147&view=auto
>
> ==============================================================================
> --- compiler-rt/trunk/test/ubsan/TestCases/TypeCheck/Helpers/lit.local.cfg
> (added)
> +++ compiler-rt/trunk/test/ubsan/TestCases/TypeCheck/Helpers/lit.local.cfg
> Sat Feb 27 13:57:44 2016
> @@ -0,0 +1,3 @@
> +# Sources in this directory are helper files for tests which test
> functionality
> +# involving multiple translation units.
> +config.suffixes = []
>
> Added:
> compiler-rt/trunk/test/ubsan/TestCases/TypeCheck/Helpers/vptr-non-unique-typeinfo-lib.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/test/ubsan/TestCases/TypeCheck/Helpers/vptr-non-unique-typeinfo-lib.cpp?rev=262147&view=auto
>
> ==============================================================================
> ---
> compiler-rt/trunk/test/ubsan/TestCases/TypeCheck/Helpers/vptr-non-unique-typeinfo-lib.cpp
> (added)
> +++
> compiler-rt/trunk/test/ubsan/TestCases/TypeCheck/Helpers/vptr-non-unique-typeinfo-lib.cpp
> Sat Feb 27 13:57:44 2016
> @@ -0,0 +1,5 @@
> +#include "vptr-non-unique-typeinfo-lib.h"
> +
> +X *libCall() {
> +  return new X;
> +}
>
> Added:
> compiler-rt/trunk/test/ubsan/TestCases/TypeCheck/Helpers/vptr-non-unique-typeinfo-lib.h
> URL:
> http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/test/ubsan/TestCases/TypeCheck/Helpers/vptr-non-unique-typeinfo-lib.h?rev=262147&view=auto
>
> ==============================================================================
> ---
> compiler-rt/trunk/test/ubsan/TestCases/TypeCheck/Helpers/vptr-non-unique-typeinfo-lib.h
> (added)
> +++
> compiler-rt/trunk/test/ubsan/TestCases/TypeCheck/Helpers/vptr-non-unique-typeinfo-lib.h
> Sat Feb 27 13:57:44 2016
> @@ -0,0 +1,4 @@
> +struct X {
> +  virtual ~X() {}
> +};
> +X *libCall();
>
> Added:
> compiler-rt/trunk/test/ubsan/TestCases/TypeCheck/vptr-non-unique-typeinfo.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/test/ubsan/TestCases/TypeCheck/vptr-non-unique-typeinfo.cpp?rev=262147&view=auto
>
> ==============================================================================
> ---
> compiler-rt/trunk/test/ubsan/TestCases/TypeCheck/vptr-non-unique-typeinfo.cpp
> (added)
> +++
> compiler-rt/trunk/test/ubsan/TestCases/TypeCheck/vptr-non-unique-typeinfo.cpp
> Sat Feb 27 13:57:44 2016
> @@ -0,0 +1,10 @@
> +// RUN: %clangxx -frtti -fsanitize=vptr -fno-sanitize-recover=vptr
> -I%p/Helpers %p/Helpers/vptr-non-unique-typeinfo-lib.cpp -fPIC -shared -o
> %t-lib.so
> +// RUN: %clangxx -frtti -fsanitize=vptr -fno-sanitize-recover=vptr
> -I%p/Helpers -g %s -O3 -o %t %t-lib.so
> +// RUN: %run %t
> +
> +#include "vptr-non-unique-typeinfo-lib.h"
> +
> +int main() {
> +  X *px = libCall();
> +  delete px;
> +}
>
>
^^
Can you get rid of the Helpers/ directory, and make the test more
self-contained by using a single source file for that?
E.g. see how we're doing it in test/msan/dso-origin.cc




>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
>



-- 
Alexey Samsonov
vonosmas at gmail.com
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20160229/270d483a/attachment.html>


More information about the llvm-commits mailing list