在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版本中找到。