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 :

Probleme d'optimisation de la part du compilateur ?


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2009
    Messages
    62
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 62
    Par défaut Probleme d'optimisation de la part du compilateur ?
    Bonsoir,

    Il semblerait que l'une de mes variables soit modifié silencieusement, ce qui cause un bug du programme, du fait que cette variable soit un indice de tableau..
    Je l'ai alors passé dans gdb, et j'obtiens ceci:

    (gdb) info breakpoints
    Num Type Disp Enb Address What
    1 breakpoint keep y 0x0000000000403a80 in read_chunked_data at transmission.c:276
    (gdb) set follow-fork-mode child
    (gdb) r
    Breakpoint 1, read_chunked_data (sock=5, h=0x60b3c0) at transmission.c:276
    276 int relus = 0;
    Current language: auto
    The current source language is "auto; currently c".
    print i
    $1 = 32767
    (gdb) watch i
    Hardware watchpoint 2: i
    (gdb) c
    Continuing.
    Hardware watchpoint 2: i

    Old value = 32767
    New value = 0
    read_chunked_data (sock=5, h=0x60b3c0) at transmission.c:322
    (gdb) c
    Continuing.
    Hardware watchpoint 2: i

    /* Optimisation de la part de gcc ? */
    Old value = 0
    New value = -1504369332
    _wordcopy_fwd_aligned (dstp=<value optimized out>, srcp=<value optimized out>, len=8) at wordcopy.c:122
    122 wordcopy.c: Aucun fichier ou dossier de ce type.
    in wordcopy.c
    /**************************************/
    (gdb) c
    Continuing.
    Program received signal SIGSEGV, Segmentation fault.
    0x0000000000403e67 in read_chunked_data (sock=5, h=0x60b3c0) at transmission.c:349
    349 i++;
    Je ne sais pas si un extrait de code pourrait être utile ici, les seules instructions concernant la variable i dans cette fonctions étant i = 0 et i++..

    C'est la première fois que je croise ce genre de problème, je ne sais pas si c'est vraiment gcc qui agit mal ou si c'est moi qui ait fait une erreur quelque part

  2. #2
    Membre émérite
    Avatar de Pouet_forever
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    671
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 671
    Par défaut
    Tu as une erreur dans ton code. Sûrement un buffer overflow qui écrase la valeur de i. Montre nous une partie du code pour être fixé. (:

  3. #3
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2009
    Messages
    62
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 62
    Par défaut
    Ok , voila l'extrait de code qui semble planter:
    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
    char	chunk_size_16[10];
    char	tmp[2];
    char	*chunk = malloc(alloc_10);
    char	*b_copy = malloc(h->body_size);
     
     
    DBG(("Déplacement dans b_copy\n"));
    memmove(b_copy, h->message + h->headers_size, h->body_size);
    ...
     
    while(1){
    		memset(chunk_size_16, 0, 10);
    		i = 0;
     
    		while(1){
    			if(relus < h->body_size){
    				DBG(("Lecture sur b_copy\n"));
    				memmove(tmp, b_copy + relus, h->body_size - relus);
    				relus = h->body_size;
    			}
    			else{
    				DBG(("Lecture sur la socket car body_size = %d et relus = %d\n", h->body_size, relus));
    				if(read_socket(sock, tmp, 1) < 1){
    					free(chunk);
    					free(b_copy);
    					return -1;
    				}
     
     
    				/*Fin de la ligne, la taille du chunk a été récupéré*/
    				if(tmp[0] == '\r'){
    					/*On lit le '\n' de fin de ligne*/
    					if(relus < h->body_size)	relus++;
    					else if(read_socket(sock, tmp, 1) != 1){
                                                  free(chunk);
    					      free(b_copy);
    					      return -1;
    				        }
     
    					break;
    				}
     
    				chunk_size_16[i] = tmp[0];
    				i++;
    			}
    		}
    Ainsi que la fonction read_socket:
    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
    int read_socket(int sock, char * buffer, int size){
    	fd_set rdfs;
    	struct timeval timeout;
     
    	timeout.tv_sec = 15;
    	timeout.tv_usec = 0;
     
    	FD_ZERO(&rdfs);
    	FD_SET(sock, &rdfs);
     
    	if(select(sock + 1, &rdfs, NULL, NULL, &timeout) == 0){
    		return -1;
    	}
     
    	return read(sock, buffer, size);
    }

  4. #4
    Membre émérite
    Avatar de Pouet_forever
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    671
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 671
    Par défaut
    Quand tu fais ça : memmove(tmp, b_copy + relus, h->body_size - relus);
    Tu es sûr que h->body_size - relus sera inférieur ou égal à 1 ?

    Pour le reste je ne vois rien qui me saute aux yeux.

  5. #5
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2009
    Messages
    62
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 62
    Par défaut
    Oops, bien vu ! h->body_size - relus vaudra presque jamais une valeur inferieure ou egale a 1
    Merci beaucoup pour cette aide ultra rapide

  6. #6
    Membre émérite
    Avatar de Pouet_forever
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    671
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 671
    Par défaut
    De rien, bon courage.

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

Discussions similaires

  1. probleme d'optimisation d'une macro
    Par ylabarre dans le forum VBA Outlook
    Réponses: 5
    Dernier message: 28/09/2007, 16h40
  2. Probleme d'optimisation (Delphi7+firebird1.5)
    Par nassoft dans le forum Bases de données
    Réponses: 3
    Dernier message: 15/05/2007, 13h19
  3. probleme d'optimisation de fonction
    Par franc82 dans le forum C++
    Réponses: 3
    Dernier message: 31/10/2006, 09h45
  4. [Probleme Changé]Optimisation de l'affichage de jeu
    Par RadicalBob dans le forum Langage
    Réponses: 23
    Dernier message: 18/06/2006, 04h07
  5. [VBA-E]Probleme d'optimisation
    Par sk8bcn dans le forum Macros et VBA Excel
    Réponses: 18
    Dernier message: 30/05/2006, 20h14

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