[Rd] Spurious warnings in coercion from double/complex/character to raw

Hervé Pagès hp@ge@@on@g|thub @end|ng |rom gm@||@com
Fri Sep 10 23:14:39 CEST 2021



On 10/09/2021 12:53, brodie gaslam wrote:
> 
>> On Friday, September 10, 2021, 03:13:54 PM EDT, Hervé Pagès <hpages.on.github using gmail.com> wrote:
>>
>> Good catch, thanks!
>>
>> Replacing
>>
>>       if(ISNAN(vi) || (tmp = (int) vi) < 0 || tmp > 255) {
>>           tmp = 0;
>>
>>           warn |= WARN_RAW;
>>
>>       }
>>       pa[i] = (Rbyte) tmp;
>>
>> with
>>
>>       if(ISNAN(vi) || vi <= -1.0 || vi >= 256.0)
>>     {
>>           tmp = 0;
>>
>>           warn |= WARN_RAW;
>>
>>       } else {
>>           tmp = (int) vi;
>>       }
>>       pa[i] = (Rbyte) tmp;
>>
>> should address that.
>>
>> FWIW IntegerFromReal() has a similar risk of int overflow
>> (src/main/coerce.c, lines 128-138):
>>
>>
>>     int attribute_hidden
>>
>>     IntegerFromReal(double x, int *warn)
>>
>>     {
>>
>>         if (ISNAN(x))
>>
>>             return NA_INTEGER;
>>
>>         else if (x >= INT_MAX+1. || x <= INT_MIN ) {
>>
>>             *warn |= WARN_INT_NA;
>>
>>             return NA_INTEGER;
>>
>>         }
>>
>>         return (int) x;
>>
>>     }
>>
>>
>>
>> The cast to int will also be an int overflow situation if x is > INT_MAX
>> and < INT_MAX+1 so the risk is small!
> 
> I might be being dense, but it feels this isn't a problem?  Quoting C99
> 6.3.1.4 again (emph added):
> 
>> When a finite value of real floating type is converted to an integer
>> type other than _Bool, **the fractional part is discarded** (i.e., the
>> value is truncated toward zero). If the value of the integral part
>> cannot be represented by the integer type, the behavior is undefined.50)
> 
> Does the "fractional part is discarded" not save us here?

I think it does. Thanks for clarifying and sorry for the false positive!

H.

> 
> Best,
> 
> B.
> 
> 

-- 
Hervé Pagès

Bioconductor Core Team
hpages.on.github using gmail.com



More information about the R-devel mailing list