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) > _at__at_ -6,6 +6,9 _at__at_ 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) _at__at_ -393,7 +393,7 _at__at_ } 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, _at__at_ -420,7 +420,7 _at__at_ } 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? -- CraigReceived on Sun Mar 22 2015 - 20:33:01 UTC
This archive was generated by hypermail 2.4.0 : Wed May 19 2021 - 11:40:56 UTC