[Rd] operation on ‘numsels’ may be undefined

Hervé Pagès hpages at fhcrc.org
Tue Jun 24 00:18:02 CEST 2014


Hi Christian,

On 06/23/2014 11:54 AM, cstrato wrote:
> Dear Romain,
>
> I do not know enough about compilers, but as far as I remember, they
> 'work' from right to left,

Not necessarily. So you should not rely on that. This is what the
(somewhat obscure) warning you see on zin1 is trying to tell you.
Personally I would just do:

     if (arrMask[i] == 1) numsels++;

which is the standard way to implement the "if (some condition)
then increment counter" idiom.

As Kasper mentioned, a similar issue was recently discussed here:

   https://stat.ethz.ch/pipermail/bioc-devel/2014-June/005858.html

Cheers,
H.


> so numsels = ++numsels should not confuse the
> compiler. Anyhow I will change my code to your first suggestion since it
> is more elegant.
>
> Best regards,
> Christian
>
>
> On 6/23/14 7:13 PM, Romain François wrote:
>>
>> 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
>>>>
>>>>
>>
>>
>
> ______________________________________________
> R-devel at r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-devel

-- 
Hervé Pagès

Program in Computational Biology
Division of Public Health Sciences
Fred Hutchinson Cancer Research Center
1100 Fairview Ave. N, M1-B514
P.O. Box 19024
Seattle, WA 98109-1024

E-mail: hpages at fhcrc.org
Phone:  (206) 667-5791
Fax:    (206) 667-1319



More information about the R-devel mailing list