Add compile time assertion that array and sequence have integer elements
authorFrancis Deslauriers <francis.deslauriers@efficios.com>
Fri, 24 Apr 2020 16:30:22 +0000 (12:30 -0400)
committerMathieu Desnoyers <mathieu.desnoyers@efficios.com>
Fri, 24 Apr 2020 23:48:55 +0000 (19:48 -0400)
Currently, LTTng-UST only supports ctf_arrays(and ctf_sequences) of
integers and chars but there is nothing preventing the user of compiling
an array of double. This is problematic because the resulting metadata
for that array will end up being erroneous.

This commit adds a new stage in the probe building process that asserts
that the element type of arrays or sequences are supported. This stage
adds a compile time static assertion, so the probes won't build if the
type is not supported.

Here is the error message the user will get when compiling with a C99
compiler:
  gcc -c -sdt=c99 -I. tp.c
    In file included from /usr/local/include/lttng/tracepoint-event.h:58:0,
       from tp.h:77,
       from tp.c:4:
    ././tp.h:71:9: error: size of array ‘lttng_static_assert_Non_integer_type__my_array__not_supported_as_element_of_CTF_ARRAY_or_CTF_SEQUENCE’ is negative
    ctf_array(double, my_array_for_double, my_array_for_double, 3)

Here is the error message the user will get when compiling with a C++ or
C11 compiler or above:
  g++ -c -std=c11 -I. tp.c
    In file included from /usr/local/include/lttng/tracepoint-event.h:58:0,
         from tp.h:77,
         from tp.c:4:
    ././tp.h:71:9: error: static assertion failed: Non-integer type `my_array` not supported as element of CTF_ARRAY or CTF_SEQUENCE
    ctf_array(double, my_array, my_array_for_double, 3)

Signed-off-by: Francis Deslauriers <francis.deslauriers@efficios.com>
Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
Change-Id: Ie958635a8dc6262793d45c5f7458d50a0fecf7ab

include/lttng/ust-tracepoint-event.h
include/lttng/ust-tracer.h

index 27f1686a16dfba532c69572b3f19caba65c7d4de..ec0e314432e58cde1be7deae76601dec5f2ca1e4 100644 (file)
@@ -216,6 +216,36 @@ void __event_template_proto___##_provider##___##_name(_TP_ARGS_DATA_PROTO(_args)
                _values                                                 \
                ctf_enum_value("", 0)   /* Dummy, 0-len array forbidden by C99. */ \
        };
+#include TRACEPOINT_INCLUDE
+
+/*
+ * Stage 0.9.1
+ * Verifying array and sequence elements are of an integer type.
+ */
+
+/* Reset all macros within TRACEPOINT_EVENT */
+#include <lttng/ust-tracepoint-event-reset.h>
+#include <lttng/ust-tracepoint-event-write.h>
+#include <lttng/ust-tracepoint-event-nowrite.h>
+
+#undef _ctf_array_encoded
+#define _ctf_array_encoded(_type, _item, _src, _byte_order,    \
+                       _length, _encoding, _nowrite,           \
+                       _elem_type_base)                        \
+       _lttng_array_element_type_is_supported(_type, _item)
+
+#undef _ctf_sequence_encoded
+#define _ctf_sequence_encoded(_type, _item, _src, _byte_order, \
+                       _length_type, _src_length, _encoding, _nowrite, \
+                       _elem_type_base)                        \
+       _lttng_array_element_type_is_supported(_type, _item)
+
+#undef TP_FIELDS
+#define TP_FIELDS(...) __VA_ARGS__     /* Only one used in this phase */
+
+#undef TRACEPOINT_EVENT_CLASS
+#define TRACEPOINT_EVENT_CLASS(_provider, _name, _args, _fields)       \
+               _fields
 
 #include TRACEPOINT_INCLUDE
 
index ec30db7446a52608b6d5b0a9267f3184f33b516f..c04d6247f57e0a3af082bed1ff1799594871ed4b 100644 (file)
  * SOFTWARE.
  */
 
+#include <stdint.h>
+
+#if defined (__cplusplus)
+#include <type_traits>
+#endif
+
+#include <lttng/ust-compiler.h>
 #include <lttng/ust-config.h>
 #include <lttng/ust-version.h>
 
 
 #define lttng_is_signed_type(type)           ((type) -1 < (type) 0)
 
+/*
+ * This macro adds a compilation assertion that CTF arrays and sequences
+ * declared by the users are of an integral type.
+ */
+
+#if defined(__cplusplus)
+#define _lttng_is_integer(type) (std::is_integral<type>::value)
+#else
+#define _lttng_is_integer(type) (__builtin_types_compatible_p(type, _Bool) || \
+               __builtin_types_compatible_p(type, char) || \
+               __builtin_types_compatible_p(type, int8_t) || \
+               __builtin_types_compatible_p(type, uint8_t) || \
+               __builtin_types_compatible_p(type, int16_t) || \
+               __builtin_types_compatible_p(type, uint16_t) || \
+               __builtin_types_compatible_p(type, int32_t) || \
+               __builtin_types_compatible_p(type, uint32_t) || \
+               __builtin_types_compatible_p(type, int64_t) || \
+               __builtin_types_compatible_p(type, uint64_t))
+#endif
+
+#define _lttng_array_element_type_is_supported(_type, _item) \
+               lttng_static_assert(_lttng_is_integer(_type), \
+                       "Non-integer type `" #_item "` not supported as element of CTF_ARRAY or CTF_SEQUENCE", \
+                       Non_integer_type__##_item##__not_supported_as_element_of_CTF_ARRAY_or_CTF_SEQUENCE);
+
 #endif /* _LTTNG_UST_TRACER_H */
This page took 0.026577 seconds and 4 git commands to generate.