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" } */
+}
+

Reply via email to