【问题标题】:How to suppress valgrind warnings by the origin of the uninitialized values?如何通过未初始化值的来源来抑制 valgrind 警告?
【发布时间】:2013-07-24 09:25:27
【问题描述】:

Valgrind 将使用 track-origins=yes 选项告诉您未初始化值的来源。

我试图抑制这些警告,但问题是基于未初始化值的数据可能会传播到任何地方,也会在其他地方引起警告。

解决方案将通过未初始化数据的来源进行抑制。我该怎么做?是否可以?似乎抑制文件仅过滤堆栈跟踪。

我想要这个的原因是,OpenSSL 通过故意使用未初始化的值来增强随机性,并且我想用 valgrind 测试发布版本(所以 -DPURIFY 不是一个选项)。

【问题讨论】:

  • 我正在寻找完全相同的东西,但我怀疑这不是 Valgrind 支持的东西,也不太可能支持。这种抑制只适用于track-origins=yes;没有它,压制将毫无用处。不过,我很高兴被证明是错误的!

标签: valgrind


【解决方案1】:

我对您的问题的初步解读是,您可能可以禁用所有未初始化的值错误,在这种情况下,--undef-value-errors=no 可以解决问题。

如果您正在寻找零碎的东西,一些仓促的测试似乎表明使用--gen-suppressions=yes,然后在摆弄我的 openssl 二进制文件时为相关输出回答 y 并将它们放入抑制文件中对我有用。

此外,您可能会发现How do you tell Valgrind to completely suppress a particular .so file? 的答案很有用。

【讨论】:

  • 不,不想抑制未初始化的值,因为这样的错误可能出现在我的程序中...我希望 valgrind 在未初始化的值来自特定函数时不显示错误。
【解决方案2】:

解决方案将通过未初始化数据的来源进行抑制。我该怎么做?是否可以?似乎抑制文件仅过滤堆栈跟踪。

我在使用 OpenSSL 时遇到了同样的问题。根据 Valgrind 邮件列表上的 Tom Hughes 的说法,这是不可能的。见Frame-level wildcard not matching in suppression rule?

在我的例子中,我试图使用帧级通配符来抑制RAND_init_fips(问题的 OpenSSL FIPS 版本)触及的内存上的发现。这确实工作,虽然我们希望它工作:

{
   RAND_init_fips_1
   Memcheck:Cond
   ...
   fun:RAND_init_fips
   ...
}

{
   RAND_init_fips_2
   Memcheck:Value8
   ...
   fun:RAND_init_fips
   ...
}

{
   RAND_init_fips_3
   Memcheck:Value4
   ...
   fun:RAND_init_fips
   ...
}

【讨论】:

    【解决方案3】:

    尝试将其添加到抑制文件中。

    {
       cond
       Memcheck:Cond
       ...
       fun:*
       ...
    }
    {
       value8
       Memcheck:Value8
       ...
       fun:*
       ...
    }
    
    {
       value4
       Memcheck:Value4
       ...
       fun:*
       ...
    }
    
    

    例如,如果您的可执行文件是a.out,则使用内容创建./val.supp 文件并运行valgrind --suppressions=./val.supp ./a.out

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-01-02
      • 2012-04-17
      • 1970-01-01
      • 1970-01-01
      • 2018-06-15
      • 1970-01-01
      • 2012-06-20
      相关资源
      最近更新 更多