Hi, Kees,


> On May 19, 2025, at 14:23, Kees Cook <k...@kernel.org> 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 am so happy to see that this work can help the -Wrestrict warnings 
as well. 
> 
> Could you include this patch in the next version of the series too? I'll
> put it to use! :)

Yes, I will add the support to -Wrestrict too.

Thanks a lot.

Qing
> 
> -Kees
> 
> [1] https://lore.kernel.org/all/202505191117.C094A90F88@keescook/
> 
> 
> diff --git a/gcc/gimple-ssa-warn-restrict.cc b/gcc/gimple-ssa-warn-restrict.cc
> index a52307866cc4..0f6eddf01e4e 100644
> --- a/gcc/gimple-ssa-warn-restrict.cc
> +++ b/gcc/gimple-ssa-warn-restrict.cc
> @@ -1448,6 +1448,8 @@ maybe_diag_overlap (location_t loc, gimple *call, 
> builtin_access &acs)
> 
>   tree func = gimple_call_fndecl (call);
> 
> +  rich_location_with_details richloc (loc, call);
> +
>   /* To avoid a combinatorial explosion of diagnostics format the offsets
>      or their ranges as strings and use them in the warning calls below.  */
>   char offstr[3][64];
> @@ -1493,7 +1495,7 @@ maybe_diag_overlap (location_t loc, gimple *call, 
> builtin_access &acs)
>       if (sizrange[0] == sizrange[1])
> {
>  if (ovlsiz[0] == ovlsiz[1])
> -    warning_at (loc, OPT_Wrestrict,
> +    warning_at (&richloc, OPT_Wrestrict,
> sizrange[0] == 1
> ? (ovlsiz[0] == 1
>   ? G_("%qD accessing %wu byte at offsets %s "
> @@ -1510,7 +1512,7 @@ maybe_diag_overlap (location_t loc, gimple *call, 
> builtin_access &acs)
> func, sizrange[0],
> offstr[0], offstr[1], ovlsiz[0], offstr[2]);
>  else if (ovlsiz[1] >= 0 && ovlsiz[1] < maxobjsize.to_shwi ())
> -    warning_n (loc, OPT_Wrestrict, sizrange[0],
> +    warning_n (&richloc, OPT_Wrestrict, sizrange[0],
>       "%qD accessing %wu byte at offsets %s "
>       "and %s overlaps between %wu and %wu bytes "
>       "at offset %s",
> @@ -1520,7 +1522,7 @@ maybe_diag_overlap (location_t loc, gimple *call, 
> builtin_access &acs)
>       func, sizrange[0], offstr[0], offstr[1],
>       ovlsiz[0], ovlsiz[1], offstr[2]);
>  else
> -    warning_n (loc, OPT_Wrestrict, sizrange[0],
> +    warning_n (&richloc, OPT_Wrestrict, sizrange[0],
>       "%qD accessing %wu byte at offsets %s and "
>       "%s overlaps %wu or more bytes at offset %s",
>       "%qD accessing %wu bytes at offsets %s and "
> @@ -1533,7 +1535,7 @@ maybe_diag_overlap (location_t loc, gimple *call, 
> builtin_access &acs)
>       if (sizrange[1] >= 0 && sizrange[1] < maxobjsize.to_shwi ())
> {
>  if (ovlsiz[0] == ovlsiz[1])
> -    warning_n (loc, OPT_Wrestrict, ovlsiz[0],
> +    warning_n (&richloc, OPT_Wrestrict, ovlsiz[0],
>       "%qD accessing between %wu and %wu bytes "
>       "at offsets %s and %s overlaps %wu byte at "
>       "offset %s",
> @@ -1543,7 +1545,7 @@ maybe_diag_overlap (location_t loc, gimple *call, 
> builtin_access &acs)
>       func, sizrange[0], sizrange[1],
>       offstr[0], offstr[1], ovlsiz[0], offstr[2]);
>  else if (ovlsiz[1] >= 0 && ovlsiz[1] < maxobjsize.to_shwi ())
> -    warning_at (loc, OPT_Wrestrict,
> +    warning_at (&richloc, OPT_Wrestrict,
> "%qD accessing between %wu and %wu bytes at "
> "offsets %s and %s overlaps between %wu and %wu "
> "bytes at offset %s",
> @@ -1551,7 +1553,7 @@ maybe_diag_overlap (location_t loc, gimple *call, 
> builtin_access &acs)
> offstr[0], offstr[1], ovlsiz[0], ovlsiz[1],
> offstr[2]);
>  else
> -    warning_at (loc, OPT_Wrestrict,
> +    warning_at (&richloc, OPT_Wrestrict,
> "%qD accessing between %wu and %wu bytes at "
> "offsets %s and %s overlaps %wu or more bytes "
> "at offset %s",
> @@ -1564,7 +1566,7 @@ maybe_diag_overlap (location_t loc, gimple *call, 
> builtin_access &acs)
> ovlsiz[1] = maxobjsize.to_shwi ();
> 
>       if (ovlsiz[0] == ovlsiz[1])
> - warning_n (loc, OPT_Wrestrict, ovlsiz[0],
> + warning_n (&richloc, OPT_Wrestrict, ovlsiz[0],
>   "%qD accessing %wu or more bytes at offsets "
>   "%s and %s overlaps %wu byte at offset %s",
>   "%qD accessing %wu or more bytes at offsets "
> @@ -1572,14 +1574,14 @@ maybe_diag_overlap (location_t loc, gimple *call, 
> builtin_access &acs)
>   func, sizrange[0], offstr[0], offstr[1],
>   ovlsiz[0], offstr[2]);
>       else if (ovlsiz[1] >= 0 && ovlsiz[1] < maxobjsize.to_shwi ())
> - warning_at (loc, OPT_Wrestrict,
> + warning_at (&richloc, OPT_Wrestrict,
>    "%qD accessing %wu or more bytes at offsets %s "
>    "and %s overlaps between %wu and %wu bytes "
>    "at offset %s",
>    func, sizrange[0], offstr[0], offstr[1],
>    ovlsiz[0], ovlsiz[1], offstr[2]);
>       else
> - warning_at (loc, OPT_Wrestrict,
> + warning_at (&richloc, OPT_Wrestrict,
>    "%qD accessing %wu or more bytes at offsets %s "
>    "and %s overlaps %wu or more bytes at offset %s",
>    func, sizrange[0], offstr[0], offstr[1],
> @@ -1607,14 +1609,14 @@ maybe_diag_overlap (location_t loc, gimple *call, 
> builtin_access &acs)
>       if (ovlsiz[1] == 1)
> {
>  if (open_range)
> -    warning_n (loc, OPT_Wrestrict, sizrange[1],
> +    warning_n (&richloc, OPT_Wrestrict, sizrange[1],
>       "%qD accessing %wu byte may overlap "
>       "%wu byte",
>       "%qD accessing %wu bytes may overlap "
>       "%wu byte",
>       func, sizrange[1], ovlsiz[1]);
>  else
> -    warning_n (loc, OPT_Wrestrict, sizrange[1],
> +    warning_n (&richloc, OPT_Wrestrict, sizrange[1],
>       "%qD accessing %wu byte at offsets %s "
>       "and %s may overlap %wu byte at offset %s",
>       "%qD accessing %wu bytes at offsets %s "
> @@ -1625,14 +1627,14 @@ maybe_diag_overlap (location_t loc, gimple *call, 
> builtin_access &acs)
> }
> 
>       if (open_range)
> - warning_n (loc, OPT_Wrestrict, sizrange[1],
> + warning_n (&richloc, OPT_Wrestrict, sizrange[1],
>   "%qD accessing %wu byte may overlap "
>   "up to %wu bytes",
>   "%qD accessing %wu bytes may overlap "
>   "up to %wu bytes",
>   func, sizrange[1], ovlsiz[1]);
>       else
> - warning_n (loc, OPT_Wrestrict, sizrange[1],
> + warning_n (&richloc, OPT_Wrestrict, sizrange[1],
>   "%qD accessing %wu byte at offsets %s and "
>   "%s may overlap up to %wu bytes at offset %s",
>   "%qD accessing %wu bytes at offsets %s and "
> @@ -1645,14 +1647,14 @@ maybe_diag_overlap (location_t loc, gimple *call, 
> builtin_access &acs)
>   if (sizrange[1] >= 0 && sizrange[1] < maxobjsize.to_shwi ())
>     {
>       if (open_range)
> - warning_n (loc, OPT_Wrestrict, ovlsiz[1],
> + warning_n (&richloc, OPT_Wrestrict, ovlsiz[1],
>   "%qD accessing between %wu and %wu bytes "
>   "may overlap %wu byte",
>   "%qD accessing between %wu and %wu bytes "
>   "may overlap up to %wu bytes",
>   func, sizrange[0], sizrange[1], ovlsiz[1]);
>       else
> - warning_n (loc, OPT_Wrestrict, ovlsiz[1],
> + warning_n (&richloc, OPT_Wrestrict, ovlsiz[1],
>   "%qD accessing between %wu and %wu bytes "
>   "at offsets %s and %s may overlap %wu byte "
>   "at offset %s",
> @@ -1664,7 +1666,7 @@ maybe_diag_overlap (location_t loc, gimple *call, 
> builtin_access &acs)
>       return true;
>     }
> 
> -  warning_n (loc, OPT_Wrestrict, ovlsiz[1],
> +  warning_n (&richloc, OPT_Wrestrict, ovlsiz[1],
>     "%qD accessing %wu or more bytes at offsets %s "
>     "and %s may overlap %wu byte at offset %s",
>     "%qD accessing %wu or more bytes at offsets %s "
> 
> 
> 
> -- 
> Kees Cook

Reply via email to