[英]R package fails to run examples on x64 but works on i386 and Debian
我在將軟件包加載到CRAN時遇到了麻煩。 我正在使用R Studio構建我的程序包和一些用於優化的較低級C代碼。 在R Studio中,我可以毫無問題地加載/構建/檢查程序包(我使用的是Mac btw)。 但是,當我生成該程序包並將其提交給CRAN時,將被以下拒絕:
Flavor: r-devel-windows-ix86+x86_64
Check: running examples for arch 'x64', Result: ERROR
在查看為我提供的日志后,這些示例在Debian和Windows i386上運行得很好。
有誰知道為什么我的示例無法在x64上運行但在i386上運行良好?
以下是00check.log中的代碼:
** running examples for arch 'i386' ... OK
** running examples for arch 'x64' ... ERROR
Running examples in 'fastcmprsk-Ex.R' failed
The error most likely occurred in:
.
.
.
> ### ** Examples
>
> library(fastcmprsk)
>
> set.seed(10)
> ftime <- rexp(200)
> fstatus <- sample(0:2, 200, replace = TRUE)
> cov <- matrix(runif(1000), nrow = 200)
> dimnames(cov)[[2]] <- c('x1','x2','x3','x4','x5')
> fit <- fastCrr(Crisk(ftime, fstatus) ~ cov, variance = FALSE)
* DONE
Status: 1 ERROR, 1 NOTE
我被認為是罪魁禍首是fastCrr
函數。 但是,該示例對於arch'i386'(見上文)和Debian似乎運行良好。 我不明白為什么它無法在x64上運行,是否存在我不知道的硬件問題? 我正在調用的函數確實會為優化例程調用C
也許某處有泄漏,但是我仔細檢查並確保我Free
每個Calloc
變量。 我不確定還會發生其他泄漏,或者為什么泄漏只會特定於一個系統而不是其他系統。
希望這可以幫助。
感謝所有查看此內容的人以及您的反饋。
使用wch1/r-debug
鏡像,我已在代碼上運行了UBSAN工具。 來自gcc的人發現了一些東西:
ralf@barra:~$ docker run --rm -it wch1/r-debug
root@9131acbabe1f:/# git clone https://github.com/erickawaguchi/fastcmprsk
root@9131acbabe1f:/# cd fastcmprsk/
root@9131acbabe1f:/fastcmprsk# git checkout developer
root@9131acbabe1f:/fastcmprsk# cd -
root@9131acbabe1f:/# RDsan -e "install.packages(c('doParallel', 'dynpred', 'codetools', 'survival'))"
root@9131acbabe1f:/# RDsan CMD build fastcmprsk
root@9131acbabe1f:/# RDsan CMD check fastcmprsk_1.0.3.tar.gz
[...]
==5515==ERROR: AddressSanitizer: heap-buffer-overflow on address 0x6180002383d0 at pc 0x7ff3b5ad8d3f bp 0x7ffebeb2bb90 sp 0x7ffebeb2bb80
READ of size 4 at 0x6180002383d0 thread T0
#0 0x7ff3b5ad8d3e in ccd_dense /fastcmprsk.Rcheck/00_pkg_src/fastcmprsk/src/denseFit.c:148
實際上,在https://github.com/erickawaguchi/fastcmprsk/blob/319138af6dfe5414608a89dbb168ea1e0ab1a797/src/denseFit.c#L148中,您正在從ici
中讀取數組邊界,因為測試i == (n - 1)
是在測試ici[i + 1] != 1
。 即使我不確定為什么這會導致x64 Windows上的確定性失敗,我還是從這里開始。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.