[Vm-dev] [OpenSmalltalk/opensmalltalk-vm] Undefined evaluation order in C generated code (in primitiveSetOrHasIdentityHash) (#596)

Nicolas Cellier notifications at github.com
Fri Sep 17 13:31:09 UTC 2021


Note that there is another such warning coming from here:
https://github.com/OpenSmalltalk/opensmalltalk-vm/blob/926ec66c11ba4fbabb772eb63303c347c671d89d/platforms/win32/plugins/SoundPlugin/sqWin32Sound.c#L837

I thought that the warning could be abusive see https://stackoverflow.com/questions/69223499/does-the-following-pre-increment-expression-really-result-in-unsequenced-modific but it is not!
We could find a compiler that would output `bufferIndex == 2` and still comply with the standard.

The funny thing is that the same construct is now well defined in recent C++11 and later, where assignment has become a sequence point. You C guys are running crazy!

Anyway, in doubt, and in order to avoid future reviewing cost of warnings I suggest a simple rewrite.
My understanding is that we want to flip/flop (double buffer) but we should write either a simple

    playBufferIndex ^= 1;

or

    playBufferIndex = 1 - playBufferIndex ;

or

    playBufferIndex  = (playBufferIndex + 1) & 1;

if we want to deal with not properly initialized `playBufferIndex` (not the case in current code, there is proper initialization of the variable).

-- 
You are receiving this because you are subscribed to this thread.
Reply to this email directly or view it on GitHub:
https://github.com/OpenSmalltalk/opensmalltalk-vm/issues/596#issuecomment-921799421
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.squeakfoundation.org/pipermail/vm-dev/attachments/20210917/c75b1ac2/attachment.html>


More information about the Vm-dev mailing list