【问题标题】:wordexp followed by strcpy = EXC_BAD_ACCESS + sharedlibrary apply-load-rules-allwordexp 后跟 strcpy = EXC_BAD_ACCESS + sharedlibrary apply-load-rules-all
【发布时间】:2011-03-20 08:04:29
【问题描述】:

暗示是内存问题。我对这些有静态分配:

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 文档:

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 下,它有时会崩溃。但总是有同样的例外,而且总是在同一个地方。

Google 认为这实际上意味着,不知何故,现在分配内存还为时过早。但我能找到的所有实例都是程序员的内存错误。溢出等。我找不到任何关于何时可以安全分配内存的文档。

现在,在那里展开的路径没有接近 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!

【问题讨论】:

  • 我还应该补充一点,应用程序和共享库都是以 32 位模式构建的; i386.

标签: macos crash exc-bad-access shared-libraries


【解决方案1】:

在尝试之前尝试将 homedir 设置为 0,并将“结果”wordexp_t 结构设置为零。我最近使用过它,它在 Mac 和 Linux 上都运行良好。 10.6 我猜你是指 Mac?

【讨论】:

  • 是的,Mac。没有迹象表明需要在使用前设置这些结构。不过我会试试看的。
猜你喜欢
  • 1970-01-01
  • 2012-07-27
  • 2011-10-22
  • 1970-01-01
  • 2022-08-18
  • 2017-09-03
  • 1970-01-01
  • 2012-09-10
  • 2011-01-07
相关资源
最近更新 更多