There is code which should not fail at run-time. For this, it is helpful to get a warning when a compiler inserts traps (e.g. sanitizers, hardbools, __builtin_trap(), etc.).
Having a warning for this also has many other use cases, e.g. one can use it with some sanitizer to rule out that some piece of code has certain undefined behavior such as signed overflow or undefined behavior in left-shifts (one gets a warning if the optimizer does not prove the trap is dead and it is emitted). Another potential use case could be writing tests. Bootstrapped and regression tested on x64_84. Add warning option that warns when a trap is generated. This adds a warning option -Wtrap that is emitted in expand_builtin_trap. It can be used to verify that traps are generated or - more importantly - are not generated under various conditions, e.g. for UBSan with -fsanitize-trap, hardbools, etc. gcc/ChangeLog: * common.opt (Wtrap): Add warning. * builtins.cc (expand_builtin_trap): Add warning. * doc/invoke.texi (Wtrap): Document warning. gcc/testsuite/ChangeLog: * gcc.dg/Wtrap.c: New test. diff --git a/gcc/builtins.cc b/gcc/builtins.cc index 37c7c98e5c7..76268f62481 100644 --- a/gcc/builtins.cc +++ b/gcc/builtins.cc @@ -5896,6 +5896,14 @@ expand_builtin_assume_aligned (tree exp, rtx target) void expand_builtin_trap (void) { + if (warn_trap) + { + location_t current_location = + linemap_unwind_to_first_non_reserved_loc (line_table, input_location, + NULL); + warning_at (current_location, OPT_Wtrap, "trap generated"); + } + if (targetm.have_trap ()) { rtx_insn *insn = emit_insn (targetm.gen_trap ()); diff --git a/gcc/common.opt b/gcc/common.opt index 12b25ff486d..1cc4936ebbf 100644 --- a/gcc/common.opt +++ b/gcc/common.opt @@ -812,6 +812,10 @@ Wsystem-headers Common Var(warn_system_headers) Warning Do not suppress warnings from system headers. +Wtrap +Common Var(warn_trap) Warning +Warn whenever a trap is generated. + Wtrampolines Common Var(warn_trampolines) Warning Warn whenever a trampoline is generated. diff --git a/gcc/doc/invoke.texi b/gcc/doc/invoke.texi index 575dffd2a2f..68833c4350f 100644 --- a/gcc/doc/invoke.texi +++ b/gcc/doc/invoke.texi @@ -8784,6 +8784,14 @@ made up of data only and thus requires no special treatment. But, for most targets, it is made up of code and thus requires the stack to be made executable in order for the program to work properly. +@opindex Wtrap +@opindex Wno-trap +@item -Wtrap +Warn when explicit traps are generated. Traps may be generated for +a variety of reasons, e.g. when using the undefined behavior sanitizer +together with @option{-fsanitize-trap=undefined}. + + @opindex Wfloat-equal @opindex Wno-float-equal @item -Wfloat-equal diff --git a/gcc/testsuite/gcc.dg/Wtrap.c b/gcc/testsuite/gcc.dg/Wtrap.c new file mode 100644 index 00000000000..2f2878f9d45 --- /dev/null +++ b/gcc/testsuite/gcc.dg/Wtrap.c @@ -0,0 +1,8 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -Wtrap" } */ + +void foo(void) +{ + __builtin_trap(); /* { dg-warning "trap generated" } */ +} +