wordexp, за которым следует strcpy = EXC_BAD_ACCESS + sharedlibrary apply-load-rules-all - PullRequest
1 голос
/ 20 марта 2011

Подразумевается проблема с памятью. У меня есть статические распределения для них:

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!

1 Ответ

0 голосов
/ 09 августа 2011

Попробуйте установить в homedir значение 0, а структуру wordexp_t "result" обнулите, прежде чем пытаться.Я недавно использовал его, и он хорошо работает как на Mac, так и на Linux.Под 10,6 я полагаю, вы имеете в виду Mac?

...