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 2df6419a45be90f8d3cc12732ea0afc17a0a41cf..52986bccceb6e7bfb6682cce6e3c331b9f5e997f 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 85cfce6fe35d504ad0ed32fa49fef528f3fac05e..8f5ee4bf555e6e0adea3abd86d1f9e337d607b76 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 755e051ee91e633d67dffaac9c9260fdf0381e8d..23d876b0fc1d4b54515a3336f6335ecf0df9e568 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 33a2d05c46f26e10346e4a135640a971f99bfea8..09ba805945ece08dc3ccd34e03daa71e76726239 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 c17b090eb222b52a65c053b6479d9705e6d4e495..06ed7fd078c4d07a7ea275fe090ab4524f8f07ab 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 617724307c8236b84e643cec0491799720a5a114..89f80bfc04b7d590d1ac7792a8dd0a7833ea5bc2 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 b297813c5a28c2c84ec07c0de27dfa2f63905535..63d4db1ca62ad544f4be1a22ccba36725802637c 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 91896a3efc9b5049fcc9b7ed48785bbc1b80d3be..2623024e045b65e87d1d23eb3844c2cb12060bec 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 16129d28e19aa632fcc3895fee78f289e8e4c709..96f355f0da19390e56a03a3bbee2f1c832c2f0c0 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 df5d36bab63b53ba33b41ab49c43e4cc8e8f7e82..1ba5bab6792fadc597e84b8789744138dff7c37f 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 e5e0517eed978ddc3b729a177026ef64ee99adfb..b001576eed0702e34107a771842cf44637daba85 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 );
         }