[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