在 Travis 上为 R 包指定 valgrind 选项 CI

Specify valgrind options to R package on Travis CI

我正在尝试在 Travis CI 上用 C++ 代码构建一个 R 包,并通过 运行 R CMD check--use-valgrind 选项用 valgrind 检查它。在 R extensions manual 中,它说要么提供一个 ~/.valgrindrc 文件和所需的选项,要么在环境变量 VALGRIND_OPTS 中设置它们,但我无法弄清楚其中任何一个。

我创建了一个演示存储库 here,其中包含一个 valgrind 应该响应的 Rcpp 函数。

我的 .travis.yml 设置如下所示:

language: r
sudo: false
cache: packages

r_check_args: '--use-valgrind'

addons:
  apt:
    packages:
      - valgrind

我有一个 .valgrindrc 文件,其中包含以下内容,

--leak-check=full
--track-origins=yes

,并尝试将它放在 ./inst/ 和根目录中,但 none 成功了。有人知道如何正确设置这些选项吗?

编辑:here 是 link 到最新的 travis 版本。

根据the docs,文件./.valgrindrc(所以在当前工作目录中,只有当文件~/.valgrindrc不存在,并且环境变量$VALGRIND_OPTS 未设置。

不确定是什么情况,但您可能想要执行以下操作:

before_install:
  - "head ~/.valgrindrc || echo '~/.valgrindrc does not exist'"
  - echo VALGRIND_OPTS: $VALGRIND_OPTS
  - cat ./valgrindrc >> ~/.valgrindrc

前两个用于诊断目的。最后一个可能会解决问题(它将您的配置附加到全局配置)。如果它不起作用,您可能会对正在发生的事情有更多的了解。

@joepd 给出的解决方案有效,但我发现了一个(可能)更精简的解决方案,只需设置环境变量即可。

env:
  - VALGRIND_OPTS='--leak-check=full --track-origins=yes'

请注意,出于某些未知原因,valgrind 仍然建议我们设置 --leak-check=full,这就是让我首先寻找其他解决方案的原因。

您还可以使用以下脚本自定义 valgrind 检查,并标记哪种输出会导致 travis 失败。只需制作某种 valgrind-script.R 来加载和测试包功能,然后将其和以下内容放入 tests 文件夹中。 (valgrind也需要和.travis.yml一起安装。)

vg_check <- function ()
{
    vg <- system2 (command = 'R',
                   args = c ('-d "valgrind --tool=memcheck --leak-check=full"',
                             '-f valgrind-script.R'),
                   stdout = TRUE, stderr = TRUE)

    lost <- NULL
    types <- c ("definitely lost", "indirectly lost", "possibly lost")
    for (ty in types)
    {
        lost_type <- which (grepl (ty, vg))
        n <- regmatches(vg [lost_type], gregexpr("[[:digit:]]+", vg [lost_type]))
        lost <- c (lost, as.numeric (n [[1]] [2:3]))
    }
    if (any (lost > 0))
        stop ("valgrind memory leaks detected!")

    if (attr (vg, "status") != 0)
        stop ("valgrind error")
}

if (identical (Sys.getenv ("TRAVIS"), "true"))
{
    vg_check ()
}

这使用 memcheck,但您可以自定义它以使用您喜欢的 valgrind 工具,并将任何类型的输出转换为 travis 失败。