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++;
}
When I provided some test code and asked the reporter to tell me the compiler
he reported a load of gcc versions which when using -O (above 0) produce
incorrect results.
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?
#include <stdio.h>
#include <ctype.h>
#include <string.h>
main() {
char f[20];
char *cp;
strcpy(f, "abcdefg");
cp = f;
while(*cp != '\0') {
*cp++ = toupper(*cp);
}
printf("%s\n", f);
}
and his results:
Here are my results (gcc version, optimalization, program output):
3.2 -O0 ABCDEFG
3.2 -O1 BCDEFG
3.2 -O2 BCDEFG
3.2 -O3 BCDEFG
3.4 -O0 ABCDEFG
3.4 -O1 BCDEFG
3.4 -O2 BCDEFG
3.4 -O3 BCDEFG
4.1 -O0 ABCDEFG
4.1 -O1 ABCDEFG
4.1 -O2 ABCDEFG
4.1 -O3 ABCDEFG
4.7.1 -O0 ABCDEFG
4.7.1 -O1 ABCDEFG
4.7.1 -O2 ABCDEFG
4.7.1 -O3 ABCDEFG
Martin
--
Martin J. Evans
Easysoft Limited
http://www.easysoft.com