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

时间:2016-12-26 10:35:54

标签: r unit-testing travis-ci r-package

我正在尝试使用Travis CI上的c ++代码构建一个R包,并通过Throw New WebFaultException(Net.HttpStatusCode.Forbidden) 选项运行R CMD check来检查它与valgrind。在R extensions manual中,它要么提供带有所需选项的--use-valgrind文件,要么将它们设置在环境变量~/.valgrindrc中,但我还没有找到其中任何一个

我创建了一个demo repo here,其中包含一个valcind应该响应的Rcpp函数。

我的VALGRIND_OPTS设置如下:

.travis.yml

我有一个language: r sudo: false cache: packages r_check_args: '--use-valgrind' addons: apt: packages: - valgrind 文件,其中包含以下内容,

.valgrindrc

,并尝试将其放在--leak-check=full --track-origins=yes 和根目录中,但没有一个有效。有人知道如何正确设置这些选项吗?

编辑:here是指向最新travis构建的链接。

3 个答案:

答案 0 :(得分:3)

@joepd给出的解决方案有效但我在简单设置环境变量时发现了(可能)更精简的解决方案。

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

请注意,valgrind仍然建议我们设置--leak-check=full由于某种未知原因,这使我首先想到另一个解决方案。

答案 1 :(得分:1)

根据the docs,文件./.valgrindrc(因此在当前工作目录中,只有在文件~/.valgrindrc不存在时才会读取,并且环境变量$VALGRIND_OPTS没有设定。

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

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

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

答案 2 :(得分:1)

您还可以使用以下脚本来自定义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失败。