Jenkins build is still unstable: FreeBSD_HEAD-tests2 #867
Craig Rodrigues
rodrigc at FreeBSD.org
Sun Mar 22 22:01:27 UTC 2015
On Sun, Mar 22, 2015 at 2:36 PM, Dimitry Andric <dim at freebsd.org> wrote:
> On 22 Mar 2015, at 22:32, Craig Rodrigues <rodrigc at FreeBSD.org> wrote:
> >
> > On Sun, Mar 22, 2015 at 2:29 PM, Dimitry Andric <dim at freebsd.org> wrote:
> >
> > Ah right, that was on i386, on amd64 it does result in -2^63. It is
> indeed caused by reliance on signed integer wrapping.
> >
> > This diff should fix it, without rewriting the utility:
> >
> > Index: bin/expr/Makefile
> > ===================================================================
> > --- bin/expr/Makefile (revision 280156)
> > +++ bin/expr/Makefile (working copy)
> > @@ -6,6 +6,9 @@ PROG= expr
> > SRCS= expr.y
> > YFLAGS=
> >
> > +# expr relies on signed integer wrapping
> > +CFLAGS+= -fwrapv
> > +
> > NO_WMISSING_VARIABLE_DECLARATIONS=
> >
> > .if ${MK_TESTS} != "no"
> >
> >
> > Well, another alternative is to patch expr.y:
> >
> > Index: expr.y
> > ===================================================================
> > --- expr.y (revision 280353)
> > +++ expr.y (working copy)
> > @@ -393,7 +393,7 @@
> > }
> >
> > void
> > -assert_plus(intmax_t a, intmax_t b, intmax_t r)
> > +assert_plus(intmax_t a, intmax_t b, volatile intmax_t r)
> > {
> > /*
> > * sum of two positive numbers must be positive,
> > @@ -420,7 +420,7 @@
> > }
> >
> > void
> > -assert_minus(intmax_t a, intmax_t b, intmax_t r)
> > +assert_minus(intmax_t a, intmax_t b, volatile intmax_t r)
> > {
> > /* special case subtraction of INTMAX_MIN */
> > if (b == INTMAX_MIN && a < 0)
> >
> >
> > There were already some patches previously done to this
> > file to add "volatile", so maybe this would be OK to do.
> >
> > What do you think?
>
> Volatile is not the solution, it is completely orthogonal. The correct
> way would be to use unsigned integers, for which wrapping is defined,
> then convert those back and forth when presenting the results to the
> user.
>
OK, converting expr.y to use unsigned integers would require a bit of work.
Can you commit your patch to the Makefile? It fixes the problem for now.
--
Craig
More information about the freebsd-toolchain
mailing list