From 7de667ed5e101d730fe54ce8a84c3d58a5d4c55c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ion=20Gazta=C3=B1aga?= Date: Sun, 18 Oct 2015 21:30:10 +0200 Subject: [PATCH] Fix undefined behaviour with default casting implementations. Null pointers can't be dereferenced, so return a value constructed smart pointer in those cases. --- include/boost/intrusive/pointer_traits.hpp | 14 +++----------- 1 file changed, 3 insertions(+), 11 deletions(-) diff --git a/include/boost/intrusive/pointer_traits.hpp b/include/boost/intrusive/pointer_traits.hpp index 24843fd..731432b 100644 --- a/include/boost/intrusive/pointer_traits.hpp +++ b/include/boost/intrusive/pointer_traits.hpp @@ -223,7 +223,7 @@ struct pointer_traits template static pointer priv_static_cast_from(boost::intrusive::detail::false_, const UPtr &uptr) - { return pointer_to(*static_cast(to_raw_pointer(uptr))); } + { return uptr ? pointer_to(*static_cast(to_raw_pointer(uptr))) : pointer(); } //priv_const_cast_from template @@ -232,7 +232,7 @@ struct pointer_traits template static pointer priv_const_cast_from(boost::intrusive::detail::false_, const UPtr &uptr) - { return pointer_to(const_cast(*uptr)); } + { return uptr ? pointer_to(const_cast(*uptr)) : pointer(); } //priv_dynamic_cast_from template @@ -241,15 +241,7 @@ struct pointer_traits template static pointer priv_dynamic_cast_from(boost::intrusive::detail::false_, const UPtr &uptr) - { - element_type *p = dynamic_cast(&*uptr); - if(!p){ - return pointer(); - } - else{ - return pointer_to(*p); - } - } + { return uptr ? pointer_to(dynamic_cast(*uptr)) : pointer(); } ///@endcond };