On Fri, Sep 15, 2023 at 11:43 AM Kees Cook via Gcc-patches
<gcc-patches@gcc.gnu.org> wrote:
>
> On Fri, Sep 15, 2023 at 05:47:08PM +0000, Qing Zhao wrote:
> >
> >
> > > On Sep 15, 2023, at 1:26 PM, Richard Biener <richard.guent...@gmail.com> 
> > > wrote:
> > >
> > >
> > >
> > >> Am 15.09.2023 um 17:37 schrieb Qing Zhao <qing.z...@oracle.com>:
> > >>
> > >> 
> > >>
> > >>>> On Sep 15, 2023, at 11:29 AM, Richard Biener 
> > >>>> <richard.guent...@gmail.com> wrote:
> > >>>>
> > >>>>
> > >>>>
> > >>>>> Am 15.09.2023 um 17:25 schrieb Qing Zhao <qing.z...@oracle.com>:
> > >>>>
> > >>>> 
> > >>>>
> > >>>>> On Sep 15, 2023, at 8:41 AM, Arsen Arsenović <ar...@aarsen.me> wrote:
> > >>>>>
> > >>>>>
> > >>>>> Qing Zhao <qing.z...@oracle.com> writes:
> > >>>>>
> > >>>>>> Even though unsigned integer overflow is well defined, it might be
> > >>>>>> unintentional, shall we warn user about this?
> > >>>>>
> > >>>>> This would be better addressed by providing operators or functions 
> > >>>>> that
> > >>>>> do overflow checking in the language, so that they can be explicitly
> > >>>>> used where overflow is unexpected.
> > >>>>
> > >>>> Yes, that will be very helpful to prevent unexpected overflow in the 
> > >>>> program in general.
> > >>>> However, this will mainly benefit new codes.
> > >>>>
> > >>>> For the existing C codes, especially large applications, we still need 
> > >>>> to identify all the places
> > >>>> Where the overflow is unexpected, and fix them.
> > >>>>
> > >>>> One good example is linux kernel.
> > >>>>
> > >>>>> One could easily imagine a scenario
> > >>>>> where overflow is not expected in some region of code but is in the
> > >>>>> larger application.
> > >>>>
> > >>>> Yes, that’s exactly the same situation Linux kernel faces now, the 
> > >>>> unexpected Overflow and
> > >>>> expected wrap-around are mixed together inside one module.
> > >>>> It’s hard to detect the unexpected overflow under such situation based 
> > >>>> on the current GCC.
> > >>>
> > >>> But that’s hardly GCCs fault nor can GCC fix that in any way.  Only the 
> > >>> programmer can distinguish both cases.
> > >>
> > >> Right, compiler cannot fix this.
> > >> But can provide some tools to help the user to detect this more 
> > >> conveniently.
> > >>
> > >> Right now, GCC provides two set of options for different types:
> > >>
> > >> A. Turn the overflow to expected wrap-around (remove UB);
> > >> B. Detect overflow;
> > >>
> > >>           A                B
> > >>          remove UB        -fsanitize=…
> > >> signed       -fwrapv            signed-integer-overflow
> > >> pointer       -fwrapv-pointer    pointer-overflow (broken in Clang)
> > >>
> > >> However, Options in A and B excluded with each other. They cannot mix 
> > >> together for a single file.
> > >>
> > >> What’s requested from Kernel is:
> > >>
> > >> compiler needs to provide a functionality that can mix these two 
> > >> together for a file.
> > >>
> > >> i.e, apply A (convert UB to defined behavior WRAP-AROUND) only to part 
> > >> of the program.  And then add -fsnaitize=*overflow to detect all other
> > >> Unexpected overflows in the program.

Yes, I believe combining A and B should be allowed.

> > >> This is currently missing from GCC, I guess?
> > >
> > > How can GCC know which part of the program wants wrapping and which 
> > > sanitizing?
> >
> > GCC doesn’t know, but the user knows.
> >
> > Then just provide the user a way to mark part of the program to be wrapping 
> > around and excluded from sanitizing?
> >
> > Currently, GCC provides
> >
> > __attribute__(optimize ("wrapv"))
> >
> > To mark the specific function to be wrapped around.
> >
> > However, this attribute does not work for linux kernel due to the following 
> > reason:
> >
> > Attribute optimize should be only used for debugging purpose;
> > The kernel has banned its usage;
> >
> > So, a new attribute was requested from Linux kernel security:
> >
> >  request wrap-around behavior for specific function (PR102317)
> > __attribute__((wrapv))
> >
> > Is this request reasonable?
>
> After working through this discussion, I'd say it's likely more helpful
> to have a way to disable the sanitizers for a given function (or
> variable). i.e. The goal for the kernel would that untrapped wrap-around
> would be the very rare exception. e.g. our refcount_t implementation:
> https://elixir.bootlin.com/linux/v6.5/source/include/linux/refcount.h#L200
>
> Then we can continue to build the kernel with -fno-strict-overflow (to
> avoid UB), but gain sanitizer coverage for all run-time wraps, except
> for the very few places where we depend on it. Getting there will also
> take some non-trivial refactoring on our end, but without the sanitizers
> we're unlikely to find them all.
>
> --
> Kees Cook

I see a Clang patch that proposes -fsanitize=signed-integer-wrap,
which appears to be the same as signed-integer-overflow, but performs
the check in the -fwrapv mode.
I made a reply to
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=102317#c13 that we
probably should just make -fsanitize=signed-integer-overflow work with
-fwrapv.

(This message is made so that interested folks are informed of the
Clang change.)


-- 
宋方睿

Reply via email to