抑制 Valgrind 警告

问题描述 投票:0回答:1

一位同事请求帮助在程序中查找难以重现的 SIGSEGV,因此我通过

valgrind
运行它以查找任何内存问题。

不幸的是,我最终得到了这个:

$ valgrind --track-origins=yes sim-server
==128768== 
==128768== More than 10000000 total errors detected.  I'm not reporting any more.
==128768== Final error counts will be inaccurate.  Go fix your program!
==128768== Rerun with --error-limit=no to disable this cutoff.  Note
==128768== that errors may occur in your program without prior warning from
==128768== Valgrind, because errors are no longer being displayed.
==128768==

我能看到的所有内容都来自

libasound.2.0.0
libportaudio.so.2.0.0
,它们都有相同的警告:

Conditional jump or move depends on uninitialized value(s)

示例:

==130835== Conditional jump or move depends on uninitialised value(s)
==130835==    at 0x483865C: malloc (vg_replace_malloc.c:306)
==130835==    by 0x483ADE7: realloc (vg_replace_malloc.c:834)
==130835==    by 0x48A209A: ??? (in /usr/lib/x86_64-linux-gnu/libportaudio.so.2.0.0)
==130835==    by 0x48A251F: ??? (in /usr/lib/x86_64-linux-gnu/libportaudio.so.2.0.0)
==130835==    by 0x48A5944: ??? (in /usr/lib/x86_64-linux-gnu/libportaudio.so.2.0.0)
==130835==    by 0x4878EA6: start_thread (pthread_create.c:477)
==130835==    by 0x4CECA2E: clone (clone.S:95)
==130835==  Uninitialised value was created by a stack allocation
==130835==    at 0x4E626C0: ??? (in /usr/lib/x86_64-linux-gnu/libasound.so.2.0.0)

我对这些库无能为力,我认为它们工作得很好。其中一些甚至是通过

Pa_Initialize()
实现的,这不是一个需要我提前设置任何内容的函数,因此此警告并不指向我对库的使用。

如何在 Valgrind 中抑制源自

Conditional jump or move...
libportaudio.so.2.0.0
警告?

使用这个答案,Valgrind的关于抑制错误的文档和Valgrind的关于编写抑制文件的文档,我想出了这个:

$ cat suppress.val
{                                                                               
  ignore_pa                                                                     
  Memcheck:Cond                                                                 
  obj:/usr/lib/x86_64-linux-gnu/libportaudio.so.2.0.0                           
}
$ valgrind --suppressions=suppress.val --track-origins=yes sim-sound

这解决了很多警告,但上面的

malloc
并没有被抑制。

我也尝试过:

{                                                                               
  ignore_pa_malloc                                                              
  Memcheck:Param                                                                
  malloc                                                                        
  fun:*                                                                         
  obj:/usr/lib/x86_64-linux-gnu/libportaudio.so.2.0.0                           
}  

但这也没有帮助。不只是malloc,来自

memmove
vg_replace_strmem.c
也是罪犯。这些源文件不在我的程序中。

valgrind
1个回答
0
投票
==130835== Conditional jump or move depends on uninitialised value(s)
==130835==    at 0x483865C: malloc (vg_replace_malloc.c:306)

这几乎肯定意味着

malloc
正在以未初始化的大小调用。在我的书中,这是一个非常严重的错误,可能会导致崩溃。

您有什么方法可以获取 libportaudio 和 libasound 的 debuginfo 包或调试版本吗?

© www.soinside.com 2019 - 2024. All rights reserved.