Visualizzazione dei risultati da 1 a 7 su 7
  1. #1
    Utente di HTML.it L'avatar di Kilin
    Registrato dal
    Mar 2003
    Messaggi
    453

    [C] mi aiutate a capire questo errore? Access not within mapped region at address 0

    Ho un problema in un'applicazione che sto sviluppando il C. Avevo un segmentation fault (che si manifestava di rado ma sempre in uno stessa funzione ad una stessa riga), così ho usato un tool per debuggare. Ecco la parte di codice coinvolta, e il backtrace. Se ho capito bene il problema è che nella fwrite (che legge da buff) a un certo punto si cerca di leggere 2 byte dall'indirizzo 0x00 ( Access not within mapped region at address 0x0), solo che non capisco come sia possibile (tra la malloc e la fwrite c'è solo la receive, che non penso proprio possa azzerarmi il puntatore): il controllo sulla memalloc() (che potrebbe restituire NULL) c'è... quindi non capisco come possa capitare l'errore. Potete dirmi se c'è qualcosa che mi sfugge? Ho ristretto molto il campo, ma non ne vengo a capo...

    codice:
    	char * buff, *temp;
            FILE *fp;
    	long dim;
    	//... in temp è memorizzato un file path
    	buff = malloc(dim); // buffer dove verrà copiato il file ricevuto
    	if(buff == NULL){
    		printf("ERRORE: Impossibile allocare memoria dinamica\n");
    		exit(1);
    	}
    
    	// la socket_receive() è solo una mia interfaccia alla rcv(), non fa altro che chiamarla
    	// e gestire eventuali errori
    	active_session = socket_receive(sk, buff, dim, DONT_QUIT_IF_FAIL); // ricevo il file
    
    	fp = fopen(temp,"w"); // lo salvo
    
    	free(temp);
    
    	ret = fwrite(buff,1,dim,fp); // <------ la lettura errata occorre a questa riga
    codice:
    ==11326== Invalid read of size 2
    ==11326==    at 0x40AE7EC: fwrite (iofwrite.c:43)
    ==11326==    by 0x80497BD: serve_request (thread-management.c:204)
    ==11326==    by 0x403E80D: start_thread (pthread_create.c:300)
    ==11326==    by 0x411E7ED: clone (clone.S:130)
    ==11326==  Address 0x0 is not stack'd, malloc'd or (recently) free'd
    ==11326== 
    ==11326== 
    ==11326== Process terminating with default action of signal 11 (SIGSEGV)
    ==11326==  Access not within mapped region at address 0x0
    ==11326==    at 0x40AE7EC: fwrite (iofwrite.c:43)
    ==11326==    by 0x80497BD: serve_request (thread-management.c:204)
    ==11326==    by 0x403E80D: start_thread (pthread_create.c:300)
    ==11326==    by 0x411E7ED: clone (clone.S:130)
    ==11326==  If you believe this happened as a result of a stack
    ==11326==  overflow in your program's main thread (unlikely but
    ==11326==  possible), you can try to increase the size of the
    ==11326==  main thread stack using the --main-stacksize= flag.
    ==11326==  The main thread stack size used in this run was 8388608.
    grazie..

  2. #2
    Io verificherei il valore restituito dalla fopen.
    Amaro C++, il gusto pieno dell'undefined behavior.

  3. #3
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    Controllerei anche la fwrite. Non è che hai invertito i campi?
    codice:
    ret = fwrite(buff,dim,1 ,fp);
    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.

  4. #4
    Utente di HTML.it L'avatar di Kilin
    Registrato dal
    Mar 2003
    Messaggi
    453
    Shodan: i campi dovrebbero essere nel giusto ordine: io intendevo leggere un byte alla volta un file di dimensione "dim" byte. Il man dice:

    size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream);

    The function fwrite() writes nmemb elements of data, each size bytes
    long, to the stream pointed to by stream, obtaining them from the loca‐
    tion given by ptr.

    MItaly: ho inserito dei controlli (me n'ero dimenticato)... ora vediamo se ricapita...

    grazie dell'aiuto

  5. #5
    Perché dici, "leggere" quando poi usi la fwrite?
    Il programma è multi-thread? Sei sicuro d'avere accesso esclusivo a buff? (è una variabile globale?)

  6. #6
    Utente di HTML.it L'avatar di Kilin
    Registrato dal
    Mar 2003
    Messaggi
    453
    l'applicazione è multithreaded, ma buff non è globale.

    Dico "leggere" perchè è l'errore che riporta una lettura non valida, presumo perchè nel fare la fwrite() si legge dal buffer prima di scrivere sul file..

  7. #7
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Visualizza il valore dei parametri prima di chiamare la fwrite ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

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 © 2024 vBulletin Solutions, Inc. All rights reserved.