2011-03-20 1 views
1

L'implication est un problème de mémoire. Je allocations statiques pour ces:wordexp suivi de strcpy = EXC_BAD_ACCESS + sharedlibrary apply-load-rules-all

char akdir[400]; 
char homedir[400]; 

Cette plante le premier 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; 
    } 
} 

... code supplémentaire clipsé .. ne pas y arriver sur le crash.

Ceci est dans une bibliothèque partagée que j'ai écrite qui est liée à mon application, aussi quelque chose que j'ai écrit. Dans ce cas, ça ne va pas très loin, bien que si ça commence, ça va.

... J'ai lu les documents wordexp plusieurs fois; ils disent qu'ils allouent de nouveaux objets, donc vous venez de configurer ce type et de les appeler avec l'adresse. Le modèle d'erreur de commutation est droit des wordexp docs:

http://www.gnu.org/s/libc/manual/html_mono/libc.html#Wordexp-Example

Il ne se bloque pas toujours. Juste parfois, et juste en dessous de 10.6. Je ne suis pas en train de construire le mode de débogage avec XCode 3.1.1, sous OSX 10.5.8 il semble fonctionner correctement, je n'ai pas vu un plantage - sous 10.6, il se bloque ... parfois. Mais toujours avec la même exception, et toujours au même endroit. Selon Google, cela signifie en fait qu'il est trop tôt pour allouer de la mémoire. Mais toutes les instances que j'ai pu trouver étaient des erreurs de mémoire de la part du programmeur. Overruns, etc Et je ne trouve pas de documents sur quand il est sûr d'allouer de la mémoire.

Maintenant, le chemin qui s'y développe n'est nulle part près de 400 caractères. c'est ce (ce qu'il complète):

/Users/flake/ak-plugins/ 

et ceci:

/Users/flake/ 

... si elle ne fonctionne pas. Le strcpy ... copie le 2ème paramètre en premier. Leur à la mienne. Et il fonctionne! sous 10.5. :/

Est-ce que wordexp est cassé? Est-ce que 10.6 est cassé? Suis-je fou?

est ici la sortie du débogueur:

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

Je devrais également ajouter que l'application et la bibliothèque partagée sont en cours de construction en mode 32 bits; i386. – fyngyrz

Répondre

0

Essayez memsetting homedir à 0 et la structure wordexp_t "résultat" avant d'essayer de zéros. Je l'ai récemment utilisé et il fonctionne bien sur Mac et Linux. Par 10.6 je suppose que vous voulez dire Mac?

+1

Oui, Mac. Rien n'indique que ces structures doivent être définies avant d'être utilisées. Mais je vais essayer. – fyngyrz