Fixed UBsan warning "call to function through pointer to incorrect function type"
authorkhizmax <khizmax@gmail.com>
Mon, 6 Mar 2017 12:18:42 +0000 (15:18 +0300)
committerkhizmax <khizmax@gmail.com>
Mon, 6 Mar 2017 12:18:42 +0000 (15:18 +0300)
cds/details/static_functor.h
cds/gc/details/retired_ptr.h
cds/gc/dhp.h
cds/gc/hp.h
cds/intrusive/impl/ellen_bintree.h
cds/intrusive/impl/skip_list.h
cds/urcu/general_buffered.h
cds/urcu/general_instant.h
cds/urcu/general_threaded.h
cds/urcu/signal_buffered.h
cds/urcu/signal_threaded.h

index 2df6419..52986bc 100644 (file)
@@ -37,9 +37,9 @@ namespace cds { namespace details {
     template <class Functor, typename T>
     struct static_functor
     {
-        static void call( * p )
+        static void call( void* p )
         {
-            Functor()( );
+            Functor()( reinterpret_cast<T*>( p ));
         }
     };
 
index 85cfce6..8f5ee4b 100644 (file)
@@ -75,11 +75,18 @@ namespace cds { namespace gc {
             {}
 
             /// Typecasting ctor
+            template <typename T>
+            retired_ptr( T* p, free_retired_ptr_func func) CDS_NOEXCEPT
+                : m_p( reinterpret_cast<pointer>(p))
+                , m_funcFree( func )
+            {}
+/*
             template <typename T>
             retired_ptr( T * p, void (* pFreeFunc)(T *)) CDS_NOEXCEPT
                 : m_p( reinterpret_cast<pointer>(p))
                 , m_funcFree( reinterpret_cast< free_retired_ptr_func >( pFreeFunc ))
             {}
+*/
 
             /// Assignment operator
             retired_ptr& operator =( retired_ptr const& s) CDS_NOEXCEPT
@@ -90,7 +97,7 @@ namespace cds { namespace gc {
             }
 
             /// Invokes destructor function for the pointer
-            void free() CDS_SUPPRESS_SANITIZE( "function" )
+            void free()
             {
                 assert( m_funcFree );
                 assert( m_p );
index 755e051..23d876b 100644 (file)
@@ -1381,7 +1381,7 @@ namespace cds { namespace gc {
             \p func is a disposer: when \p p can be safely removed, \p func is called.
         */
         template <typename T>
-        static void retire( T * p, void (* func)(T *))
+        static void retire( T * p, void (* func)(void *))
         {
             dhp::thread_data* rec = dhp::smr::tls();
             if ( !rec->retired_.push( dhp::retired_ptr( p, func ) ) )
@@ -1438,7 +1438,7 @@ namespace cds { namespace gc {
             \endcode
         */
         template <class Disposer, typename T>
-        static void retire( T * p )
+        static void retire( T* p )
         {
             if ( !dhp::smr::tls()->retired_.push( dhp::retired_ptr( p, cds::details::static_functor<Disposer, T>::call )))
                 scan();
index 33a2d05..09ba805 100644 (file)
@@ -1374,7 +1374,7 @@ namespace cds { namespace gc {
             \p func is a disposer: when \p p can be safely removed, \p func is called.
         */
         template <typename T>
-        static void retire( T * p, void( *func )( T * ))
+        static void retire( T * p, void( *func )( void * ))
         {
             hp::thread_data* rec = hp::smr::tls();
             if ( !rec->retired_.push( hp::retired_ptr( p, func )))
index c17b090..06ed7fd 100644 (file)
@@ -243,9 +243,9 @@ namespace cds { namespace intrusive {
 
     protected:
         //@cond
-        static void free_leaf_node( value_type * p )
+        static void free_leaf_node( void* p )
         {
-            disposer()( );
+            disposer()( reinterpret_cast<value_type*>( p ));
         }
 
         internal_node * alloc_internal_node() const
@@ -255,9 +255,9 @@ namespace cds { namespace intrusive {
             return pNode;
         }
 
-        static void free_internal_node( internal_node * pNode )
+        static void free_internal_node( void* pNode )
         {
-            cxx_node_allocator().Delete( pNode );
+            cxx_node_allocator().Delete( reinterpret_cast<internal_node*>( pNode ));
         }
 
         struct internal_node_deleter {
@@ -275,9 +275,9 @@ namespace cds { namespace intrusive {
             return cxx_update_desc_allocator().New();
         }
 
-        static void free_update_desc( update_desc * pDesc )
+        static void free_update_desc( void* pDesc )
         {
-            cxx_update_desc_allocator().Delete( pDesc );
+            cxx_update_desc_allocator().Delete( reinterpret_cast<update_desc*>( pDesc ));
         }
 
         void retire_node( tree_node * pNode ) const
index 6177243..89f80bf 100644 (file)
@@ -1141,9 +1141,10 @@ namespace cds { namespace intrusive {
             return node_traits::to_value_ptr( p.ptr());
         }
 
-        static void dispose_node( value_type * pVal )
+        static void dispose_node( void* p )
         {
-            assert( pVal != nullptr );
+            assert( p != nullptr );
+            value_type* pVal = reinterpret_cast<value_type*>( p );
             typename node_builder::node_disposer()( node_traits::to_node_ptr( pVal ));
             disposer()( pVal );
         }
index b297813..63d4db1 100644 (file)
@@ -97,9 +97,9 @@ namespace cds { namespace urcu {
             If the buffer is full, \ref synchronize function is invoked.
         */
         template <typename T>
-        static void retire_ptr( T * p, void (* pFunc)(T *))
+        static void retire_ptr( T * p, free_retired_ptr_func pFunc )
         {
-            retired_ptr rp( reinterpret_cast<void *>( p ), reinterpret_cast<free_retired_ptr_func>( pFunc ));
+            retired_ptr rp( p, pFunc );
             retire_ptr( rp );
         }
 
index 91896a3..2623024 100644 (file)
@@ -90,9 +90,9 @@ namespace cds { namespace urcu {
             and then evaluates disposing expression <tt>pFunc( p )</tt>
         */
         template <typename T>
-        static void retire_ptr( T * p, void (* pFunc)(T *))
+        static void retire_ptr( T* p, free_retired_ptr_func pFunc )
         {
-            retired_ptr rp( reinterpret_cast<void *>( p ), reinterpret_cast<free_retired_ptr_func>( pFunc ));
+            retired_ptr rp( p, pFunc );
             retire_ptr( rp );
         }
 
@@ -102,7 +102,7 @@ namespace cds { namespace urcu {
             and then evaluates disposing expression <tt>Disposer()( p )</tt>
         */
         template <typename Disposer, typename T>
-        static void retire_ptr( T * p )
+        static void retire_ptr( T* p )
         {
             retire_ptr( p, cds::details::static_functor<Disposer, T>::call );
         }
index 16129d2..96f355f 100644 (file)
@@ -103,9 +103,9 @@ namespace cds { namespace urcu {
             If the buffer is full, \ref synchronize function is invoked.
         */
         template <typename T>
-        static void retire_ptr( T * p, void (* pFunc)(T *))
+        static void retire_ptr( T* p, free_retired_ptr_func pFunc )
         {
-            retired_ptr rp( reinterpret_cast<void *>( p ), reinterpret_cast<free_retired_ptr_func>( pFunc ));
+            retired_ptr rp( p, pFunc );
             retire_ptr( rp );
         }
 
@@ -114,7 +114,7 @@ namespace cds { namespace urcu {
             If the buffer is full, \ref synchronize function is invoked.
         */
         template <typename Disposer, typename T>
-        static void retire_ptr( T * p )
+        static void retire_ptr( T* p )
         {
             retire_ptr( p, cds::details::static_functor<Disposer, T>::call );
         }
index df5d36b..1ba5bab 100644 (file)
@@ -103,9 +103,9 @@ namespace cds { namespace urcu {
             If the buffer is full, \ref synchronize function is invoked.
         */
         template <typename T>
-        static void retire_ptr( T * p, void (* pFunc)(T *))
+        static void retire_ptr( T* p, free_retired_ptr_func pFunc )
         {
-            retired_ptr rp( reinterpret_cast<void *>( p ), reinterpret_cast<free_retired_ptr_func>( pFunc ));
+            retired_ptr rp( p, pFunc );
             retire_ptr( rp );
         }
 
@@ -114,7 +114,7 @@ namespace cds { namespace urcu {
             If the buffer is full, \ref synchronize function is invoked.
         */
         template <typename Disposer, typename T>
-        static void retire_ptr( T * p )
+        static void retire_ptr( T* p )
         {
             retire_ptr( p, cds::details::static_functor<Disposer, T>::call );
         }
index e5e0517..b001576 100644 (file)
@@ -110,9 +110,9 @@ namespace cds { namespace urcu {
             If the buffer is full, \ref synchronize function is invoked.
         */
         template <typename T>
-        static void retire_ptr( T * p, void (* pFunc)(T *))
+        static void retire_ptr( T* p, free_retired_ptr_func pFunc )
         {
-            retired_ptr rp( reinterpret_cast<void *>( p ), reinterpret_cast<free_retired_ptr_func>( pFunc ));
+            retired_ptr rp( p, pFunc );
             retire_ptr( rp );
         }