clang-tidy: add most bugprone warnings
[lttng-tools.git] / src / common / macros.hpp
index 8875462edf284f379519947a2d4e43a60e7d554b..031d2a0564da7da1da1b999a7bac47018c8c50bc 100644 (file)
@@ -15,6 +15,8 @@
 #include <stdlib.h>
 #include <string.h>
 
+#include <memory>
+#include <pthread.h>
 #include <type_traits>
 
 /*
@@ -37,7 +39,7 @@
  * memory using malloc(), we must use generic accessors for compat in order to
  * *not* use a function to access members and not the variable name.
  */
-#define LTTNG_REF(x) ((typeof(*x) *)(x))
+#define LTTNG_REF(x) ((typeof(*(x)) *) (x))
 
 #ifdef NDEBUG
 /*
@@ -86,7 +88,7 @@ template<typename T>
 T *zmalloc()
 {
        static_assert (can_malloc<T>::value, "type can be malloc'ed");
-       return (T *) zmalloc_internal(sizeof(T));
+       return (T *) zmalloc_internal(sizeof(T)); /* NOLINT sizeof potentially used on a pointer. */
 }
 
 /*
@@ -109,7 +111,7 @@ template<typename T>
 T *calloc(size_t nmemb)
 {
        static_assert (can_malloc<T>::value, "type can be malloc'ed");
-       return (T *) zmalloc_internal(nmemb * sizeof(T));
+       return (T *) zmalloc_internal(nmemb * sizeof(T)); /* NOLINT sizeof potentially used on a pointer. */
 }
 
 /*
@@ -227,14 +229,6 @@ void *memmove(T *d, const U *s, size_t n) = delete;
 #define ARRAY_SIZE(array)   (sizeof(array) / (sizeof((array)[0])))
 #endif
 
-#ifndef container_of
-#define container_of(ptr, type, member)                                        \
-       ({                                                              \
-               const typeof(((type *)NULL)->member) * __ptr = (ptr);   \
-               (type *)((char *)__ptr - offsetof(type, member));       \
-       })
-#endif
-
 #ifndef LTTNG_PACKED
 #define LTTNG_PACKED __attribute__((__packed__))
 #endif
@@ -249,7 +243,7 @@ void *memmove(T *d, const U *s, size_t n) = delete;
 
 #define member_sizeof(type, field)     sizeof(((type *) 0)->field)
 
-#define ASSERT_LOCKED(lock) LTTNG_ASSERT(pthread_mutex_trylock(&lock))
+#define ASSERT_LOCKED(lock)         LTTNG_ASSERT(pthread_mutex_trylock(&(lock)))
 #define ASSERT_RCU_READ_LOCKED(lock) LTTNG_ASSERT(rcu_read_ongoing())
 
 /* Attribute suitable to tag functions as having printf()-like arguments. */
@@ -282,9 +276,13 @@ void *memmove(T *d, const U *s, size_t n) = delete;
        _Pragma("GCC diagnostic ignored \"-Wformat-nonliteral\"")
 # define DIAGNOSTIC_IGNORE_LOGICAL_OP \
        _Pragma("GCC diagnostic ignored \"-Wlogical-op\"")
-# define DIAGNOSTIC_IGNORE_DUPLICATED_BRANCHES \
+#if __GNUG__ && __GNUC__ >= 7
+# define DIAGNOSTIC_IGNORE_DUPLICATED_BRANCHES                         \
        _Pragma("GCC diagnostic ignored \"-Wduplicated-branches\"")
-# define DIAGNOSTIC_IGNORE_INVALID_OFFSETOF \
+#else
+# define DIAGNOSTIC_IGNORE_DUPLICATED_BRANCHES
+#endif /* __GNUG__ && __GNUC__ >= 7 */
+# define DIAGNOSTIC_IGNORE_INVALID_OFFSETOF                            \
        _Pragma("GCC diagnostic ignored \"-Winvalid-offsetof\"")
 #endif
 
@@ -315,4 +313,18 @@ int lttng_strncpy(char *dst, const char *src, size_t dst_len)
        return 0;
 }
 
+namespace lttng {
+namespace utils {
+template <class Parent, class Member>
+Parent *container_of(const Member *member, const Member Parent::*ptr_to_member)
+{
+       const Parent *dummy_parent = nullptr;
+       auto *offset_of_member = reinterpret_cast<const char *>(&(dummy_parent->*ptr_to_member));
+       auto address_of_parent = reinterpret_cast<const char *>(member) - offset_of_member;
+
+       return reinterpret_cast<Parent *>(address_of_parent);
+}
+} /* namespace utils */
+} /* namespace lttng */
+
 #endif /* _MACROS_H */
This page took 0.023712 seconds and 4 git commands to generate.