From cacced7e507f7603bacc03ae2616e58f0ede122a Mon Sep 17 00:00:00 2001 From: Hein-Pieter van Braam Date: Thu, 24 Aug 2017 22:58:51 +0200 Subject: Convert Object::cast_to() to the static version Currently we rely on some undefined behavior when Object->cast_to() gets called with a Null pointer. This used to work fine with GCC < 6 but newer versions of GCC remove all codepaths in which the this pointer is Null. However, the non-static cast_to() was supposed to be null safe. This patch makes cast_to() Null safe and removes the now redundant Null checks where they existed. It is explained in this article: https://www.viva64.com/en/b/0226/ --- core/object.h | 40 ---------------------------------------- 1 file changed, 40 deletions(-) (limited to 'core/object.h') diff --git a/core/object.h b/core/object.h index ab1421e35..88229d27b 100644 --- a/core/object.h +++ b/core/object.h @@ -598,46 +598,6 @@ public: #endif } -// TODO: ensure 'this' is never NULL since it's UB, but by now, avoid warning flood -#ifdef __clang__ -#pragma clang diagnostic push -#pragma clang diagnostic ignored "-Wundefined-bool-conversion" -#endif - - template - T *cast_to() { - -#ifndef NO_SAFE_CAST - return SAFE_CAST(this); -#else - if (!this) - return NULL; - if (is_class_ptr(T::get_class_ptr_static())) - return static_cast(this); - else - return NULL; -#endif - } - - template - const T *cast_to() const { - -#ifndef NO_SAFE_CAST - return SAFE_CAST(this); -#else - if (!this) - return NULL; - if (is_class_ptr(T::get_class_ptr_static())) - return static_cast(this); - else - return NULL; -#endif - } - -#ifdef __clang__ -#pragma clang diagnostic pop -#endif - enum { NOTIFICATION_POSTINITIALIZE = 0, -- cgit v1.2.3-70-g09d2