Valgrind报告了一个非常简单的C程序的错误

我正在从Learn C The Hard Way学习C语言。 我正在练习6 ,虽然我可以使它工作,但valgrind会报告很多错误。

这是从文件ex6.c删除的最小程序:

 #include  int main(int argc, char *argv[]) { char initial = 'A'; float power = 2.345f; printf("Character is %c.\n", initial); printf("You have %f levels of power.\n", power); return 0; } 

Makefile内容只是CFLAGS=-Wall -g

我使用$ make ex6编译程序(没有编译器警告或错误)。 使用$ ./ex6执行会产生预期的输出。

当我用$ valgrind ./ex6运行程序时,我得到的错误是我无法解决的。 这是完整的输出:

 ==69691== Memcheck, a memory error detector ==69691== Copyright (C) 2002-2013, and GNU GPL'd, by Julian Seward et al. ==69691== Using Valgrind-3.11.0.SVN and LibVEX; rerun with -h for copyright info ==69691== Command: ./ex6 ==69691== --69691-- UNKNOWN mach_msg unhandled MACH_SEND_TRAILER option --69691-- UNKNOWN mach_msg unhandled MACH_SEND_TRAILER option (repeated 2 times) --69691-- UNKNOWN mach_msg unhandled MACH_SEND_TRAILER option (repeated 4 times) ==69691== Conditional jump or move depends on uninitialised value(s) ==69691== at 0x1003FBC3F: _platform_memchr$VARIANT$Haswell (in /usr/lib/system/libsystem_platform.dylib) ==69691== by 0x1001EFBB6: __sfvwrite (in /usr/lib/system/libsystem_c.dylib) ==69691== by 0x1001FA005: __vfprintf (in /usr/lib/system/libsystem_c.dylib) ==69691== by 0x10021F9CE: __v2printf (in /usr/lib/system/libsystem_c.dylib) ==69691== by 0x10021FCA0: __xvprintf (in /usr/lib/system/libsystem_c.dylib) ==69691== by 0x1001F5B91: vfprintf_l (in /usr/lib/system/libsystem_c.dylib) ==69691== by 0x1001F39F7: printf (in /usr/lib/system/libsystem_c.dylib) ==69691== by 0x100000F1B: main (ex6.c:8) ==69691== Character is A. ==69691== Invalid read of size 32 ==69691== at 0x1003FBC1D: _platform_memchr$VARIANT$Haswell (in /usr/lib/system/libsystem_platform.dylib) ==69691== by 0x1001EFBB6: __sfvwrite (in /usr/lib/system/libsystem_c.dylib) ==69691== by 0x1001FA005: __vfprintf (in /usr/lib/system/libsystem_c.dylib) ==69691== by 0x10021F9CE: __v2printf (in /usr/lib/system/libsystem_c.dylib) ==69691== by 0x10021FCA0: __xvprintf (in /usr/lib/system/libsystem_c.dylib) ==69691== by 0x1001F5B91: vfprintf_l (in /usr/lib/system/libsystem_c.dylib) ==69691== by 0x1001F39F7: printf (in /usr/lib/system/libsystem_c.dylib) ==69691== by 0x100000F31: main (ex6.c:9) ==69691== Address 0x100809680 is 32 bytes before a block of size 32 in arena "client" ==69691== You have 2.345000 levels of power. ==69691== ==69691== HEAP SUMMARY: ==69691== in use at exit: 39,365 bytes in 429 blocks ==69691== total heap usage: 510 allocs, 81 frees, 45,509 bytes allocated ==69691== ==69691== LEAK SUMMARY: ==69691== definitely lost: 16 bytes in 1 blocks ==69691== indirectly lost: 0 bytes in 0 blocks ==69691== possibly lost: 13,090 bytes in 117 blocks ==69691== still reachable: 26,259 bytes in 311 blocks ==69691== suppressed: 0 bytes in 0 blocks ==69691== Rerun with --leak-check=full to see details of leaked memory ==69691== ==69691== For counts of detected and suppressed errors, rerun with: -v ==69691== Use --track-origins=yes to see where uninitialised values come from ==69691== ERROR SUMMARY: 5 errors from 2 contexts (suppressed: 0 from 0) 

我在OS X优胜美地。 使用此命令$ brew install valgrind --HEAD通过$ brew install valgrind --HEAD

那么,有谁知道这里的问题是什么? 如何修复valgrind错误?

如果您通过Valgrind运行的程序正是您在问题中发布的程序,那么它显然没有任何内存泄漏。 事实上,你甚至不用自己的malloc / free!

在我看来,这些是Valgrind在OS X上检测到的虚假错误/误报(仅限!),类似于我前一段时间发生的事情 。

如果您可以访问其他操作系统,例如Linux机器,请尝试使用该系统上的Valgrind分析程序。

编辑:我自己没有尝试过,因为我现在无法访问Mac,但你应该尝试M Oehm建议的内容: 尝试使用其他SO问题中提到的 supressions 文件 。

对于Darwin 14.3.0(Mac OS X 10.10.2),使用Valgrind r14960 with VEX r3124 r3124以及Xcode 6.3的Valgrind r15088修复了此问题。

如果您正在使用Macports(在撰写本文时), sudo port install valgrind-devel将为您Valgrind r14960 with VEX r3093

这是我Valgrind r14960 with VEX r3124安装Valgrind r14960 with VEX r3124构建脚本:

 #! /usr/bin/env bash mkdir -p buildvalgrind cd buildvalgrind svn co svn://svn.valgrind.org/valgrind/trunk/@14960 valgrind cd valgrind ./autogen.sh ./configure --prefix=/usr/local make && sudo make install # check that we have our valgrind installed /usr/local/bin/valgrind --version 

(参考: http : //calvinx.com/2015/04/10/valgrind-on-mac-os-x-10-10-yosemite/ )

我的macports-installed valgrind位于/opt/local/bin/valgrind

如果我现在跑

/opt/local/bin/valgrind --leak-check=yes --suppressions=`pwd`/objc.supp ./ex6

我将得到与您上面描述的完全相同的错误。 (在这里使用我的objc.supp文件https://gist.github.com/calvinchengx/0b1d45f67be9fdca205b )

但是,如果我跑

/usr/local/bin/valgrind --leak-check=yes --suppressions=`pwd`/objc.supp ./ex6

一切都按预期工作,我没有出现系统级内存泄漏错误。

从这个主题来看,我认为valgrind不能保证在您的平台上给出正确的结果。 如果可以,请在其他平台上尝试此代码。

罪魁祸首是在valgrid本身或在你的系统的printf实现中,这两者对你来说都是不切实际的。

Rerun with --leak-check=full to see details of leaked memory. 这应该会为您提供有关您遇到的泄漏的更多信息。 如果没有任何帮助,您可以创建一个抑制文件来阻止显示错误。