Date: Mon, 8 Jul 2013 21:40:42 -0700 From: Tim Kientzle <tim@kientzle.com> To: dt71@gmx.com Cc: freebsd-current@freebsd.org Subject: Re: another -Wunsequenced topic Message-ID: <6AC1186D-3D9C-4B7A-B5E4-4EA9CB120517@kientzle.com> In-Reply-To: <51DAA5FE.4040505@gmx.com> References: <51CEEC34.2010308@gmx.com> <51D03D27.3020100@gmx.com> <51DAA5FE.4040505@gmx.com>
next in thread | previous in thread | raw e-mail | index | archive | help
On Jul 8, 2013, at 4:43 AM, dt71@gmx.com wrote:
> Well, this turned out to be a semi-false alarm. A week ago, for a =
short time, there was a bug in Clang. There is no undefined behavior in
>=20
> ptr =3D func(++ptr);,
No, there is not.
However, this does have an implicit redundant store,
so changing it to
ptr =3D func(ptr + 1);
is still a good idea, just not for the reason Clang was claiming.
> partially because a function call introduces a sequence point in C, =
but Clang did not respect this at that time. However,
>=20
> x =3D func1(++ptr) + func2(++ptr);
>=20
> is compiler-dependent.
Code like this is badly broken. The order of evaluation
here can even change across compiler versions (optimizers
use a variety of criteria to reorganize code, which can easily
change from version to version).
> Additionally, if func() turns out to be a macro, rather than a native =
function, then undefined behavior (due to unsequencedness) occurs.
Replacing functions with macros is a common way to
optimize code, which is yet another reason the idiom
above should generally be avoided.
> So in the end, Clang has accidentally pointed me to an irrelated bug, =
and induced some unnecessary code changes.
Not strictly necessary for correctness, but still good changes for the =
most part.
Tim
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?6AC1186D-3D9C-4B7A-B5E4-4EA9CB120517>
