当我试图用pclose()打开之前打开的管道时,出现了valgrind错误。错误发生在MacOSX上,但在Linux上没有。请考虑以下示例:

#include <stdlib.h>
#include <stdio.h>

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(OS X 10.6.7,valgrind版本3.6.0)上,我得到以下valgrind错误,除非我删除popen()调用:
==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中打开pclose()表明问题的根源可能在--track-origins调用中。和GCC4.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

关于c - 在Mac OS X上由pclose()引起的Valgrind错误,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6541100/

10-11 23:17
查看更多