Visualizzazione dei risultati da 1 a 8 su 8
  1. #1

    [C] Errore gdb

    Cosa significa se un'esecuzione riga per riga con gdb percorre regolarmente tutto il programma ed esce all'ultima parentesi graffa (programma terminato) con un errore di questo tipo:
    Codice PHP:
    *** stack smashing detected ***: /home/cristiano/sistemioperativi/mybarcode7 terminated
    ======= Backtrace: =========
    /
    lib/tls/i686/cmov/libc.so.6(__fortify_fail+0x48)[0xb7f426d8]
    /
    lib/tls/i686/cmov/libc.so.6(__fortify_fail+0x0)[0xb7f42690]
    /
    home/cristiano/sistemioperativi/mybarcode7[0x8048ae3]
    [
    0x2d206e20]
    ======= 
    Memory map: ========
    08048000-08049000 r-xp 00000000 08:06 942187     /home/cristiano/sistemioperativi/mybarcode7
    08049000
    -0804a000 r--p 00000000 08:06 942187     /home/cristiano/sistemioperativi/mybarcode7
    0804a000
    -0804b000 rw-p 00001000 08:06 942187     /home/cristiano/sistemioperativi/mybarcode7
    09632000
    -09653000 rw-p 09632000 00:00 0          [heap]
    b7e28000-b7e35000 r-xp 00000000 08:06 819269     /lib/libgcc_s.so.1
    b7e35000
    -b7e36000 r--p 0000c000 08:06 819269     /lib/libgcc_s.so.1
    b7e36000
    -b7e37000 rw-p 0000d000 08:06 819269     /lib/libgcc_s.so.1
    b7e47000
    -b7e48000 rw-p b7e47000 00:00 0 
    b7e48000
    -b7fa0000 r-xp 00000000 08:06 835600     /lib/tls/i686/cmov/libc-2.8.90.so
    b7fa0000
    -b7fa2000 r--p 00158000 08:06 835600     /lib/tls/i686/cmov/libc-2.8.90.so
    b7fa2000
    -b7fa3000 rw-p 0015a000 08:06 835600     /lib/tls/i686/cmov/libc-2.8.90.so
    b7fa3000
    -b7fa6000 rw-p b7fa3000 00:00 0 
    b7fb4000
    -b7fb8000 rw-p b7fb4000 00:00 0 
    b7fb8000
    -b7fd2000 r-xp 00000000 08:06 819264     /lib/ld-2.8.90.so
    b7fd2000
    -b7fd3000 r-xp b7fd2000 00:00 0          [vdso]
    b7fd3000-b7fd4000 r--p 0001a000 08:06 819264     /lib/ld-2.8.90.so
    b7fd4000
    -b7fd5000 rw-p 0001b000 08:06 819264     /lib/ld-2.8.90.so
    bfac0000
    -bfad5000 rw-p bffeb000 00:00 0          [stack]

    Program received signal SIGABRTAborted.
    0xb7fd2430 in __kernel_vsyscall () 
    Sembra che le istruzioni non abbiano problemi ma solo l'uscita.

  2. #2
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    Hai qualcosa nel programma che corrompe lo stack. Il fatto che tutto sembra filare liscio fino alla fine è fortuna.
    This code and information is provided "as is" without warranty of any kind, either expressed
    or implied, including but not limited to the implied warranties of merchantability and/or
    fitness for a particular purpose.

  3. #3
    Ti ringrazio per la risposta.
    Da cosa potrebbe dipendere il fatto che lo stack si corrompe?
    Il programma usa più processi e lancia delle exec. Può dipendere da questo?

  4. #4
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    Non so. Senza codice è difficile dire qualcosa. Probabilmente stai scrivendo oltre il limite di un array di char. (un tipico buffer overflow insomma)
    This code and information is provided "as is" without warranty of any kind, either expressed
    or implied, including but not limited to the implied warranties of merchantability and/or
    fitness for a particular purpose.

  5. #5
    Scusami se approfitto della tua gentilezza. Il codice è questo:
    Codice PHP:
    #include <stdio.h>
    #include <stdlib.h>
    #include <sys/wait.h>

    #include <sys/types.h>
    #include <unistd.h>
    #include <string.h>
    #include <fcntl.h>
    #include <sys/stat.h>
    #define PERM 0777
    main(){
        
    char codice[14]; //il barcode è EAN 13
        
    char nome[15],nome1[15],nome2[15];
        
    char ext1[]=".ps";//Stringa per estensione .ps
        
    char ext2[]=".jpg";//Stringa per estensione .jpg
        
    FILE *pb;//Descrittore di file per la pipe convert | barcode
        
    FILE *fps;//Descrittore del file .ps
        
    FILE *fjpg;//Descrittore per il test dell'esistenza del file jpg
        
    char rb[]="barcode -b ";
        
    int n;//Variabile per la lettura caratteri dalla pipe
        
    char e;//Variabile per controllo uscita finale
        
    pid_t pconvert,pmostra;//pid per il processo che converte il file .ps e per il processo che lancia Image Viewer
        
    printf("\nInserire il codice EAN\n");
        
    scanf("%s",codice);
           
    printf("\nInserire il nome del prodotto\n");
        
    scanf("%s"nome);
        
    strcpy(nome1,nome);
        
    strcpy(nome2,nome);
        
    strcat(nome1,ext1);
        
    strcat(nome2,ext2);
        
    strcat(rb,codice);
        
    strcat(rb," n -E -e ean -u mm -g 60x25+1+1");
        
    printf("rb %s \n",rb);
        
    fps=fopen(nome1,"w");
        if((
    pb=popen(rb,"r"))==NULL){
                         
    printf("Errore popen non riuscita\n");
                         exit(-
    1);
                        }    
                        while((
    n=fgetc(pb)) != EOF ){//Copia dalla pipe al file
                                              
    fputc(n,fps);
                                             }
                       
    fclose(fps);
                       
    pclose(pb);
        
    pconvert=fork();//crea un processo per lanciare il comando convert e lasciare il processo padre aperto per eseguire i comandi successivi
        
    if(pconvert 0){
                  
    printf("Fork per conversione file fallita\n");
                  exit(-
    2);
                }
        if(
    pconvert == 0){//sono nel processo figlio per la conversione del file
                  
    execlp("convert","convert",nome1,nome2,NULL);
                 }
        if(
    pconvert>0){
                   
    wait(NULL);//sono nel processo padre e aspetto che termini la conversione
                   
    unlink(nome1);//Cancello il file .ps
                   
    pmostra=fork();//crea un processo per lanciare Image Viewer
                   
    if(pmostra 0){
                              
    printf("Fork per Image Viewer fallita\n");
                              exit(-
    3);
                           }
                   if(
    pmostra == 0){//sono nel processo figlio per il lancio dell'applicazione gimp
                        
    fjpg=fopen(nome2,"rb");
                        if(
    fjpg == NULL){
                                       
    printf("Errore, conversione a jpg non riuscita\n");
                                       exit(-
    4);
                                        }
                        
    fclose(fjpg);
                                    
    execlp("gpicview","gpicview",nome2,NULL);//lancia l'apertura del nuovo file con Image Viewer
                                   
    }                    
                   if(
    pmostra>0){
                         
    printf("Premere il tasto e per chiudere Image Viewer e uscire\n");
                         while(
    != 'e'){
                                 
    scanf("%c",&e);
                                }
                              }
                }
            
    kill(pmostra,SIGTERM);//Termina Image Viewer
            
    wait(NULL);//Aspetta la fine di tutti i processi figli
            
    return 0;
            } 
    L'istruzione forse più sospetta potrebbe essere la copia di caratteri del file postscript eseguita dalla pipe. Però il file viene convertito ed eliminato correttamente, il che mi fa pensare che l'istruzione sia corretta.

  6. #6
    non ho studiato il tuo codice ma vorrei lo stesso suggerirti:
    prima di tutto ti consiglio di scaricarti anjuta. Se hai un makefile puoi indicare questo come progetto ed eseguire il debugging passo passo utilizzando sempre gdb ma visuale.
    In alternativa, se preferisci, puoi usare code::block, in questo caso devi crearti un progetto ad hoc.
    secondo piuttosto che utilizzare la coppia fork/exec utilizzerei sempre popen (che d'altronde questo fa al suo interno) ed hai un controllo più immediato del flusso.
    ciao
    sergio

  7. #7
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    Il problema è qui:
    codice:
    char rb[]="barcode -b ";
    quel buffer è insufficiente per ospitare anche codice più tutta questa roba:
    codice:
    strcat(rb," n -E -e ean -u mm -g 60x25+1+1");
    This code and information is provided "as is" without warranty of any kind, either expressed
    or implied, including but not limited to the implied warranties of merchantability and/or
    fitness for a particular purpose.

  8. #8
    Grazie mille!
    Effettivamente è così, dopo il tuo suggerimento ho dichiarato la dimensione di rb e non mi da più errori.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.