当我试图用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/