在OSX 10.9.5上的libc中的wordexp是否已泄漏?

OSX wordexp上的wordexp是否已知泄漏内存? 如果没有,我的代码有什么问题?

在我自己的运行OSX 10.10.5的本地机器上,我通过Valgrind运行我的代码并且没有丢失的字节

我的Ubuntu Linux机器上也没有泄漏

但是,当我在使用OSX 10.9.5的 travis-ci帐户上启用valgrind检查时,我突然从wordexp内部分配的内存中泄漏,即使我使用wordfree释放它,因为手册页描述:

 ==8968== LEAK SUMMARY: ==8968== definitely lost: 1,024 bytes in 1 blocks ==8968== indirectly lost: 0 bytes in 0 blocks ==8968== possibly lost: 0 bytes in 0 blocks 

OSX 10.9.5 uname输出:

 Darwin 13.4.0 Darwin Kernel Version 13.4.0: Sun Aug 17 19:50:11 PDT 2014; root:xnu-2422.115.4~1/RELEASE_X86_64 x86_64 

OSX 10.9.5 sw_vers输出:

 ProductName: Mac OS X ProductVersion: 10.9.5 BuildVersion: 13F34 

OSX 10.9.5 libc版本1197.1.1 otool -L /usr/lib/libSystem.dylib

 /usr/lib/libSystem.dylib: /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1197.1.1) 

OSX 10.10.5 libc版本1213.0.0

 /usr/lib/libSystem.dylib: /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1213.0.0) 

相关代码(如果编译,请使用下面完整代码的链接): https : //github.com/JoakimSoderberg/wordexp_test

 static void xfree(void *p) { void **pp; assert(p); pp = (void **)p; if (*pp) { free(*pp); *pp = NULL; } } char **test_wordexp(const char *cmdline, int *argc) { char **argv = NULL; size_t i; int ret; wordexp_t p; memset(&p, 0, sizeof(p)); // Note! This expands shell variables. if ((ret = wordexp(cmdline, &p, 0))) { fprintf(stderr, "wordexp error %d: '%s'\n", ret, cmdline); return NULL; } *argc = p.we_wordc; if (!(argv = calloc(*argc, sizeof(char *)))) { fprintf(stderr, "Out of memory!\n"); goto fail; } for (i = 0; i < p.we_wordc; i++) { if (!(argv[i] = strdup(p.we_wordv[i]))) { fprintf(stderr, "Out of memory!\n"); goto fail; } } wordfree(&p); return argv; fail: wordfree(&p); if (argv) { for (i = 0; i < (size_t)*argc; i++) { xfree(&argv[i]); } free(argv); } return NULL; } 

完整代码: https : //github.com/JoakimSoderberg/wordexp_test

Travis工作失败的OSX但成功的Linux:

https://travis-ci.org/JoakimSoderberg/wordexp_test/builds/83194932

具有泄漏错误的OSX Travis作业的确切行:

https://travis-ci.org/JoakimSoderberg/wordexp_test/jobs/83194937#L78

在OSX上已知 wordexp在其实现中使用了Perl。 但显然已不复存在了。

  • Perl版本
  • 新的verison

此外,我没有找到确切的源代码链接,我知道在上面提到的涉及的libc版本中找到。