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

Dan Tenenbaum dtenenba at fhcrc.org
Thu Jun 12 16:28:02 CEST 2014


Hi Robert,

----- Original Message -----
> From: "Robert Castelo" <robert.castelo at upf.edu>
> To: bioc-devel at r-project.org
> Sent: Thursday, June 12, 2014 5:45:28 AM
> Subject: [Bioc-devel] evaluation of C post-increments changed in GCC 4.8.2
> 
> hi,
> 
> 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.
> 
> =======test.c========
> #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:
> 

Thanks for figuring this out and sharing it.

Note that on the build machines, the compiler used on Mavericks is not gcc but clang.
More info here:

http://www.bioconductor.org/checkResults/2.14/bioc-LATEST/morelia-NodeInfo.html
http://www.bioconductor.org/checkResults/3.0/bioc-LATEST/oaxaca-NodeInfo.html

Dan

> 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,
> 
> robert.
> 
> _______________________________________________
> Bioc-devel at r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/bioc-devel
>



More information about the Bioc-devel mailing list