On Tue, Sep 4, 2012 at 3:40 PM, Martin J. Evans
<martin.ev...@easysoft.com> wrote:
> I recently received an rt (https://rt.cpan.org/Ticket/Display.html?id=79190)
> saying some code in DBD::ODBC was wrong and a patch to fix it. The code was:
>
>    while (*cp != '\0') {
>       *cp++ = toupper(*cp);
>    }
>
> and the fix (which shouldn't be required as the above code is fine) was:
>
>    while (*cp != '\0') {
>       *cp = toupper(*cp);
>       cp++;
>    }

The order of execution is undefined if you read a variable and assign
to it in the same (sub)statement. The compiler is allowed to read the
*cp on the right both before the cp++, as the only sequence point is
the semicolon at the end.

The patch as offered does the correct and safe thing of splitting it
up in two statement.

> The test code and his results are below. I can obviously avoid this issue
> with a simple change to the code but how many other places might this occur?
> Do I ignore this (as the reporter is happy to use a newer working compiler)
> or do I somehow check for a broken compiler and abort the Makefile? Has
> anyone else come across something like this and what did they do?

You fix it. GCC will actually want you against this if you enable
-Wall/-Wsequence-point

Leon

Reply via email to