在Mac OS X上由pclose()引起的Valgrind错误

尝试pclose()之前用popen()打开的管道时,我遇到了valgrind错误。 错误发生在Mac OS X上,但不发生在Linux上。 请考虑以下示例:

 #include  #include  int main() { FILE *fp; char buf[4096]; if (!(fp = popen("ls", "r"))) exit(-1); while (fscanf(fp, "%s", buf) == 1) printf("%s\n", buf); pclose(fp); return 0; } 

我在Mac上得到以下valgrind错误(OS X 10.6.7,valgrind版本3.6.0),除非我删除了pclose()调用:

 ==21455== Conditional jump or move depends on uninitialised value(s) ==21455== at 0xB1992: pclose (in /usr/lib/libSystem.B.dylib) ==21455== by 0x1F16: main (in ./a.out) ==21455== ==21455== Syscall param wait4(pid) contains uninitialised byte(s) ==21455== at 0x504FA: wait4 (in /usr/lib/libSystem.B.dylib) ==21455== by 0x1F16: main (in ./a.out) 

但是,我在使用valgrind版本3.5.0的Linux系统上没有任何错误。

关于什么可能导致Mac上的错误的任何想法?

更新

在valgrind中启用--track-origins origin会显示问题的根源可能在popen()调用中。 与gcc 4.2.1和4.5.3一样。

 ==4425== Conditional jump or move depends on uninitialised value(s) ==4425== at 0xB1992: pclose (in /usr/lib/libSystem.B.dylib) ==4425== by 0x1F18: main (in ./a.out) ==4425== Uninitialised value was created by a stack allocation ==4425== at 0xB14C5: popen$UNIX2003 (in /usr/lib/libSystem.B.dylib) ==4425== ==4425== Syscall param wait4(pid) contains uninitialised byte(s) ==4425== at 0x504FA: wait4 (in /usr/lib/libSystem.B.dylib) ==4425== by 0x1F18: main (in ./a.out) ==4425== Uninitialised value was created by a stack allocation ==4425== at 0xB14C5: popen$UNIX2003 (in /usr/lib/libSystem.B.dylib) 

系统库将未初始化的字节传递给系统调用是很常见的。 条件跳转依赖于未初始化的值并不常见,但确实发生了(我的Linux版本中的glibc-2.X.supp在glibc中包含8个抑制)。

因为无论如何你都无法对这些错误做任何事情,你应该压制它们。 请参阅Valgrind文档中的--gen-suppressions

报告的问题似乎是系统库的内部问题,而不是代码中的问题。

我也没有使用MacOS X 10.6.8,Valgrind 3.6.0以及(Apple的)GCC 4.2.1或(我的)GCC 4.6.0的错误。 我从你的代码中得到编译警告(显示4.6.0) – 实际上,我’make’运行命令,makefile包含所有那些-Wxxx参数:

 $ gcc -g -std=c99 -Wall -Wextra -Wmissing-prototypes -Wstrict-prototypes -Wold-style-definition vg.c -o vg vg.c:4:5: warning: function declaration isn't a prototype [-Wstrict-prototypes] vg.c: In function 'main': vg.c:4:5: warning: old-style function definition [-Wold-style-definition] $ valgrind vg ==40593== Memcheck, a memory error detector ==40593== Copyright (C) 2002-2010, and GNU GPL'd, by Julian Seward et al. ==40593== Using Valgrind-3.6.0 and LibVEX; rerun with -h for copyright info ==40593== Command: vg ==40593== vg vg.c vg.dSYM ==40593== ==40593== HEAP SUMMARY: ==40593== in use at exit: 4,184 bytes in 2 blocks ==40593== total heap usage: 6 allocs, 4 frees, 26,848 bytes allocated ==40593== ==40593== LEAK SUMMARY: ==40593== definitely lost: 0 bytes in 0 blocks ==40593== indirectly lost: 0 bytes in 0 blocks ==40593== possibly lost: 0 bytes in 0 blocks ==40593== still reachable: 4,184 bytes in 2 blocks ==40593== suppressed: 0 bytes in 0 blocks ==40593== Rerun with --leak-check=full to see details of leaked memory ==40593== ==40593== For counts of detected and suppressed errors, rerun with: -v ==40593== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0) $ cc --version i686-apple-darwin10-llvm-gcc-4.2 (GCC) 4.2.1 (Based on Apple Inc. build 5658) (LLVM build 2335.9) Copyright (C) 2007 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. $ gcc --version gcc (GCC) 4.6.0 Copyright (C) 2011 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. $ valgrind --version valgrind-3.6.0 Localhost JL: uname -a Darwin localhost 10.8.0 Darwin Kernel Version 10.8.0: Tue Jun 7 16:33:36 PDT 2011; root:xnu-1504.15.3~1/RELEASE_I386 i386 $ otool -L /usr/lib/libSystem.B.dylib /usr/lib/libSystem.B.dylib: /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 125.2.11) /usr/lib/system/libmathCommon.A.dylib (compatibility version 1.0.0, current version 315.0.0) 

当使用-v --gen-suppressions=yes运行时, valgrind报告更多信息,但仍然没有抑制错误。

最新的Valgrind SVN源中出现此错误。 Valgrind中的许多内部错误已经解决,以及已知的Apple系统库错误被抑制。

请注意,这是在OS X 10.10.4上运行的

 $ ./vg-in-place ../../test ==55558== Memcheck, a memory error detector ==55558== Copyright (C) 2002-2013, and GNU GPL'd, by Julian Seward et al. ==55558== Using Valgrind-3.11.0.SVN and LibVEX; rerun with -h for copyright info ==55558== Command: ../../test ==55558== --55558-- ../../test: --55558-- dSYM directory is missing; consider using --dsymutil=yes AUTHORS COPYING COPYING.DOCS Makefile ... vg-in-place xfree-3.supp xfree-4.supp ==55558== ==55558== HEAP SUMMARY: ==55558== in use at exit: 39,331 bytes in 419 blocks ==55558== total heap usage: 523 allocs, 104 frees, 68,971 bytes allocated ==55558== ==55558== LEAK SUMMARY: ==55558== definitely lost: 0 bytes in 0 blocks ==55558== indirectly lost: 0 bytes in 0 blocks ==55558== possibly lost: 0 bytes in 0 blocks ==55558== still reachable: 0 bytes in 0 blocks ==55558== suppressed: 39,331 bytes in 419 blocks ==55558== ==55558== For counts of detected and suppressed errors, rerun with: -v ==55558== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0) $ ./vg-in-place --version valgrind-3.11.0.SVN