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