[Top][All Lists]

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

Re: Arithmetic expression: evaluation order bug

From: Steffen Nurpmeso
Subject: Re: Arithmetic expression: evaluation order bug
Date: Fri, 30 Dec 2022 00:10:24 +0100
User-agent: s-nail v14.9.24-383-g2889cb06b9

Alain D D Williams wrote in
 |On Thu, Dec 29, 2022 at 10:30:09PM +0100, Steffen Nurpmeso wrote:
 |> But then shell "operators and  their precedence, associativity,
 |> and values are the same as in the C language".  There are no
 |> sequence points.
 |Order of evaluation is not the same as precedence/associativity.
 |> += is right associative, and then unwound.
 |> (For C, they do it all right,
 |There is not a 'right' since the expression is undefined as it breaks
 |sequencing rules. You have a notion of 'right' that might well be what \
 |(with compilers that you have tested) but you are not allowed to make that
 |> only clang warns on sequencing when tested.
 |Ah: so only clang gives the warning that the others should probably give.

By default.

 |> But yes, i do "hate" ISO/IEC JTC1/SC22/WG14, N925, "A formal model of
 |> sequence points and related issues", Clive Feather, from Y2K (my \
 |> version),
 |> and if only for such cases like the above.
 |Standards are not written to be "liked". They describe how a compiler \
 |work which includes things where the compiler writer can do as they \
 |please if
 |they think that they can generate faster/smaller/... machine code.
 |> Or the x=++x shown in the committee document (for exactly that reason i
 |> presume: an "easy" formal formula to make it work, even if human \
 |> logic gives
 |> you the green light).)
 |What does "human logic" mean ?
 |Anyway: back to what the shell should be doing. You cannot put a ';' \
 |into (( ))
 |as a sequence point, but the manual does say:
 |"Sub-expressions in parentheses are evaluated first and may override the
 |precedence rules above"
 |So use sub-expressions to 'evaluate first' so you should prolly rewrite:
 |(( i += j += i += i ))
 |(( i += (j += (i += i)) ))

Not me!!  Bash does it right for x=++x, where is your sequence
point?  dash for example evaluates the construct also in the way
one would expect (which i would glue to "human logic").
Also, i would argue, you cannot put your finger on ISO C sequence
points and then keep the way bash evaluates integers, this is
comme ci comme ├ža.

But regardless, i still think it is a bug, that i hereby have
reported, army troopers aside.
I _will_ keep my evaluator the way it is, maybe someone should
report a dash bug if she or he thinks otherwise.  I have not
looked at other shells (i would hope those which support the
operator keep human logic (!) happy).

|Der Kragenbaer,                The moon bear,
|der holt sich munter           he cheerfully and one by one
|einen nach dem anderen runter  wa.ks himself off
|(By Robert Gernhardt)

reply via email to

[Prev in Thread] Current Thread [Next in Thread]