From: Francis Deslauriers Date: Fri, 24 Apr 2020 16:30:22 +0000 (-0400) Subject: Add compile time assertion that array and sequence have integer elements X-Git-Tag: v2.13.0-rc1~501 X-Git-Url: http://git.liburcu.org/?p=lttng-ust.git;a=commitdiff_plain;h=2df82195d140b39c40abfb43d526804a9d14d3da Add compile time assertion that array and sequence have integer elements 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 Signed-off-by: Mathieu Desnoyers Change-Id: Ie958635a8dc6262793d45c5f7458d50a0fecf7ab --- diff --git a/include/lttng/ust-tracepoint-event.h b/include/lttng/ust-tracepoint-event.h index 27f1686a..ec0e3144 100644 --- a/include/lttng/ust-tracepoint-event.h +++ b/include/lttng/ust-tracepoint-event.h @@ -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 +#include +#include + +#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 diff --git a/include/lttng/ust-tracer.h b/include/lttng/ust-tracer.h index ec30db74..c04d6247 100644 --- a/include/lttng/ust-tracer.h +++ b/include/lttng/ust-tracer.h @@ -27,6 +27,13 @@ * SOFTWARE. */ +#include + +#if defined (__cplusplus) +#include +#endif + +#include #include #include @@ -47,4 +54,29 @@ #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::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 */