[libcxxabi] r236299 - Disallow conversions from function pointers to void*.
Eric Fiselier
eric at efcs.ca
Thu Apr 30 18:49:37 PDT 2015
Author: ericwf
Date: Thu Apr 30 20:49:37 2015
New Revision: 236299
URL: http://llvm.org/viewvc/llvm-project?rev=236299&view=rev
Log:
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
Modified:
libcxxabi/trunk/src/private_typeinfo.cpp
libcxxabi/trunk/test/catch_function_01.pass.cpp
Modified: libcxxabi/trunk/src/private_typeinfo.cpp
URL: http://llvm.org/viewvc/llvm-project/libcxxabi/trunk/src/private_typeinfo.cpp?rev=236299&r1=236298&r2=236299&view=diff
==============================================================================
--- libcxxabi/trunk/src/private_typeinfo.cpp (original)
+++ libcxxabi/trunk/src/private_typeinfo.cpp Thu Apr 30 20:49:37 2015
@@ -387,9 +387,13 @@ __pointer_type_info::can_catch(const __s
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);
Modified: libcxxabi/trunk/test/catch_function_01.pass.cpp
URL: http://llvm.org/viewvc/llvm-project/libcxxabi/trunk/test/catch_function_01.pass.cpp?rev=236299&r1=236298&r2=236299&view=diff
==============================================================================
--- libcxxabi/trunk/test/catch_function_01.pass.cpp (original)
+++ libcxxabi/trunk/test/catch_function_01.pass.cpp Thu Apr 30 20:49:37 2015
@@ -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);
}
}
More information about the cfe-commits
mailing list