IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

Segmentation fault (core dumped)


Sujet :

C

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2013
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2013
    Messages : 9
    Points : 11
    Points
    11
    Par défaut Segmentation fault (core dumped)
    Bonjour,
    J'ouvre cette nouvelle discussion car quand j'exécute ce programme, je me retrouve avec un Segmentation fault (core dumped).
    Le problème vient probablement d'une mauvaise utilisation des pointeurs mais je ne sais pas précisément où ça coince.
    Je compile avec gcc -Wall -Werror -W, jusque là tout se passe bien.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
     
    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    char * miroir(const char *s)
    {
            int i=0;
            while(s[i] != '\n'){
                    i++;
            }
            char *z = malloc(i*sizeof(char));
            char x[i];
            int cpt = 0;
            while(i > 0){
                    x[cpt]=s[i-1];
                    i--;
                    cpt++;
            }
            strcpy(z, x);
            return (char *)z;
    }
     
    char * saisie(){
    	char *z = malloc(50*sizeof(char));
    	int a = getchar();
    	int limit = 0;
    	int memory = 2;
    	if(a == '\n'){
    		printf("Chaine vaut null\n");
    	}else{
    		while(a != '\n'){
    			limit++;
    			if(limit % 50 == 0){
    				char *tmp = realloc(z, 50*memory);
    				if(tmp == NULL){
    					printf("Espace mémoire insuffisant.\n");
    					char fin[] = {'\0'};
    					z = strcat(z, fin);
    					printf("La dernière chaine sauvegardé est %s", z);
    					return (char *)z;
    				}
    				z = tmp;
    				memory++;
    			}
    			char tmp[] = {a};
    			z = strcat(z,tmp);
    			a = getchar();
    		}
    	}
    	printf("%s",z);
    	return (char *)z;
    }
     
    int main(int argc, char **argv)
    {
    	//char *mir = "Bonjour\n";
    	//printf("%s", miroir(mir));
    	char *param = "-m";
    	if(strcmp(argv[argc-2], param)==0 && argv[argc-1] != NULL){
    		char *tmp = miroir(argv[argc-1]);
    		printf("-m : %s",tmp);
    	}else{
    		printf("Erreur : %d : %s\n",strcmp(argv[argc-2], param), argv[argc-2]);
    	}
    	return 0;
    }
    En utilisant le débugger Valgrind avec l'option "-v" voici ce qu'il affiche en sortie (ici je n'appel que la première fonction, mes l'appel à la deuxième pose aussi des problèmes de lectures/écritures en mémoire):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
     
    ==4903== Memcheck, a memory error detector
    ==4903== Copyright (C) 2002-2015, and GNU GPL'd, by Julian Seward et al.
    ==4903== Using Valgrind-3.12.0 and LibVEX; rerun with -h for copyright info
    ==4903== Command: ./a.out
    ==4903== 
    --4903-- Valgrind options:
    --4903--    -v
    --4903-- Contents of /proc/version:
    --4903--   Linux version 4.10.0-19-generic (buildd@lcy01-13) (gcc version 6.3.0 20170321 (Ubuntu 6.3.0-10ubuntu1) ) #21-Ubuntu SMP Thu Apr 6 17:04:57 UTC 2017
    --4903-- 
    --4903-- Arch and hwcaps: AMD64, LittleEndian, amd64-cx16-rdtscp-sse3-avx
    --4903-- Page sizes: currently 4096, max supported 4096
    --4903-- Valgrind library directory: /usr/lib/valgrind
    --4903-- Reading syms from /home/thibault/langageC/TP4/a.out
    --4903-- Reading syms from /lib/x86_64-linux-gnu/ld-2.24.so
    --4903--   Considering /lib/x86_64-linux-gnu/ld-2.24.so ..
    --4903--   .. CRC mismatch (computed 4b0c5a7e wanted 89f5325d)
    --4903--   Considering /usr/lib/debug/lib/x86_64-linux-gnu/ld-2.24.so ..
    --4903--   .. CRC is valid
    --4903-- Reading syms from /usr/lib/valgrind/memcheck-amd64-linux
    --4903--   Considering /usr/lib/valgrind/memcheck-amd64-linux ..
    --4903--   .. CRC mismatch (computed c2dc3c92 wanted ad3f4971)
    --4903--    object doesn't have a symbol table
    --4903--    object doesn't have a dynamic symbol table
    --4903-- Scheduler: using generic scheduler lock implementation.
    --4903-- Reading suppressions file: /usr/lib/valgrind/default.supp
    ==4903== embedded gdbserver: reading from /tmp/vgdb-pipe-from-vgdb-to-4903-by-thibault-on-???
    ==4903== embedded gdbserver: writing to   /tmp/vgdb-pipe-to-vgdb-from-4903-by-thibault-on-???
    ==4903== embedded gdbserver: shared mem   /tmp/vgdb-pipe-shared-mem-vgdb-4903-by-thibault-on-???
    ==4903== 
    ==4903== TO CONTROL THIS PROCESS USING vgdb (which you probably
    ==4903== don't want to do, unless you know exactly what you're doing,
    ==4903== or are doing some strange experiment):
    ==4903==   /usr/lib/valgrind/../../bin/vgdb --pid=4903 ...command...
    ==4903== 
    ==4903== TO DEBUG THIS PROCESS USING GDB: start GDB like this
    ==4903==   /path/to/gdb ./a.out
    ==4903== and then give GDB the following command
    ==4903==   target remote | /usr/lib/valgrind/../../bin/vgdb --pid=4903
    ==4903== --pid is optional if only one valgrind process is running
    ==4903== 
    --4903-- REDIR: 0x401d280 (ld-linux-x86-64.so.2:strlen) redirected to 0x380a6091 (???)
    --4903-- REDIR: 0x401bbd0 (ld-linux-x86-64.so.2:index) redirected to 0x380a60ab (???)
    --4903-- Reading syms from /usr/lib/valgrind/vgpreload_core-amd64-linux.so
    --4903--   Considering /usr/lib/valgrind/vgpreload_core-amd64-linux.so ..
    --4903--   .. CRC mismatch (computed da1984fa wanted 7644421c)
    --4903--    object doesn't have a symbol table
    --4903-- Reading syms from /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so
    --4903--   Considering /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so ..
    --4903--   .. CRC mismatch (computed bbbdc1f5 wanted 3c7fb4f9)
    --4903--    object doesn't have a symbol table
    ==4903== WARNING: new redirection conflicts with existing -- ignoring it
    --4903--     old: 0x0401d280 (strlen              ) R-> (0000.0) 0x380a6091 ???
    --4903--     new: 0x0401d280 (strlen              ) R-> (2007.0) 0x04c30de0 strlen
    --4903-- REDIR: 0x401bdf0 (ld-linux-x86-64.so.2:strcmp) redirected to 0x4c31ee0 (strcmp)
    --4903-- REDIR: 0x401dd90 (ld-linux-x86-64.so.2:mempcpy) redirected to 0x4c352b0 (mempcpy)
    --4903-- Reading syms from /lib/x86_64-linux-gnu/libc-2.24.so
    --4903--   Considering /lib/x86_64-linux-gnu/libc-2.24.so ..
    --4903--   .. CRC mismatch (computed 1f08dfe0 wanted 2cd0873a)
    --4903--   Considering /usr/lib/debug/lib/x86_64-linux-gnu/libc-2.24.so ..
    --4903--   .. CRC is valid
    --4903-- REDIR: 0x4ecb020 (libc.so.6:strcasecmp) redirected to 0x4a28740 (_vgnU_ifunc_wrapper)
    --4903-- REDIR: 0x4ec6990 (libc.so.6:strcspn) redirected to 0x4a28740 (_vgnU_ifunc_wrapper)
    --4903-- REDIR: 0x4ecd310 (libc.so.6:strncasecmp) redirected to 0x4a28740 (_vgnU_ifunc_wrapper)
    --4903-- REDIR: 0x4ec8e00 (libc.so.6:strpbrk) redirected to 0x4a28740 (_vgnU_ifunc_wrapper)
    --4903-- REDIR: 0x4ec9190 (libc.so.6:strspn) redirected to 0x4a28740 (_vgnU_ifunc_wrapper)
    --4903-- REDIR: 0x4eca6a0 (libc.so.6:memmove) redirected to 0x4a28740 (_vgnU_ifunc_wrapper)
    --4903-- REDIR: 0x4ec6870 (libc.so.6:strcpy) redirected to 0x4a28740 (_vgnU_ifunc_wrapper)
    --4903-- REDIR: 0x4ec53e0 (libc.so.6:strcmp) redirected to 0x4a28740 (_vgnU_ifunc_wrapper)
    --4903-- REDIR: 0x4ec4f90 (libc.so.6:strcat) redirected to 0x4a28740 (_vgnU_ifunc_wrapper)
    --4903-- REDIR: 0x4ec8b10 (libc.so.6:rindex) redirected to 0x4c30770 (rindex)
    --4903-- REDIR: 0x4eda4c0 (libc.so.6:__strcmp_sse2_unaligned) redirected to 0x4c31da0 (strcmp)
    ==4903== Invalid read of size 1
    ==4903==    at 0x4EDA4C0: __strcmp_sse2_unaligned (strcmp-sse2-unaligned.S:24)
    ==4903==    by 0x108B84: main (in /home/thibault/langageC/TP4/a.out)
    ==4903==  Address 0x1 is not stack'd, malloc'd or (recently) free'd
    ==4903== 
    ==4903== 
    ==4903== Process terminating with default action of signal 11 (SIGSEGV)
    ==4903==  Access not within mapped region at address 0x1
    ==4903==    at 0x4EDA4C0: __strcmp_sse2_unaligned (strcmp-sse2-unaligned.S:24)
    ==4903==    by 0x108B84: main (in /home/thibault/langageC/TP4/a.out)
    ==4903==  If you believe this happened as a result of a stack
    ==4903==  overflow in your program's main thread (unlikely but
    ==4903==  possible), you can try to increase the size of the
    ==4903==  main thread stack using the --main-stacksize= flag.
    ==4903==  The main thread stack size used in this run was 8388608.
    --4903-- REDIR: 0x4ec00e0 (libc.so.6:free) redirected to 0x4c2ecf0 (free)
    ==4903== 
    ==4903== HEAP SUMMARY:
    ==4903==     in use at exit: 0 bytes in 0 blocks
    ==4903==   total heap usage: 0 allocs, 0 frees, 0 bytes allocated
    ==4903== 
    ==4903== All heap blocks were freed -- no leaks are possible
    ==4903== 
    ==4903== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 0 from 0)
    ==4903== 
    ==4903== 1 errors in context 1 of 1:
    ==4903== Invalid read of size 1
    ==4903==    at 0x4EDA4C0: __strcmp_sse2_unaligned (strcmp-sse2-unaligned.S:24)
    ==4903==    by 0x108B84: main (in /home/thibault/langageC/TP4/a.out)
    ==4903==  Address 0x1 is not stack'd, malloc'd or (recently) free'd
    ==4903== 
    ==4903== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 0 from 0)
    Segmentation fault (core dumped)
    Merci d'avance pour votre aide

  2. #2
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 368
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 368
    Points : 23 620
    Points
    23 620
    Par défaut
    Bonjour,

    Il y a plusieurs erreurs dans ton programme. La première (subtile) dans ta fonction main() à la ligne 59 : quand tu écris argv[argc-2], tu fais l'hypothèse qu'il y a au moins trois arguments (en comptant le nom du programme) sur ta ligne de commande et qu'ils sont en nombre fixe. Si tu oublies de les passer quand tu appelles ton programme, ça suffit à faire planter celui-ci.

    Essaie d'ajouter l'option -g à la compilation de ton programme, puis de lancer ton programme depuis gdb, comme suggéré par les logs de valgrind. Après le plantage, saisis bt (backtrace) pour retrouver la liste des appels successifs et remonter jusqu'à l'endroit (avec le numéro de ligne) où le plantage se produit dans ton programme.

  3. #3
    Expert éminent
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 565
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 1 565
    Points : 7 642
    Points
    7 642
    Par défaut
    Bonjour,

    Il y a en effet de nombreuses erreurs dans les 3 fonctions. Il est important d'utiliser un debugger comme gdb. En faisant du pas à pas, tu pourras examiner les valeurs de tes variables y compris les pointeurs, et mieux voir ce que fait ton code.
    valgrid n'est pas un debugger, il te serviras plus tard pour la mise au point finale.

  4. #4
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2013
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2013
    Messages : 9
    Points : 11
    Points
    11
    Par défaut
    Merci pour vos réponses.

    J'ai résolu le problème de Segmentation fault (core dumped), un problème de marqueur de fin de chaîne (gdb le dit explicitement en plus, utile)...
    Tout d'abord dans la fonction char * miroir(const char *s) :
    j'ai remplacé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    while(s[i] != '\n'){
                    i++;
            }
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    while(s[i] != '\0'){
                    i++;
            }
    Et puis dans cette même fonction, j'ai rajouté '\0' à la dernière case du tableau retourné.

    Voici le code complet :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
     
    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    #include <regex.h>
    char * miroir(const char *s)
    {
            int i=0;
            while(s[i] != '\0'){
                    i++;
            }
            char *z = malloc(i*sizeof(char));
            char x[i+1];
    	x[i] = '\0';
            int cpt = 0;
            while(i > 0){
                    x[cpt]=s[i-1];
                    i--;
                    cpt++;
            }
            strcpy(z, x);
            return (char *)z;
    }
     
    char * saisie(){
    	char *z = malloc(50*sizeof(char));
    	int a = getchar();
    	int limit = 0;
    	int memory = 2;
    	if(a == '\n'){
    		printf("Chaine vaut null\n");
    	}else{
    		while(a != '\n'){
    			limit++;
    			if(limit % 50 == 0){
    				char *tmp = realloc(z, 50*memory);
    				if(tmp == NULL){
    					printf("Espace mémoire insuffisant.\n");
    					char fin[] = {'\0'};
    					z = strcat(z, fin);
    					printf("La dernière chaine sauvegardé est %s", z);
    					return (char *)z;
    				}
    				z = tmp;
    				memory++;
    			}
    			char tmp[] = {a};
    			z = strcat(z,tmp);
    			a = getchar();
    		}
    	}
    	char fin[] = {'\0'};
    	z = strcat(z, fin);
    	return (char *)z;
    }
     
    int main(int argc, char **argv)
    //int main(void)
    {
    	/*
    	char *mir = "Bonjour\n";
    	printf("%s\n", miroir(mir));
    	char *sais = saisie();
    	printf("%s\n", sais);
    	*/
    	/*
    	char *param = "-m";
    	if(strcmp(argv[argc-2], param)==0 && argv[argc-1] != NULL){
    		char *tmp = miroir(argv[argc-1]);
    		printf("-m : %s",tmp);
    	}else{
    		printf("Erreur : %d : %s\n",strcmp(argv[argc-2], param), argv[argc-2]);
    	}*/
    	char *param = "-m";
    	char *param2 = "-s";
    	//int err;
    	//regex_t preg;
    	//const char *str_regex = "^[-]{1}[ms\|sm]+";
    	//err = regcomp (&preg, str_regex, REG_NOSUB | REG_EXTENDED);
    	while(argc > 1){
    		if(strcmp(argv[argc-1], param) == 0)
    			printf("%s\n",miroir(argv[argc]));
    		if(strcmp(argv[argc-1], param2) == 0)
    			printf("%s\n", saisie());
    		/*
    		if(err == 0 && argc == 2){
    			int match;
    			match = regexec (&preg, argv[argc-1], 0, NULL, 0);
    			regfree (&preg);
    			if(match == 0){
    				//printf("%s\n", miroir(saisie()));
    				printf("ok");
    			}
    		}
    		*/
    		argc -= 1;
    	}
    	return 0;
    }
    Valgrind me détecte toujours des lectures/écritures invalides sans que gdb me dise quoi que ce soit.

    Un autre petit problème (je ne pense pas qu'il y ai besoin d'un deuxième post pour ça), c'est avec l'expression régulière : "^[-]{1}[ms\|sm]+"
    Je n'arrive pas à échapper le carctère "|" avec "\"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    tp4_1.c: In function ‘main’:
    tp4_1.c:77:26: error: unknown escape sequence: '\|' [-Werror]
      const char *str_regex = "^[-]{1}[ms\||sm]+";

  5. #5
    Expert éminent
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 565
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 1 565
    Points : 7 642
    Points
    7 642
    Par défaut
    On n'a pas besoin d'échapper le caractère '|', sinon les caractères d'expression régulière s'échappent en utilisant '\\'.
    Le rôle d'un debugger n'est pas d'indiquer des problèmes, il est là pour aider à les résoudre.
    La fonction miroir() pour x il faut réserver (i+1) caractères, pour z il en faut évidemment autant.
    Il existe d'autres erreurs dans les autres fonctions.

  6. #6
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2013
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2013
    Messages : 9
    Points : 11
    Points
    11
    Par défaut
    Ha merci, je n'ai plus de message d'erreur de la part de valgrind en appelant la fonction miroir(char *).
    Pour les autres erreurs, d'après gdb, je n'initialise pas *z notamment, donc ça pose problème, j'essaierai de résoudre ça plus tard.

    Valgrind me détecte toujours des lectures/écritures invalides sans que gdb me dise quoi que ce soit.
    Je me suis mal exprimé, c'était juste pour indiquer que je l'avais utilisé.

    En tout cas c'est résolu pour moi

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. segmentation fault (core dumped)
    Par domdom974 dans le forum Fortran
    Réponses: 2
    Dernier message: 04/08/2009, 09h07
  2. [ASE 15.0.3] Segmentation Fault - core dumped
    Par dngaya dans le forum Adaptive Server Enterprise
    Réponses: 0
    Dernier message: 04/06/2009, 10h55
  3. segmentation fault (core dumped)
    Par miamiam dans le forum Débuter
    Réponses: 3
    Dernier message: 26/11/2008, 11h46
  4. Réponses: 1
    Dernier message: 10/12/2006, 21h37
  5. Segmentation fault (core dumped)
    Par Battosaiii dans le forum C
    Réponses: 13
    Dernier message: 25/11/2005, 18h36

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo