[Rd] operation on ‘numsels’ may be undefined

Romain François romain at r-enthusiasts.com
Mon Jun 23 19:13:45 CEST 2014


Le 23 juin 2014 à 18:28, cstrato <cstrato at aon.at> a écrit :

> Dear Romain,
> 
> Thank you for your suggestions, I like especially the first one.
> 
> However, you did not explain why I have never got this warning message on any compiler, and why only one of the two identical Ubuntu compilers did give this warning message?
> 
> Best regards,
> Christian

I don’t know, but this:

numsels = ++numsels ; 

seems fishy to me, and so it keeps feeling weird with the addition of the ternary operator. 

There is obviously a difference of setup between these two machines, but I don’t have time to sherlock that for you. One of the compilers is getting more careful than the other. Getting warnings you did not get before is a good thing, as it helps you update the code with that new insight. 

Welcome to my world, I’m sometimes thrown all kinds of new warnings from esoteric compilers, all of them have value .

Romain

> On 6/23/14 3:45 PM, Romain François wrote:
>> 
>> Le 23 juin 2014 à 15:20, cstrato <cstrato at aon.at> a écrit :
>> 
>>> Dear all,
>>> 
>>> Since many years the following C++ code does compile on ALL Bioconductor servers (Linux, Windows, Mac) without any warnings:
>>> 
>>>   Int_t numsels = 0;  //number of selected entries
>>>   ...
>>>   for (Int_t i=0; i<size; i++) {
>>>      numsels = (arrMask[i] == 1) ? ++numsels : numsels;
>>>   }//for_i
>> 
>> This is confusing. I would write the loop body like this:
>> 
>> numsels += (arrMask[i] == 1) ;
>> 
>> 
>> or preferably using the STL:
>> 
>> Int_t numsels = std::count( begin(arrMask), end(arrMask), 1 ) ;
>> 
>> or some other variation of this, i.e. perhaps you don’t have a C++11 compiler, so perhaps one of these depending on what is arrMask:
>> 
>> Int_t numsels = std::count( arrMask.begin(), arrMask.end(), 1 ) ;
>> Int_t numsels = std::count( arrMask, arrMask + size, 1 ) ;
>> 
>> Romain
>> 
>>> Even on the recently added release server 'zin2' Linux (Ubuntu 12.04.4 LTS) the above code compiles w/o warnings.
>>> 
>>> However, on the new development server 'zin1' Linux (Ubuntu 12.04.4 LTS) I get suddenly the following warning message:
>>> 
>>> Found the following significant warnings:
>>>  XPSPreProcessing.cxx:3026:56: warning: operation on ‘numsels’ may be undefined [-Wsequence-point]
>>> 
>>> Interestingly, both servers do not only run the same version of Ubuntu, but also the same version of the C++ compiler, i.e. g++ (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3, and use the same flags, see:
>>> http://bioconductor.org/checkResults/2.14/bioc-LATEST/zin2-NodeInfo.html
>>> http://bioconductor.org/checkResults/devel/bioc-LATEST/zin1-NodeInfo.html
>>> 
>>> My question is now, why do I suddenly get the compiler warning?
>>> 
>>> The reason why I ask at R-devel and not Bioc-devel is that it may not only be a Bioc question, since I found the following links:
>>> http://c-faq.com/expr/seqpoints.html
>>> http://stackoverflow.com/questions/16838884/why-i-got-operation-may-be-undefined-in-statement-expression-in-c
>>> 
>>> I am not sure if I understand the meaning, but until now I have never got any warning from any compiler the I have used (including MS Visual C++).
>>> 
>>> Do I really have to replace '++numsels' with 'numsels+1'?
>>> 
>>> Best regards,
>>> Christian
>>> _._._._._._._._._._._._._._._._._._
>>> C.h.r.i.s.t.i.a.n   S.t.r.a.t.o.w.a
>>> V.i.e.n.n.a           A.u.s.t.r.i.a
>>> e.m.a.i.l:        cstrato at aon.at
>>> _._._._._._._._._._._._._._._._._._
>>> 
>>> ______________________________________________
>>> R-devel at r-project.org mailing list
>>> https://stat.ethz.ch/mailman/listinfo/r-devel
>> 
>> 



More information about the R-devel mailing list