2012-11-28 3 views
-1

J'essaye de porter mon code C GNU/Linux à FreeBSD. Au début, je pensais qu'il ne compilerait pas et n'agirait pas anormalement, mais il n'a pas agi sur moi parce qu'il n'utilisait pas de fonctions que l'autre système d'exploitation ne possède pas. Bien qu'il se compile bien (pas d'erreurs ou d'avertissements en utilisant -Wall), l'application conserve les erreurs de segmentation sur une ligne qui fonctionne normalement comme prévu sur une installation GNU/Linux. Ce que je fais est de créer un pointeur sur une structure et de passer ensuite le pointeur sur une fonction comme un pointeur vide, puis de le recréer dans la fonction.passant un pointeur struct à une fonction segfault C FREEBSD

ex:

typedef struct 
{ 
    int i; 
}some_struct; 

int main() 
{ 
    some_struct *test = malloc(sizeof(some_struct)); 
    test->i = -1; 
    function(test); 

return 0; 
} 

void *function(void *prarm) 
{ 
    some_struct test = *((some_struct *)param); //segfaults on this line. 
    free(param); 


return NULL; 
} 

Sur mon GNU/Linux installer cela me permettra de recréer la struct avec les données de pointeur transmis localement dans la fonction et me permettent de libérer la mémoire ed malloc de main() mais sur FreeBSD ça fait des failles et je ne sais pas pourquoi.

Si je casse à function dans gdb et tapez

p *(some_struct *)param 

Il imprime avec succès ma struct commande qui est créée à partir du pointeur et toutes ses variables de l'intérieur de la fonction. Je ne comprends pas pourquoi cela fonctionne GNU/Linux et segmente sur mon machine de test FreeBSD.

Merci pour toute aide pour ce problème que j'ai.

+1

La publication d'indicateurs GCC (ou CLang?) Serait également utile. – 9000

+1

Ce n'est pas le vrai code. Le problème est dans une autre partie que vous avez omise. – cnicutar

+2

Ce code ne compile même pas, et en fait, le cmd d'impression 'gdb' que vous avez cité utilise un nom de structure complètement différent de votre code affiché. S'il vous plaît poster le * real * code qui présente le problème. – WhozCraig

Répondre

1

Je ne vois aucune raison pour cela segmentation fault, surtout si -Wall est silencieux. Une chose qui me dérange à ce sujet est qu'il n'y a pas de déclaration apparente en vigueur pour function() au moment de l'appel en main(). Sans déclaration, C suppose que le paramètre est passé en entier et devrait donc donner un avertissement. Vous pouvez résoudre ce problème de plusieurs manières: — ajoutez une déclaration de fonction au-dessus de main(), déplacez la définition de la fonction au-dessus de main, ou placez la déclaration dans un fichier d'en-tête inclus avant main().

+0

désolé j'ai mis à jour avec une partie de mon vrai code (du mieux que je pouvais sans poster 1300 lignes de code) –

2

C'est bizarre que cela échoue. Avez-vous essayé réordonner les fonctions ou déclarant function avant utilisation (avant principal):

void *function(void *prarm); 
+0

Pour les raisons indiquées par @wallyk. – jimhark

2

Vous créez un très grand cadre de pile:

char buff[3000600], data[3000000], url[1024], c[1]; 

qui est presque 6 Mo - peut-être vous dépassez la limite de taille de la pile de processus par défaut sur FreeBSD? FreeBSD utilise SIGSEGV pour tuer un processus qui dépasse cette limite, et il serait détecté lorsque vous écrivez dans une variable locale qui provoquerait l'extension de la pile au-delà de la limite. Vous pouvez modifier la limite de taille de pile dans login.conf.

Questions connexes