看起来您可以修改main() 中的代码,以便将正确的选项传递给 Valgrind。 (请注意,这假设您正在运行 memcheck,这是默认选项,并且您似乎正在从您的 pastebin 运行)。
Valgrind/Memcheck 应报告您已有的库的错误,包括 Obj-C/iOS SDK。要禁止 Memcheck 报告错误,请使用以下命令:
这会自动生成抑制:--gen-suppressions=yes
您还可以/可能想要更深入地了解您不想看到的内容:
添加要考虑的抑制文件:
--suppressions=/path/to/file.supp.
抑制类型(第二)行应具有以下形式:
Memcheck:suppression_type
Memcheck 抑制类型如下:
Value1, Value2, Value4, Value8, Value16,表示使用 1、2、4、8 或 16 字节的值时出现未初始化值错误。
Cond (or its old name, Value0),表示使用未初始化的 CPU 条件代码。
Addr1, Addr2, Addr4, Addr8, Addr16,分别表示在 1、2、4、8 或 16 字节的内存访问期间地址无效。
Jump,表示跳转到无法寻址的位置错误。
Param,表示无效的系统调用参数错误。
Free,表示无效或不匹配的free。
Overlap,表示 memcpy 中的 src / dst 重叠或类似功能。
Leak,表示内存泄漏。
还可以查看suppressing errors in the Valgrind docs 了解更多信息。
请注意,您可以拥有多个抑制文件,所以我只写您自己的,您以后可以随时删除。
但是,您可能想看看为什么会出现这些错误。看起来其中很多都是 SDK,您可能想忽略它们 - 但可能在打开轨道来源(您已经完成)并检查您自己的代码以防万一之后。
未初始化值错误是您被警告未初始化值的地方(duh) - 但是,它仅在您有一个会产生影响的未初始化值时才会这样做,因为未初始化值还有其他用途。
通常,这些是允许传播的,直到您在“不应该”的地方使用它们。然后,只要您实际尝试使用它们,它就会报告这些值。
您已经知道您可以打开--track-origins=<yes|no> (默认为否)以找出它们来自哪里,并且看起来它们确实来自SDK。对于那些不知道的人,--track-origins 真的很有帮助,因为当它关闭时,您只知道未初始化的值正在以“危险”的方式使用,但您不知道未初始化的值来自哪里。
请记住,如果 --undef-value-errors=no 也被使用,Memcheck 将拒绝将此设置为 yes。