Re: [PATCH kvm-unit-tests] compiler: Add builtin overflow flag

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Tue, Mar 23, 2021 at 04:22:58PM +0100, Thomas Huth wrote:
> On 23/03/2021 14.58, Andrew Jones wrote:
> > Checking for overflow can difficult, but doing so may be a good
> > idea to avoid difficult to debug problems. Compilers that provide
> > builtins for overflow checking allow the checks to be simple
> > enough that we can use them more liberally. The idea for this
> > flag is to wrap a calculation that should have overflow checking,
> > allowing compilers that support it to give us some extra robustness.
> > For example,
> > 
> >    #ifdef COMPILER_HAS_GENERIC_BUILTIN_OVERFLOW
> >        bool overflow = __builtin_mul_overflow(x, y, &z);
> >        assert(!overflow);
> >    #else
> >        /* Older compiler, hopefully we don't overflow... */
> >        z = x * y;
> >    #endif
> > 
> > Signed-off-by: Andrew Jones <drjones@xxxxxxxxxx>
> > ---
> >   lib/linux/compiler.h | 14 ++++++++++++++
> >   1 file changed, 14 insertions(+)
> > 
> > diff --git a/lib/linux/compiler.h b/lib/linux/compiler.h
> > index 2d72f18c36e5..311da9807932 100644
> > --- a/lib/linux/compiler.h
> > +++ b/lib/linux/compiler.h
> > @@ -8,6 +8,20 @@
> >   #ifndef __ASSEMBLY__
> > +#define GCC_VERSION (__GNUC__ * 10000           \
> > +		     + __GNUC_MINOR__ * 100     \
> > +		     + __GNUC_PATCHLEVEL__)
> > +
> > +#ifdef __clang__
> > +#if __has_builtin(__builtin_mul_overflow) && \
> > +    __has_builtin(__builtin_add_overflow) && \
> > +    __has_builtin(__builtin_sub_overflow)
> > +#define COMPILER_HAS_GENERIC_BUILTIN_OVERFLOW 1
> > +#endif
> > +#elif GCC_VERSION >= 50100
> > +#define COMPILER_HAS_GENERIC_BUILTIN_OVERFLOW 1
> > +#endif
> > +
> >   #include <stdint.h>
> >   #define barrier()	asm volatile("" : : : "memory")
> > 
> 
> Acked-by: Thomas Huth <thuth@xxxxxxxxxx>
> 
> ... but I wonder:
> 
> 1) Whether we still want to support those old compilers that do not have
> this built-in functions yet ... maybe it's time to declare the older systems
> as unsupported now?

I think the CentOS7 test is a good one to have. If for nobody else, then
the people maintaining and testing RHEL7. So, I'd rather we keep a simple
fallback in place, but hope that its use is limited.

> 
> 2) Whether it would make more sense to provide static-inline functions for
> these arithmetic operations that take care of the overflow handling, so that
> we do not have #ifdefs in the .c code later all over the place?

We could add macro wrappers for the arbitrary integral type builtin forms
and/or the predicates forms.

I can take a stab at that and send a v2.

Thanks,
drew




[Index of Archives]     [KVM ARM]     [KVM ia64]     [KVM ppc]     [Virtualization Tools]     [Spice Development]     [Libvirt]     [Libvirt Users]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite Questions]     [Linux Kernel]     [Linux SCSI]     [XFree86]

  Powered by Linux