begin process at 2012 05 30 08:49:42
  Trouver un code source :
 
dans
 
Accueil > Forum > 

C

 > 

Linux

 > 

Autre

 > 

Segmentation fault


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

Segmentation fault

vendredi 23 juillet 2010 à 23:10:08 | Segmentation fault

SergentP

Salut à tous,
J'obtiens l'érreur "Segmentation fault" lorsque je compile ce code(lit les lignes d'un fichier et extrait une certaine partie de chacune des lignes):

*********************************************************
const char filename[20] = "servers";
char *tmpstr = NULL;
char buff[40];
char *extension;
FILE * file;
short pos = 0;
short nbligne = 0;
short diff = 0;
short len_tmpstr, len_buff = 0;
bool stop = 0;

file = fopen( filename, "r" );

// nombre de lignes dans le fichier
for (nbligne = 0; stop == 0; nbligne++)
{
if (fgets( buff, sizeof (buff), file ) == NULL)
{
stop = 1;
printf( "nbligne=%d\n", nbligne );
fclose( file );
}
}

file = fopen( filename, "r" );

for (pos = 0; pos <= nbligne; pos++)
{
if (fgets( buff, sizeof (buff), file ) == NULL) fprintf( stderr, "ERROR fgets() failed: %s\n", strerror( errno ) );

tmpstr = strchr( buff, '|' );
len_tmpstr = strlen( tmpstr );
len_buff = strlen( buff );

diff = len_buff - len_tmpstr;

strncpy( extension, buff, diff );
printf("extension=%s\n", extension);
printf( "tmpstr=%s", tmpstr );
printf( "buff=%s\n", buff );
}
*********************************************************

L'érreur viens apparament de la fonction strncpy() mais je ne comprend pas pourquoi car extension est bien un pointeurs sur des char et buff un tableau de charactères..

Merci d'avance ;)
samedi 24 juillet 2010 à 11:13:10 | Re : Segmentation fault

TychoBrahe

Réponse acceptée !
Salut,

Beaucoup d'erreurs dans ton code, en particulier :
- Le type bool n'existe pas en C.
- Ouvrir et parcourir deux fois le fichier est une erreur de conception : une seule fosi est suffisante.
- Juste pour info, au lieux de t'embêter avec fprintf(), strerror() et errno, il existe perror() qui te fais tout ça.
- Autant mettre filename en #define
- Tu as oublié de tester les valeurs de retour de fopen, ce point est très grave.
- Dans la série des fautes graves, fgets() ne termine la chaîne par un \0 que si une nouvelle ligne est lue, ce qui signifie que si ton fichier contient plus de 40 caractères sans retour à al ligne, alors ta chaîne ne sera pas terminée par un \0 et que tes opérations de traitement ne ferons pas du tout ce que tu attend d'elles (segmentation fault, données corrompues, etc). Heureusement pour tout le monde, fgets() ne touche pas au dernier caractère, tu peux donc simplement passer ton buffer à bzero() pour régler le problème.
- Aucun test non plus de la valeur de retour de strchr, comme ça si le caractère n'est pas trouvé tu passe NULL à strlen et c'est partit pour le segfault.
- Enfin passons au strncpy : tu n'as pas alloué d'espace pour extension, c'est un pointeur qui pointe sur n'importe quoi. Forcément, lorsque l'on essaye de copier une chaine de caractère n'importe où, on segfault. Bref, au lieux de le définir en char *extension, fait plutôt un char extension[20] (20 vu que la taille de ton buffer est de 20, il ne sera pas possible de dépasser cette taille).
- Soit dit en passant, 20 comme taille de buffer c'est court, met donc plutôt un truc du genre 1024 à moins que tu soit certain que les lignes de ton fichier ne dépasseront jamais 19 caractères.
dimanche 25 juillet 2010 à 23:19:39 | Re : Segmentation fault

SergentP

* Javais enfait fait un "#include <stdbool.h>"
C'est apparament "considérée comme obsolète" je l'ai donc codé avec des define (pour évité d'avoir à changer tout le code et pour que se soit plus explicite):
#define bool short
#define TRUE 1
#define FALSE 0

* J'ai ouvert 2 fois le fichier pour remettre le pointeur à 0 -> j'ai maintenant fseek( file, 0, SEEK_SET );

* Pour le perror() j'ai pas bien compris comment fonctionnait la fonction -> j'ai plus simplement printf( "ERROR ...() failed: %s\n", strerror(errno) );

* Pour le filename je n'ai meme pas fais de #define mais juste fopen( "servers", "r" ); car je n'est plus qu'un seul fopen()

* Pour ce qui est de la taille des buffer je ne l'ai pas déclaré comme ceci par hasard, je sais que mon fichier (en lecture seule) ne dépasse pas les 32 colonnes (char buff[40]) et pour 'extension' ce sont des extensions de sites internet, qui ne dépasserons donc pas les 19 caractères

* J'ai fais un bzero() au début de la boucle for() sur la variable 'extension' pour éviter les caractères

------------------------------------------------------------

char *tmpstr = NULL;
char buff[40];
char extension[20];
FILE * file;
short pos = 0;
short nbligne = 0;
short diff = 0;
short len_tmpstr, len_buff = 0;
bool stop = 0;

file = fopen( "servers", "r" );
if (file == NULL) printf( "ERROR fopen() failed: %s\n", strerror( errno ) );

// nombre de lignes dans le fichier
for (nbligne = 0; stop == 0; nbligne++)
{
if (fgets( buff, sizeof (buff), file ) == NULL)
{
stop = 1;
printf( "nbligne=%d\n", nbligne );
}
}

fseek( file, 0, SEEK_SET );

for (pos = 0; pos <= 10; pos++) // mettre nbligne
{
bzero( extension, sizeof (extension) );

if (fgets( buff, sizeof (buff), file ) == NULL) printf( "ERROR fgets() failed: %s\n", strerror( errno ) );

tmpstr = strchr( buff, '|' );
if (tmpstr == NULL)
{
printf( "ERROR strchr() failed: %s / Erreur de syntaxe du fichier 'servers'\n", strerror( errno ) );
break;
}

len_tmpstr = strlen( tmpstr );
len_buff = strlen( buff );

diff = len_buff - len_tmpstr;

strncpy( extension, buff, diff );
printf( "extension=%s\n", extension );
printf( "tmpstr=%s", tmpstr );
printf( "buff=%s\n", buff );
}

fclose(file);


Cette discussion est classée dans : file, len, buff, nbligne, tmpstr


Répondre à ce message

Sujets en rapport avec ce message

Problème copie de fichier.... [ par Clonk ] Bonjour,Je voudrais copier un fichier texte dans mon appli, j'ai fais la fonction suivante://Copie d'un fichier (création du backup)int copier(char * AutoSuppression et .bat [ par phantom_2005 ] Bonjour,j'ai un problème de suppression de répertoire dans un fichier .bat.Je créée dans mon appli un fichier .bat d'autodestruction que j'appelle ava Assertion Failed [ par TheReb ] Bonjour! Cela fait maintenant une journée que j'essaie de trouver le problème dans mon code, en vain. J'obtiens toujours l'erreur Assertion failed... Ouvrir le nom d'un fichier dans une chaîne de caractères [ par noname001 ] Bonjour à tous, J'ai un soucis dans le développement d'un programme. En effet, j'ouvre tout d'abord un fichier.txt qui contient toute une liste de no Readfile et access denied [ par sran_isback ] Bonjour ! J'aimerai récupérer le contenu d'un fichier texte et le coller dans un tableau de char afin de pouvoir l'utiliser dans une autre partie du Problème : Mini Remote Shell [ par Abderrahmaine ] [^^happy10] Mini Remote Shell (mrsh) est une application client-serveur permettant d'exécuter des commandes sur une machine distante. Les commandes so suppression d'une structure dans un fichier [ par ragon ] bonjour, je souhaite simplement supprimer toute une structure d'un fichier, mais je n'y arrive pas. Voila mon code, j'ai essayé un truc mais ca fonct (win32)Fichier et buffer en lecture seule [ par mogwai93 ] Bonjour Je voudrais lire un fichier, placer le contenu de ce fichier dans un buffer et modifier ce buffer (mais pas le fichier). J'arrive bien à ou fonction pour mes FILE* [ par apu04 ] Bonjour à tous, je voudrais savoir s'il n y aurait pas en c une fonction qui me permet de stocker en un seul pointeur de type FILE* plusieurs du même DnsQuery, hook et detours [ par wxccxw ] Bonjour, j'ai ecrit une dll que j'injecte dans IE ou firefox pour savoir l'host qu'il demande a charger afin de filtrer. voici donc le code [code=cp


Nos sponsors


Sondage...

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

Photothèque

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,811 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales