[Rd] Difference in NA behavior in R-devel running under valgrind

Tomas Kalibera tom@@@k@||ber@ @end|ng |rom gm@||@com
Fri Apr 30 12:31:05 CEST 2021


I confirm it is valgrind behavior, it does not preserve the NaN payload 
when converting 80-bit and 64-bit floating point numbers on Intel (also 
it treats denormals as zero, more information is in comments in valgrind 
source, file guest_generic_x87.c).

The quick-hack patch below can be applied to preserve the payload and 
makes that example, sum(c(1, NA)), return NA on my machine.

Best
Tomas

-- orig/valgrind-3.15.0/VEX/priv/guest_generic_x87.c 2019-04-13 
12:56:21.000000000 +0200
+++ patched/valgrind-3.15.0/VEX/priv/guest_generic_x87.c 2021-04-30 
12:17:44.763195785 +0200
@@ -210,6 +210,10 @@
           f80[6] = f80[5] = f80[4] = f80[3]
                  = f80[2] = f80[1] = f80[0] = 0xFF;
        }
+      f80[0] = f64[0]; /* R hack: copy NaN payload */
+      f80[1] = f64[1];
+      f80[2] = f64[2];
+      f80[3] = f64[3];
        return;
     }

@@ -310,6 +314,11 @@
           f64[6] = 0xF7;
           f64[5] = f64[4] = f64[3] = f64[2] = f64[1] = f64[0] = 0xFF;
        }
+      f64[0] = f80[0]; /* R hack: copy NaN payload */
+      f64[1] = f80[1];
+      f64[2] = f80[2];
+      f64[3] = f80[3];
+
        return;
     }

On 4/30/21 10:02 AM, Tomas Kalibera wrote:
> I can reproduce on my system, running an unoptimized R build (-O0) in 
> valgrind produces NaN (valgrind 3.15.0, gcc 9.3.0 - Ubuntu 
> 20.04/x86_64) for the example, but without valgrind it produces NA.
>
> Valgrind modifies the binary code before running it and this is 
> probably what is causing the different NaN payload propagation in this 
> case. This is not great, it seems to be yet another way how the NA/NaN 
> distinction may become unreliable.
>
> Tomas
>
> On 4/30/21 2:42 AM, brodie gaslam via R-devel wrote:
>> Forgot to mention, my builds were not instrumented for valgrind, and 
>> also:
>>
>> vagrant using vagrant:/vagrant/trunk$ ./bin/R --version
>> R Under development (unstable) (2021-04-27 r80232) -- "Unsuffered 
>> Consequences"
>> Copyright (C) 2021 The R Foundation for Statistical Computing
>> Platform: x86_64-pc-linux-gnu (64-bit)
>>
>>
>>   On Thursday, April 29, 2021, 8:40:21 PM EDT, brodie gaslam via 
>> R-devel <r-devel using r-project.org> wrote:
>>
>>
>>> On Thursday, April 29, 2021, 6:35:16 PM EDT, Winston Chang 
>>> <winstonchang1 using gmail.com> wrote:
>>> Just to be clear, the RD binary that Jon used was NOT compiled with
>>> Valgrind level 2 instrumentation. In his example, however, he did 
>>> run it
>>> with valgrind, as in:
>>>
>>> # RD -d valgrind --quiet -e "sum(c(1, NA))"
>>> ...
>>>> sum(c(1, NA))
>>> [1] NaN
>>>
>>> `RD` in that Docker image is a standard build of R-devel. The Docker
>>> image does include a build of R-devel with valgrind level 2
>>> instrumentation, called `RDvalgrind`. It exhibits the same NaN behavior
>>> when run with `-d valgrind`, but when run without `-d valgrind` it
>>> returns NA.
>>>
>>> # RDvalgrind -d valgrind --quiet -e "sum(c(1, NA))"
>>>> sum(c(1, NA))
>>> [1] NaN
>>>
>>> # RDvalgrind --quiet -e "sum(c(1, NA))"
>>>> sum(c(1, NA))
>>> [1] NA
>>>
>>> In short `RDvalgrind` behaves the same as `RD`. However, adding `-d
>>> valgrind` to either one causes it to return NaN.
>>>
>>> -Winston
>> Thanks for the clarification.
>>
>> Using the same revision in the e-mail I get the reported issue under 
>> -O0,
>> but not under -O2.  It looks like r-debug builds with -O0, and 
>> presumably
>> the release debian version is -O2 which is usually the default? I'm
>> certainly no expert in this area but it seems like it could be an
>> optimization level rather than a release vs devel issue?
>>
>> This is what I see:
>>
>> gcc version 10.1.0 (Ubuntu 10.1.0-2ubuntu1~18.04)
>>
>>      CC="gcc-10"
>>      CFLAGS="-g -O0 -Wall -pedantic -Wextra -std=gnu99"
>>
>>      vagrant using vagrant:/vagrant/trunk$ ./bin/R -d valgrind --vanilla 
>> --quiet -e "sum(c(1,NA))"
>>      ==9020== Memcheck, a memory error detector
>>      ==9020== Copyright (C) 2002-2017, and GNU GPL'd, by Julian 
>> Seward et al.
>>      ==9020== Using Valgrind-3.13.0 and LibVEX; rerun with -h for 
>> copyright info
>>      ==9020== Command: /vagrant/trunk/bin/exec/R --vanilla --quiet -e 
>> sum(c(1,NA))
>>      ==9020==
>>      > sum(c(1,NA))
>>      [1] NaN
>>
>> And then:
>>
>>      CC="gcc-10"
>>      CFLAGS="-g -O2 -Wall -pedantic -Wextra -std=gnu99"
>>
>>      vagrant using vagrant:/vagrant/trunk$ ./bin/R -d valgrind --vanilla 
>> --quiet -e "sum(c(1,NA))"
>>      ==32751== Memcheck, a memory error detector
>>      ==32751== Copyright (C) 2002-2017, and GNU GPL'd, by Julian 
>> Seward et al.
>>      ==32751== Using Valgrind-3.13.0 and LibVEX; rerun with -h for 
>> copyright info
>>      ==32751== Command: /vagrant/trunk/bin/exec/R --vanilla --quiet 
>> -e sum(c(1,NA))
>>      ==32751==
>>      > sum(c(1,NA))
>>      [1] NA
>>
>> Sadly I did not think to run the -O0 version without valgrind.
>>
>>
>> Best,
>>
>> B.
>>
>> ______________________________________________
>> R-devel using r-project.org mailing list
>> https://stat.ethz.ch/mailman/listinfo/r-devel
>>
>> ______________________________________________
>> R-devel using r-project.org mailing list
>> https://stat.ethz.ch/mailman/listinfo/r-devel



More information about the R-devel mailing list