Skip to content

Commit

Permalink
Add compile time assertion that array and sequence have integer elements
Browse files Browse the repository at this point in the history
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
  • Loading branch information
frdeso authored and compudj committed Apr 24, 2020
1 parent 7f26406 commit 2df8219
Show file tree
Hide file tree
Showing 2 changed files with 62 additions and 0 deletions.
30 changes: 30 additions & 0 deletions include/lttng/ust-tracepoint-event.h
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down
32 changes: 32 additions & 0 deletions include/lttng/ust-tracer.h
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,13 @@
* 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>

Expand All @@ -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<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 */

0 comments on commit 2df8219

Please sign in to comment.