[Bioc-devel] evaluation of C post-increments changed in GCC 4.8.2

Robert Castelo robert.castelo at upf.edu
Thu Jun 12 14:45:28 CEST 2014


this is just a warning to developers who may have C code in their packages.

today i fixed a problem in the C code of the package VariantFiltering 
which can be reproduced with the following toy example.

#include <stdio.h>
#include <ctype.h>

int main(void) {
   char msg[] = "Hello World!";
   char* p=msg;

   printf("%s\n", msg);
   while ((*p++=tolower(*p)));
     printf("%s\n", msg);

   return 0;

after compiling this program stored as 'test.c' with the GCC compiler:

$ gcc -o test ./test.c

its execution shows the following output,

$ ./test
Hello World!
hello world!

when GCC has version 4.6.3 or lower. However, if you try to compile it 
with GCC version 4.8.2 (haven't tried any version > 4.6.3 and < 4.8.2) 
you get the following different output:

Hello World!
ello world!

my interpretation of this change, and probably the C gurus in the list 
can clear up this point, is that the evaluation of post-increments 
(i.e., x++, i++, p++, etc.) in C has changed the way it was done in GCC 
4.8.2 (and maybe even in earlier versions although not earlier than 4.6.3).

if i change the line that contains the post-increment 'p++' to the 
following one:

   while ((*p=tolower(*p))) p++;

then it works again as i expected with GCC 4.8.2.

so, if you have C code in your package you might want to inspect all 
your post-increments. actually, if you compile the C code with 
-Wunsequenced the gcc compiler will warn you about this potential problem.

see for instance (before the fix i sent gets through the build) the 
CHECK report of VariantFiltering for Mac OS X Snow Leopard and Mavericks 
which seem to use these two different flavors of GCC. While with Snow 
Leopard there is no apparent problem, in Maverics the installed version 
of GCC reports the following warnings:

Found the following significant warnings:
   methods-WeightMatrix.c:256:19: warning: unsequenced modification and 
access to 'q' [-Wunsequenced]
   methods-WeightMatrix.c:638:17: warning: unsequenced modification and 
access to 'q' [-Wunsequenced]

those lines contain the kind of use of post-increment i showed above and 
are the ones i had to fix.

greetings everyone,


More information about the Bioc-devel mailing list