暗示是一个记忆问题。我有这些静态分配:
char akdir[400];
char homedir[400];
这在第一个strcpy()上崩溃了:
void setuplibfoo()
{
long ii;
double x;
wordexp_t result;
// This obtains the user's home directory
// --------------------------------------
homedir[0]=0; // in case wordexp fails
switch (wordexp("~/",&result,0))
{
case 0: // Successful. We'll fall into deallocate when done.
{
strcpy(homedir,result.we_wordv[0]); // <<--- CRASH!
strcpy(akdir,homedir);
strcat(akdir,"ak-plugins/");
vs_status(akdir);
}
case WRDE_NOSPACE: // If the error was WRDE_NOSPACE, then
{ // perhaps part of the result was allocated.
wordfree (&result);
}
default: // all other errors do not require deallocation
{
break;
}
}
...额外的代码被剪裁..在崩溃时没有到达那里。
这是我写的一个共享库,它链接到我的应用程序,也是我写的。在这种情况下,它不会走得太远,但如果它开始,那就没问题了。
...我已多次阅读wordexp文档;他们说他们分配新对象,所以你只需设置那个类型并用地址调用它们。切换错误模型正好来自wordexp docs:
http://www.gnu.org/s/libc/manual/html_mono/libc.html#Wordexp-Example
它并不总是崩溃。有时候,不到10.6。从不低于10.5
我正在使用XCode 3.1.1构建调试模式,在OSX 10.5.8下似乎运行正常,我没有看到崩溃 - 在10.6下,它崩溃了......有时候。但总是有同样的例外,并且总是在同一个地方。
谷歌认为,这实际上意味着,分配内存还为时过早。但是我能找到的所有实例都是程序员的内存错误。超支等等。我找不到任何有关分配内存安全的文档。
现在,扩展的路径接近 400个字符。就是这个(它完成了):
/Users/flake/ak-plugins/
和此:
/Users/flake/
......如果没有。
strcpy ...将第二个参数复制到第一个。他们的我的。它的工作原理! 10.5以下。 :/
那么wordexp破了吗? 10.6打破了吗?我可以吗?
这是调试器输出:
0x00013446 <+0049> call 0xc98da <dyld_stub_wordexp>
0x0001344b <+0054> test %eax,%eax
0x0001344d <+0056> je 0x13454 <setuplibfoo+63>
0x0001344f <+0058> jmp 0x134da <setuplibfoo+197>
0x00013454 <+0063> mov -0x1c(%ebp),%eax
0x00013457 <+0066> mov (%eax),%eax
0x00013459 <+0068> mov %eax,0x4(%esp)
0x0001345d <+0072> lea 0xb6cc2(%ebx),%eax
0x00013463 <+0078> mov (%eax),%eax
0x00013465 <+0080> mov %eax,(%esp)
0x00013468 <+0083> call 0xc9898 <dyld_stub_strcpy>
0x0001346d <+0088> lea 0xb6cc2(%ebx),%eax <<--CRASH!
答案 0 :(得分:0)
尝试将homedir设置为0,将“结果”wordexp_t结构设置为零,然后再尝试。我最近使用它,它在Mac和Linux上运行良好。到10.6我想你的意思是Mac?