Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 05/01/2008, à 15:36

Darunia

SIGSEGV sur gtk_widget_destroy

Salut à  tous,

Je debute le GTK, et la, je dois avouer que je seche.
En effet, je me sert d'un GtkFileSelection pour selectionner un fihcier (vous l'auriez deviné ;-)).
Le problème se situe au moment au souhaite detruire ce GtkFileSelection:

    //Create file selection dialog
    GtkWidget* pFileSelection = gtk_file_selection_new("Open file");

    //Make dialog modal
    gtk_window_set_modal(GTK_WINDOW(pFileSelection), TRUE);

    if(gtk_dialog_run(GTK_DIALOG(pFileSelection)) == GTK_RESPONSE_OK)
    {
        const gchar* gFile;
        char File[512];

        gFile = gtk_file_selection_get_filename(GTK_FILE_SELECTION(pFileSelection));

        strcpy(File, gFile);

        CurrentObject = new CObject();
        CurrentObject->SetName("12");

        gtk_widget_destroy(GTK_WIDGET(pFileSelection)); //ERREUR ICI (SIGSEGV)
    }

Le truc ce que l'erreur apparait seulement quand j'appel CurrentObject->SetName en passant en paramètre une chaine qui fait plus de 1 caractères (?!?).

Voici le stack que j'ai lorsque je reçoi le SIGSEGV :

#0 0xb787c319	g_type_check_instance_is_a() (/usr/lib/libgobject-2.0.so.0:??)
#1 0xb7863845	g_object_ref() (/usr/lib/libgobject-2.0.so.0:??)
#2 0xb77bdc01	g_list_foreach() (/usr/lib/libglib-2.0.so.0:??)
#3 0xb7cb703a	??() (/usr/lib/libgtk-x11-2.0.so.0:??)
#4 0x821f180	??() (??:??)
#5 0xb7863810	??() (/usr/lib/libgobject-2.0.so.0:??)
#6 (	??() (??:??)

Voici le code de CurrentObject qui est de type CObject :

class CObject
{
friend class CObjectParser;

protected:
    char Name[256];
    char Path[256];
    std::vector<CFunction*> Functions;
    int Id;

public:
    int GetId();
    void SetId(int);
    int GetFunctionCount();
    void GetName(char*, unsigned long);
    void SetName(char*);
    void GetPath(char*, unsigned long);
    std::vector<CInstruction*>::iterator GetIterator();
    CObject(int, char*, char*);
    CObject();
    ~CObject();
};

Le code de SetName :

void CObject::SetName(char* val)
{
    if(strlen(val) >= 256)
        throw "CObject SetName : Buffer Overflow";

    strcpy(Name, val);
}

Merci donc à  l'ame charitable qui pourra jeter un oeil à  ce code. Il doit y avoir une subtilité mais laquelle ???

Dernière modification par Darunia (Le 05/01/2008, à 15:36)

Hors ligne

#2 Le 15/01/2008, à 00:16

Darunia

Re : SIGSEGV sur gtk_widget_destroy

Bon, problème résolu. Apres trop de soucis avecv GTK+, j'ai migré mon appli en GTK MM : beaucoup plus simple et beaucoup plus stable !

Hors ligne