Debugging Tools
Undefined Behavior Sanitizer (ubsan)
RIOT contains Makefile convenience support for gcc/clang’s undefined behaviour sanitizer.
Overview
Both gcc and clang allow generation of code that does runtime checks for undefined behavior (UB).
E.g., the following code might trigger UB for some parameters:
void test(int foo) { return (foo << 24);}
In this case, the signed shift would be alright unless:
- it would “push out” all bits to the left, with undefined runtime result. Here, that happens on architectures with 16-bit integers.
foo
is negative, with implementation-specific runtime results.
Using ubsan, these can be caught at runtime.
There are three modes for ubsan that define what happens when the sanitizer observed undefined behaviour:
trap
-> cause a trapmsg_exit
-> print a message and exitmsg_recover
-> print a message and continue
trap
is available on all RIOT platforms, whereas msg_exit
and msg_recover
are currently only available on native
when building with gcc, as they require runtime support in
the form of libubsan
.
The default is trap
, or msg_exit
if available (currently, on native:gnu only).
How to Use
-
build with
make all-ubsan
. -
build with
UBSAN_MODE=[trap|msg_exit|msg_recover] make all-ubsan
to override the ubsan mode.