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

brodie gaslam brod|e@g@@|@m @end|ng |rom y@hoo@com
Fri Sep 10 21:53:04 CEST 2021


> 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?

Best,

B.



More information about the R-devel mailing list