Bonjour,

D'habitude je me débrouille tout seul lorsque j'ai un bug de ce type mais ça fait 3 jours que je suis dessus et je n'ai toujours pas avancé d'un yota.

Voici les bouts de code qui posent problème :
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
void modifier_utilisateur(GtkWidget* pWidget, gpointer data)
{
    Inf* in = data;
    GtkWidget *pboite, *pconf, *pinfo, *hbox1, *hbox2;
    Client nclt;
 
 
    pboite = gtk_dialog_new_with_buttons("Modifier l'utilisateur", NULL, GTK_DIALOG_MODAL, g_locale_to_utf8("Modifier",-1, NULL, NULL, NULL), GTK_RESPONSE_OK, "Annuler", GTK_RESPONSE_CANCEL, NULL);
    gtk_window_set_position (GTK_WINDOW (pboite), GTK_WIN_POS_CENTER);
    hbox1 = gtk_hbox_new(TRUE, 20);
    hbox2 = gtk_hbox_new(TRUE, 20);
    in->entree_login2 = gtk_entry_new();
    in->entree_mdp2 = gtk_entry_new();
    gtk_entry_set_visibility(GTK_ENTRY(in->entree_mdp2), FALSE);
    gtk_box_pack_start(GTK_BOX(GTK_DIALOG(pboite)->vbox), hbox1, TRUE, TRUE, 0);
    gtk_box_pack_start(GTK_BOX(GTK_DIALOG(pboite)->vbox), hbox2, TRUE, TRUE, 0);
    gtk_box_pack_start(GTK_BOX(hbox1), gtk_label_new("Login :"), TRUE, TRUE, 0);
    gtk_box_pack_start(GTK_BOX(hbox1), in->entree_login2, TRUE, TRUE, 0);
    gtk_box_pack_start(GTK_BOX(hbox2), gtk_label_new("Mot de passe :"), TRUE, TRUE, 0);
    gtk_box_pack_start(GTK_BOX(hbox2), in->entree_mdp2, TRUE, TRUE, 0);
    gtk_widget_show_all(GTK_DIALOG(pboite)->vbox);
    if(!in->muet)
        FSOUND_PlaySound(FSOUND_FREE, in->pconnecte);
    if(gtk_dialog_run(GTK_DIALOG(pboite)) == GTK_RESPONSE_OK)
    {
        if(strchr(gtk_entry_get_text(GTK_ENTRY(in->entree_login2)), ' ') || strchr(gtk_entry_get_text(GTK_ENTRY(in->entree_mdp2)), ' '))
        {
            if(!in->muet)
                FSOUND_PlaySound(FSOUND_FREE, in->pconnecte);
            pinfo = gtk_message_dialog_new (NULL, GTK_DIALOG_MODAL,GTK_MESSAGE_INFO,GTK_BUTTONS_OK, g_locale_to_utf8("Aucun espace dans le nom ou le mot de passe.",-1, NULL, NULL, NULL));
            gtk_window_set_position (GTK_WINDOW (pinfo), GTK_WIN_POS_CENTER);
            gtk_dialog_run(GTK_DIALOG(pinfo));
            if(!in->muet)
                FSOUND_PlaySound(FSOUND_FREE, in->psort);
            gtk_widget_destroy(pinfo);
            gtk_widget_destroy(pboite);
            return;
        }
        nclt.nb_messages_envoyes = in->util->nb_messages_envoyes;
        strcpy(nclt.nom,g_locale_from_utf8(gtk_entry_get_text(GTK_ENTRY(in->entree_login2)), -1, NULL, NULL, NULL));
        strcpy(nclt.mdp,g_locale_from_utf8(gtk_entry_get_text(GTK_ENTRY(in->entree_mdp2)), -1, NULL, NULL, NULL));
        nclt.date_inscription[2] = in->util->date_inscription[2];
        nclt.date_inscription[1] = in->util->date_inscription[1];
        nclt.date_inscription[0] = in->util->date_inscription[0];
        nclt.statut = in->util->statut;
        if(ajout_utilisateur(nclt, creer_liste_client()) != -1)
        {
            pconf = gtk_dialog_new_with_buttons("Confirmer la modification", NULL, GTK_DIALOG_MODAL, "Oui", GTK_RESPONSE_OK, "Non", GTK_RESPONSE_NO, NULL);
            gtk_box_pack_start(GTK_BOX(GTK_DIALOG(pconf)->vbox), gtk_label_new(g_locale_to_utf8("Nouvelles données ajoutées.\nSupprimer les anciennes données sur cet utilisateur ?",-1, NULL, NULL, NULL)), TRUE, TRUE, 10);
            gtk_widget_show_all(GTK_DIALOG(pconf)->vbox);
            if(!in->muet)
                FSOUND_PlaySound(FSOUND_FREE, in->pconnecte);
            printf("1\n");
            if(gtk_dialog_run(GTK_DIALOG(pconf)) == GTK_RESPONSE_OK)
            {
                printf("2\n");
                suppression_utilisateur(*in->util, creer_liste_client());
                actualise_utilisateurs(data);
                gtk_widget_set_sensitive(in->boutonue,FALSE);
                gtk_widget_set_sensitive(in->boutonum,FALSE);
                gtk_label_set_label(GTK_LABEL(in->lnom), "Nom de l'utilisateur");
                gtk_label_set_label(GTK_LABEL(in->lcreation), g_locale_to_utf8("Date de création",-1, NULL, NULL, NULL));
                gtk_label_set_label(GTK_LABEL(in->lnbarticles), "Nombre d'articles");
                gtk_label_set_label(GTK_LABEL(in->letat), "Etat actuel");
            }
            gtk_widget_destroy(pconf);
            actualise_utilisateurs(data);
        }
        else
        {
            pinfo = gtk_message_dialog_new (NULL,GTK_DIALOG_MODAL,GTK_MESSAGE_INFO,GTK_BUTTONS_OK, g_locale_to_utf8("Ce nom est déjà utilisé.",-1, NULL, NULL, NULL));
            gtk_dialog_run(GTK_DIALOG(pinfo));
            gtk_widget_destroy(pinfo);
        }
    }
    gtk_widget_destroy(pboite);
    if(!in->muet)
        FSOUND_PlaySound(FSOUND_FREE, in->psort);
}
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
void creer_utilisateur(GtkWidget* pWidget, gpointer data)
{
    Inf* in = data;
    GtkWidget *pboite, *pinfo, *hbox1, *hbox2;
    Client clt;
    struct tm today;
    time_t maintenant;
 
 
    pboite = gtk_dialog_new_with_buttons("Nouvel Utilisateur", NULL, GTK_DIALOG_MODAL, g_locale_to_utf8("Créer",-1, NULL, NULL, NULL), GTK_RESPONSE_OK, "Annuler", GTK_RESPONSE_CANCEL, NULL);
    gtk_window_set_position (GTK_WINDOW (pboite), GTK_WIN_POS_CENTER);
    hbox1 = gtk_hbox_new(TRUE, 20);
    hbox2 = gtk_hbox_new(TRUE, 20);
    in->entree_login2 = gtk_entry_new();
    in->entree_mdp2 = gtk_entry_new();
    gtk_entry_set_visibility(GTK_ENTRY(in->entree_mdp2), FALSE);
    gtk_box_pack_start(GTK_BOX(GTK_DIALOG(pboite)->vbox), hbox1, TRUE, TRUE, 0);
    gtk_box_pack_start(GTK_BOX(GTK_DIALOG(pboite)->vbox), hbox2, TRUE, TRUE, 0);
    gtk_box_pack_start(GTK_BOX(hbox1), gtk_label_new("Login :"), TRUE, TRUE, 0);
    gtk_box_pack_start(GTK_BOX(hbox1), in->entree_login2, TRUE, TRUE, 0);
    gtk_box_pack_start(GTK_BOX(hbox2), gtk_label_new("Mot de passe :"), TRUE, TRUE, 0);
    gtk_box_pack_start(GTK_BOX(hbox2), in->entree_mdp2, TRUE, TRUE, 0);
    gtk_widget_show_all(GTK_DIALOG(pboite)->vbox);
    if(!in->muet)
        FSOUND_PlaySound(FSOUND_FREE, in->pconnecte);
    if(gtk_dialog_run(GTK_DIALOG(pboite)) == GTK_RESPONSE_OK)
    {
        if(strchr(gtk_entry_get_text(GTK_ENTRY(in->entree_login2)), ' ') || strchr(gtk_entry_get_text(GTK_ENTRY(in->entree_mdp2)), ' '))
        {
            if(!in->muet)
                FSOUND_PlaySound(FSOUND_FREE, in->pconnecte);
            pinfo = gtk_message_dialog_new (GTK_WINDOW(pboite),GTK_DIALOG_MODAL,GTK_MESSAGE_INFO,GTK_BUTTONS_OK, g_locale_to_utf8("Aucun espace dans le nom ou le mot de passe.",-1, NULL, NULL, NULL));
            gtk_dialog_run(GTK_DIALOG(pinfo));
            if(!in->muet)
                FSOUND_PlaySound(FSOUND_FREE, in->psort);
            gtk_widget_destroy(pinfo);
            gtk_widget_destroy(pboite);
            return;
        }
        clt.nb_messages_envoyes = 0;
        strcpy(clt.nom,g_locale_from_utf8(gtk_entry_get_text(GTK_ENTRY(in->entree_login2)), -1, NULL, NULL, NULL));
        strcpy(clt.mdp,g_locale_from_utf8(gtk_entry_get_text(GTK_ENTRY(in->entree_mdp2)), -1, NULL, NULL, NULL));
        time(&maintenant);
        today = *localtime(&maintenant);
        clt.date_inscription[2] = today.tm_year + 1900;
        clt.date_inscription[1] = today.tm_mon + 1;
        clt.date_inscription[0] = today.tm_mday;
        clt.statut=0;
        if(ajout_utilisateur(clt, creer_liste_client()) != -1)
        {
            actualise_utilisateurs(data);
        }
        else
        {
            if(!in->muet)
                FSOUND_PlaySound(FSOUND_FREE, in->pconnecte);
            pinfo = gtk_message_dialog_new (GTK_WINDOW(pboite),GTK_DIALOG_MODAL,GTK_MESSAGE_INFO,GTK_BUTTONS_OK, g_locale_to_utf8("Ce nom est déjà utilisé.",-1, NULL, NULL, NULL));
            gtk_dialog_run(GTK_DIALOG(pinfo));
            gtk_widget_destroy(pinfo);
        }
    }
    if(!in->muet)
        FSOUND_PlaySound(FSOUND_FREE, in->psort);
    gtk_widget_destroy(pboite);
    printf("3\n");
}
Voici la déclaration de la structure Client :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
typedef struct client
{
	int nb_messages_envoyes;
	int date_inscription[3]; // jour mois annee
	char nom[1000];
	char mdp[1000];
	int statut;
}Client;
Le programme plante entre 1 et 2 dans modifier_utilisateur et après 3 dans creer_utilisateur.
Les 2 fonctions sont des callback reliée à des boutons.

Parfois le programme plante, parfois il ne plante pas, ce qui est caractéristiques des bugs de mémoire.
Quelque part dans le programme, je dois écrire dans une zone mémoire qui ne m'est pas allouée, mais pas moyen de trouver où...
J'ai vraiment besoin d'aide sur ce coup, parceque moi j'suis en train de baisser les bras :-/
Le programme fait environ 2500 lignes de codes, donc je peux évidement pas tout mettre sur ce topic. Mais si il vous faut un renseignement supplémentaire, demandez-moi, j'le rajouterai.

Merci d'avance à tous ceux qui pourront m'aider à résoudre ce mystère.

PS : Comme si ça ne suffisait pas, ce détail vient épaissir le mystère : Quand je fais tourner le programme avec gdb, celui-ci ne remarque rien d'anormal et le programme se porte à merveille !
Mais dès que je le fais tourner normalement, les bugs recommencent...