diff options
author | Tom Stellard <thomas.stellard@amd.com> | 2015-05-08 15:37:37 +0000 |
---|---|---|
committer | Tom Stellard <thomas.stellard@amd.com> | 2015-05-08 15:37:37 +0000 |
commit | adf9c878d57c89b6bb50b7da8bdf3dfbc979b025 (patch) | |
tree | 5e9baf172067ce3fc26d97bcd994aa57a9ce2316 | |
parent | de42153eb2007a09c2a068a52a81e5b647b2954d (diff) | |
download | llvm-adf9c878d57c89b6bb50b7da8bdf3dfbc979b025.zip llvm-adf9c878d57c89b6bb50b7da8bdf3dfbc979b025.tar.gz llvm-adf9c878d57c89b6bb50b7da8bdf3dfbc979b025.tar.bz2 |
Merging r236299:
------------------------------------------------------------------------
r236299 | ericwf | 2015-04-30 18:49:37 -0700 (Thu, 30 Apr 2015) | 7 lines
Disallow conversions from function pointers to void*.
Function pointers and member function pointers cannot be converted to void*.
libc++abi incorrectly allows this conversion for function pointers.
Review URL: http://reviews.llvm.org/D8811
------------------------------------------------------------------------
llvm-svn: 236868
-rw-r--r-- | libcxxabi/src/private_typeinfo.cpp | 10 | ||||
-rw-r--r-- | libcxxabi/test/catch_function_01.cpp | 16 |
2 files changed, 23 insertions, 3 deletions
diff --git a/libcxxabi/src/private_typeinfo.cpp b/libcxxabi/src/private_typeinfo.cpp index 576d3bf..f0ad291 100644 --- a/libcxxabi/src/private_typeinfo.cpp +++ b/libcxxabi/src/private_typeinfo.cpp @@ -381,9 +381,13 @@ __pointer_type_info::can_catch(const __shim_type_info* thrown_type, if (is_equal(__pointee, thrown_pointer_type->__pointee, false)) return true; // bullet 3A - if (is_equal(__pointee, &typeid(void), false)) - return true; - + if (is_equal(__pointee, &typeid(void), false)) { + // pointers to functions cannot be converted to void*. + // pointers to member functions are not handled here. + const __function_type_info* thrown_function = + dynamic_cast<const __function_type_info*>(thrown_pointer_type->__pointee); + return (thrown_function == nullptr); + } // Handle pointer to pointer const __pointer_type_info* nested_pointer_type = dynamic_cast<const __pointer_type_info*>(__pointee); diff --git a/libcxxabi/test/catch_function_01.cpp b/libcxxabi/test/catch_function_01.cpp index 33999f2..087fce4 100644 --- a/libcxxabi/test/catch_function_01.cpp +++ b/libcxxabi/test/catch_function_01.cpp @@ -11,11 +11,19 @@ #include <cassert> +template <class Tp> +bool can_convert(Tp) { return true; } + +template <class> +bool can_convert(...) { return false; } + void f() {} int main() { typedef void Function(); + assert(!can_convert<Function&>(&f)); + assert(!can_convert<void*>(&f)); try { throw f; // converts to void (*)() @@ -25,7 +33,15 @@ int main() { assert(false); } + catch (void*) // can't catch as void* + { + assert(false); + } + catch(Function*) + { + } catch (...) { + assert(false); } } |