On Mon, May 19, 2025 at 11:23:34AM -0700, Kees Cook wrote:
> On Fri, May 16, 2025 at 01:34:14PM +0000, Qing Zhao wrote:
> > Adding -fdiagnotics-details into GCC to provide more hints to the
> > end users on how the warnings come from, in order to help the user
> > to locate the exact location in source code on the specific warnings
> > due to compiler optimizations.
> 
> I just needed to examine an unexpected -Wrestrict warning, and
> discovered that this patch didn't help with it, but in looking at the
> implementation details, it turned out to be trivial to expand coverage
> to include -Wrestrict, which worked for me, and got me the
> diagnostics I needed[1].

I found another case[1] where I didn't get detailed diagnostics, so I
tried to instrument that too, but it didn't do anything. Here's the patch
(trying to get more coverage for stringop-overflow), but I don't know
what I did wrong:


diff --git a/gcc/tree-ssa-strlen.cc b/gcc/tree-ssa-strlen.cc
index c4d64132e538..6342231afba2 100644
--- a/gcc/tree-ssa-strlen.cc
+++ b/gcc/tree-ssa-strlen.cc
@@ -59,6 +59,7 @@ along with GCC; see the file COPYING3.  If not see
 #include "tree-ssa-loop.h"
 #include "tree-scalar-evolution.h"
 #include "vr-values.h"
+#include "move-history-rich-location.h"
 #include "gimple-range.h"
 #include "tree-ssa.h"
 
@@ -2113,6 +2114,8 @@ strlen_pass::maybe_warn_overflow (gimple *stmt, bool 
call_lhs, tree len,
     return;
 
   location_t loc = gimple_or_expr_nonartificial_location (stmt, dest);
+  rich_location_with_details richloc (loc, stmt);
+
   bool warned = false;
   if (wi::leu_p (lenrng[0], spcrng[1]))
     {
@@ -2121,11 +2124,11 @@ strlen_pass::maybe_warn_overflow (gimple *stmt, bool 
call_lhs, tree len,
        return;
 
       warned = (writefn
-               ? warning_at (loc, OPT_Wstringop_overflow_,
+               ? warning_at (&richloc, OPT_Wstringop_overflow_,
                              "%qD writing one too many bytes into a region "
                              "of a size that depends on %<strlen%>",
                              writefn)
-               : warning_at (loc, OPT_Wstringop_overflow_,
+               : warning_at (&richloc, OPT_Wstringop_overflow_,
                              "writing one too many bytes into a region "
                              "of a size that depends on %<strlen%>"));
     }
@@ -2133,7 +2136,7 @@ strlen_pass::maybe_warn_overflow (gimple *stmt, bool 
call_lhs, tree len,
     {
       if (spcrng[0] == spcrng[1])
        warned = (writefn
-                 ? warning_n (loc, OPT_Wstringop_overflow_,
+                 ? warning_n (&richloc, OPT_Wstringop_overflow_,
                               lenrng[0].to_uhwi (),
                               "%qD writing %wu byte into a region "
                               "of size %wu",
@@ -2141,7 +2144,7 @@ strlen_pass::maybe_warn_overflow (gimple *stmt, bool 
call_lhs, tree len,
                               "of size %wu",
                               writefn, lenrng[0].to_uhwi (),
                               spcrng[0].to_uhwi ())
-                 : warning_n (loc, OPT_Wstringop_overflow_,
+                 : warning_n (&richloc, OPT_Wstringop_overflow_,
                               lenrng[0].to_uhwi (),
                               "writing %wu byte into a region "
                               "of size %wu",
@@ -2151,7 +2154,7 @@ strlen_pass::maybe_warn_overflow (gimple *stmt, bool 
call_lhs, tree len,
                               spcrng[0].to_uhwi ()));
       else
        warned = (writefn
-                 ? warning_n (loc, OPT_Wstringop_overflow_,
+                 ? warning_n (&richloc, OPT_Wstringop_overflow_,
                               lenrng[0].to_uhwi (),
                               "%qD writing %wu byte into a region "
                               "of size between %wu and %wu",
@@ -2159,7 +2162,7 @@ strlen_pass::maybe_warn_overflow (gimple *stmt, bool 
call_lhs, tree len,
                               "of size between %wu and %wu",
                               writefn, lenrng[0].to_uhwi (),
                               spcrng[0].to_uhwi (), spcrng[1].to_uhwi ())
-                 : warning_n (loc, OPT_Wstringop_overflow_,
+                 : warning_n (&richloc, OPT_Wstringop_overflow_,
                               lenrng[0].to_uhwi (),
                               "writing %wu byte into a region "
                               "of size between %wu and %wu",
@@ -2170,13 +2173,13 @@ strlen_pass::maybe_warn_overflow (gimple *stmt, bool 
call_lhs, tree len,
     }
   else if (spcrng[0] == spcrng[1])
     warned = (writefn
-             ? warning_at (loc, OPT_Wstringop_overflow_,
+             ? warning_at (&richloc, OPT_Wstringop_overflow_,
                            "%qD writing between %wu and %wu bytes "
                            "into a region of size %wu",
                            writefn, lenrng[0].to_uhwi (),
                            lenrng[1].to_uhwi (),
                            spcrng[0].to_uhwi ())
-             : warning_at (loc, OPT_Wstringop_overflow_,
+             : warning_at (&richloc, OPT_Wstringop_overflow_,
                            "writing between %wu and %wu bytes "
                            "into a region of size %wu",
                            lenrng[0].to_uhwi (),
@@ -2184,13 +2187,13 @@ strlen_pass::maybe_warn_overflow (gimple *stmt, bool 
call_lhs, tree len,
                            spcrng[0].to_uhwi ()));
   else
     warned = (writefn
-             ? warning_at (loc, OPT_Wstringop_overflow_,
+             ? warning_at (&richloc, OPT_Wstringop_overflow_,
                            "%qD writing between %wu and %wu bytes "
                            "into a region of size between %wu and %wu",
                            writefn, lenrng[0].to_uhwi (),
                            lenrng[1].to_uhwi (),
                            spcrng[0].to_uhwi (), spcrng[1].to_uhwi ())
-             : warning_at (loc, OPT_Wstringop_overflow_,
+             : warning_at (&richloc, OPT_Wstringop_overflow_,
                            "writing between %wu and %wu bytes "
                            "into a region of size between %wu and %wu",
                            lenrng[0].to_uhwi (),


Any idea? Thanks!

-Kees

[1] https://github.com/KSPP/linux/issues/311

-- 
Kees Cook

Reply via email to