Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Prova GeForce NOW upgrade Blackwell: il cloud gaming cambia per sempre
Prova GeForce NOW upgrade Blackwell: il cloud gaming cambia per sempre
L'abbonamento Ultimate di GeForce NOW ora comprende la nuova architettura Blackwell RTX con GPU RTX 5080 che garantisce prestazioni tre volte superiori alla precedente generazione. Non si tratta solo di velocità, ma di un'esperienza di gioco migliorata con nuove tecnologie di streaming e un catalogo giochi raddoppiato grazie alla funzione Install-to-Play
Ecovacs Deebot X11 Omnicyclone: niente più sacchetto per lo sporco
Ecovacs Deebot X11 Omnicyclone: niente più sacchetto per lo sporco
Deebot X11 Omnicyclone implementa tutte le ultime tecnologie Ecovacs per l'aspirazione dei pavimenti di casa e il loro lavaggio, con una novità: nella base di ricarica non c'è più il sacchetto di raccolta dello sporco, sostituito da un aspirapolvere ciclonico che accumula tutto in un contenitore rigido
Narwal Flow: con il mocio orizzontale lava i pavimenti al meglio
Narwal Flow: con il mocio orizzontale lava i pavimenti al meglio
Grazie ad un mocio rotante che viene costantemente bagnato e pulito, Narwal Flow assicura un completo e capillare lavaggio dei pavimenti di casa. La logica di intellignza artificiale integrata guida nella pulizia tra i diversi locali, sfruttando un motore di aspirazione molto potente e un sistema basculante per la spazzola molto efficace sui tappeti di casa
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 27-03-2006, 16:01   #1
Manugal
Senior Member
 
L'Avatar di Manugal
 
Iscritto dal: Jan 2001
Città: Villanova di Guidonia (RM)
Messaggi: 1079
[C] Errori sulla free() aiuto!!!!!!!!

Ciao

Ho compilato il progetto che devo consegnare per l'Università. Nelle specifiche mi si chiede che quando viene rilevato un certo tipo di errore devo liberare tutta la memoria allocata. Vi posto una parte del mio codice:

Codice:
int CreateDatabaseFile(char *Name, int NumFields, FIELD_DATA_t *FieldData){
    int i;
    char *finale;
    header *h;
    Name=(char *)malloc(sizeof(char)*DBF_NAME_LENGTH);
    h=(header *)malloc(sizeof(header)*(DBF_FIXED_HEADER_LEN+MAX_NUM_FIELDS*(DBF_FIELD_LEN+MAX_NUM_FIELDS)+2));
    FieldData=(FIELD_DATA_t *)malloc(sizeof(FIELD_DATA_t)*MAX_NUM_FIELDS);
    if((Name==NULL) || (cercaErr(Name)==1)){
       char Err1[256];
       (void) sprintf(Err1, "Nome DB nullo o non valido o NumFields<=0");
       LPC_GestioneErrore(LPC_BAD_ARG, "CreateDatabaseFile", Err1);
       free(Name);
       free(FieldData);
       free(h);
       return LPC_BAD_ARG;
    }
    
    if((NumFields<=0) || (NumFields>MAX_NUM_FIELDS)){
       char Err10[256];
       (void) sprintf(Err10, "Nome DB nullo o non valido o NumFields<=0");
       LPC_GestioneErrore(LPC_BAD_ARG, "CreateDatabaseFile", Err10);
       free(Name);
       free(FieldData);
       free(h);
       return LPC_BAD_ARG;
    }
...........
...........
...........
Quando vado ad eseguire, ad esempio il primo test, che verifica se Name==NULL, mi appare un messaggio del genere:

*** glibc detected *** double free or corruption (fasttop): 0x08053008 ***

Perché fa così? Io mi sono attenuto strettamente alle specifiche che mi sono state date (e le free() vanno messe lì).
Manugal è offline   Rispondi citando il messaggio o parte di esso
Old 27-03-2006, 16:12   #2
sottovento
Senior Member
 
L'Avatar di sottovento
 
Iscritto dal: Nov 2005
Città: Texas
Messaggi: 1722
Ciao,
se Name== NULL, quindi non hai allocato memoria, tenti di deallocarla. Ovviamente avrai l'errore indicato.

High Flying
Sottovento
sottovento è offline   Rispondi citando il messaggio o parte di esso
Old 27-03-2006, 16:22   #3
Manugal
Senior Member
 
L'Avatar di Manugal
 
Iscritto dal: Jan 2001
Città: Villanova di Guidonia (RM)
Messaggi: 1079
Ma Name io l'ho allocata poco prima, quello è solo un controllo.
Manugal è offline   Rispondi citando il messaggio o parte di esso
Old 27-03-2006, 16:24   #4
Manugal
Senior Member
 
L'Avatar di Manugal
 
Iscritto dal: Jan 2001
Città: Villanova di Guidonia (RM)
Messaggi: 1079
Cmq ho provato a toglierla ma mi dà lo stesso errore
Manugal è offline   Rispondi citando il messaggio o parte di esso
Old 27-03-2006, 16:32   #5
sottovento
Senior Member
 
L'Avatar di sottovento
 
Iscritto dal: Nov 2005
Città: Texas
Messaggi: 1722
Ciao,
nel codice da te pubblicato, ho visto che allochi memoria per diverse variabili. Una volta allocata, dovresti controllare che l'allocazione sia andata a buon fine, cioe' che il puntatore abbia valore diverso da NULL.

Anche se hai tolto quella free(), ne hai lasciate altre che vanno a deallocare, pur non sapendo se l'allocazione precedente e' andata a buon fine.

Per esempio, fai una
free (h);

se h == NULL hai ancora lo stesso problema.
Ti ricordo che l'allocazione potrebbe fallire non solo quando chiedi un quantitativo di memoria non disponibile, ma anche se i parametri sono errati e se richiedi di allocare 0 byte.

Per tagliare la testa al toro, prima di deallocare potresti fare

if (h != NULL)
free (h);

Cmq DEVI mettere il controllo sull'esito dell'allocazione. E' imperativo!

High Flying
Sottovento
sottovento è offline   Rispondi citando il messaggio o parte di esso
Old 27-03-2006, 16:47   #6
Manugal
Senior Member
 
L'Avatar di Manugal
 
Iscritto dal: Jan 2001
Città: Villanova di Guidonia (RM)
Messaggi: 1079
Ah quindi tu dici di fare una cosa del genere appena va incontro ad un errore:

Codice:
if((Name==NULL) || (cercaErr(Name)==1)){
       char Err1[256];
       (void) sprintf(Err1, "Nome DB nullo o non valido o NumFields<=0");
       LPC_GestioneErrore(LPC_BAD_ARG, "CreateDatabaseFile", Err1);
       free(Name);
       if(FieldData!=NULL)
          free(FieldData);
       if(h!=NULL)
          free(h);
       return LPC_BAD_ARG;
    }
Ora provo e ti faccio sapere Grazie

Ultima modifica di Manugal : 27-03-2006 alle 16:50.
Manugal è offline   Rispondi citando il messaggio o parte di esso
Old 27-03-2006, 16:57   #7
Manugal
Senior Member
 
L'Avatar di Manugal
 
Iscritto dal: Jan 2001
Città: Villanova di Guidonia (RM)
Messaggi: 1079
Niente da fare sempre lo stesso messaggio

Posto il codice con le modifiche:

Codice:
int CreateDatabaseFile(char *Name, int NumFields, FIELD_DATA_t *FieldData){
    int i;
    char *finale;
    header *h;
    Name=(char *)malloc(sizeof(char)*DBF_NAME_LENGTH);
    h=(header *)malloc(sizeof(header)*(DBF_FIXED_HEADER_LEN+MAX_NUM_FIELDS*(DBF_FIELD_LEN+MAX_NUM_FIELDS)+2));
    FieldData=(FIELD_DATA_t *)malloc(sizeof(FIELD_DATA_t)*MAX_NUM_FIELDS);
    if((Name==NULL) || (cercaErr(Name)==1)){
       char Err1[256];
       (void) sprintf(Err1, "Nome DB nullo o non valido o NumFields<=0");
       LPC_GestioneErrore(LPC_BAD_ARG, "CreateDatabaseFile", Err1);
       if(h!=NULL)
          free(h);
       if(FieldData!=NULL)
          free(FieldData);
       return LPC_BAD_ARG;
    }
    
    if((NumFields<=0) || (NumFields>MAX_NUM_FIELDS)){
       char Err10[256];
       (void) sprintf(Err10, "Nome DB nullo o non valido o NumFields<=0");
       LPC_GestioneErrore(LPC_BAD_ARG, "CreateDatabaseFile", Err10);
       if(Name!=NULL)
          free(Name);
       if(h!=NULL)
          free(h);
       if(FieldData!=NULL)
          free(FieldData);
       return LPC_BAD_ARG;
    }
    if(FieldData==NULL){
       char Err4[256];
       (void) sprintf(Err4, "Errore allocazione memoria");
       LPC_GestioneErrore(LPC_NO_MEMORY, "CreateDatabaseFile", Err4);
       if(Name!=NULL)
          free(Name);
       if(h!=NULL)
          free(h);
       return LPC_NO_MEMORY;
....
....
....
Manugal è offline   Rispondi citando il messaggio o parte di esso
Old 27-03-2006, 17:31   #8
Manugal
Senior Member
 
L'Avatar di Manugal
 
Iscritto dal: Jan 2001
Città: Villanova di Guidonia (RM)
Messaggi: 1079
Qualcuno mi aiuta? Sto uscendo quasi pazzo
Manugal è offline   Rispondi citando il messaggio o parte di esso
Old 27-03-2006, 17:55   #9
heroth
Junior Member
 
Iscritto dal: Nov 2004
Città: Aosta
Messaggi: 12
Sei sicuro di non eseguire più di una volta la free()?
heroth è offline   Rispondi citando il messaggio o parte di esso
Old 27-03-2006, 18:30   #10
Manugal
Senior Member
 
L'Avatar di Manugal
 
Iscritto dal: Jan 2001
Città: Villanova di Guidonia (RM)
Messaggi: 1079
In che senso scusa..

La free() l'ho scritta come la vedi anche tu.
Manugal è offline   Rispondi citando il messaggio o parte di esso
Old 27-03-2006, 18:30   #11
wingman87
Senior Member
 
Iscritto dal: Nov 2005
Messaggi: 2774
Le ultime 4 righe degli if sono uguali, prova a metterle fuori dagli if alla fine, così non può dire che l'hai fatto 2 volte...

Ultima modifica di wingman87 : 27-03-2006 alle 21:16.
wingman87 è offline   Rispondi citando il messaggio o parte di esso
Old 27-03-2006, 19:17   #12
heroth
Junior Member
 
Iscritto dal: Nov 2004
Città: Aosta
Messaggi: 12
nel senso che magari hai più condizioni di errore vere (if) e pertanto iteri la free sempre sullo stesso puntatore. Potresti effettuare la free e dopo mettere a null il puntatore appena liberato per vedere o se funziona o se hai un nuovo errore... da lì dovresti dedurne qualcosa
heroth è offline   Rispondi citando il messaggio o parte di esso
Old 27-03-2006, 21:42   #13
Qu@ker
Member
 
Iscritto dal: Apr 2004
Messaggi: 130
Codice:
jcd@big:~$ man 3 free | sed -ne '23,28p'

       free() frees the memory space pointed to by ptr, which must  have  been
       returned by a previous call to malloc(), calloc() or realloc().  Other-
       wise, or if free(ptr) has already been called before, undefined  behav-
       iour occurs.  If ptr is NULL, no operation is performed.

jcd@big:~$
Qu@ker è offline   Rispondi citando il messaggio o parte di esso
Old 27-03-2006, 22:00   #14
vlacus
Member
 
L'Avatar di vlacus
 
Iscritto dal: May 2003
Messaggi: 118
hai provato con mtrace?
__________________
forum che tratta di calcolatrici grafiche in genere: consigli e aiuti www.helpcalculator.tk
vlacus è offline   Rispondi citando il messaggio o parte di esso
Old 27-03-2006, 22:05   #15
Manugal
Senior Member
 
L'Avatar di Manugal
 
Iscritto dal: Jan 2001
Città: Villanova di Guidonia (RM)
Messaggi: 1079
Eccomi

Allora nelle specifiche che mi hanno dato mi viene chiesto espressamente di liberare tutta la memoria allocata in quei punti dove si gestiscono gli errori. Però non ho capito cosa dovrei provare (sono un po' di coccio ). Cioè devo fare la free nella gestione dell'errore e poi controllo se quello che ho appena liberato è NULL? Cmq se può esservi utile vi posto la funzione che esegue i test.

Codice:
/*!
*	\addtogroup Modulo1
*	\{
*/
/*!
*	\addtogroup TestModulo1 Specifiche per il Test
*	\{
*/

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include "LPC_M1_Include.h"


void TestCreate(void);	//!< Funzione di Test per la CreateDatabaseFile()
void TestDelete(void);	//!< Funzione di Test per la DeleteDatabaseFile()
void Result(char *Func);	//!< Funzione di calcolo e stampa risultati



// Vettori per gli id dei test, il check e i pesi relativi
#define MAX_TEST 100
typedef struct {
	int testid;
	int weight;
	char desc[256];
	int passed;
} TEST_t;
		
static int numtest;
static TEST_t test[MAX_TEST];

/*!
*	\brief Test per le funzioni di interfaccia del Modulo 1
*
* Programma di test per il Modulo 1
*
* Ogni test e' identificato da un numero cosi' composto:\n
* \p xyynn \n
*  x	Id del modulo\n
* yy	Id della funzione\n
* nn	Id del test\n
*
* Ogni test ha anche un peso che viene indicato nella stampa dei risultati.
* I test di funzionalit�hanno i pesi piu' elevati.
*
* Tramite menu possono essere richiamate sia le singole funzioni di test TestCreate() e TestDelete(),
* che un test completo con un punteggio finale.
*
* Vengono effettuati i seguenti controlli: 
* - Creazione (CreateDatabaseFile()): 
*   - Nome del DBF errato (NULL o caratteri non validi o inizio non valido)
*   - Numero campi non valido
*   - FieldData non valido
*   - Campo non valido (Nome, Tipo o Lunghezza o gia' esistente)
*   - File gia' esistente
*   - Verifica funzionalita'
*   - Verifica creazione corretta (confronto binario con template)
*
* - Cancellazione (DeleteDatabaseFile()):
*   - Nome del DBF errato (NULL o caratteri non validi o inizio non valido)
*   - DBF non esistente
*   - DBF aperto
*   - Verifica funzionalita'
* 
****************************************************/


int main(int argc, char **argv)
{
	char scelta[10];
	int sel;

	printf("Programma di Test per il modulo 1\n\n");


	for(;;)
	{
		printf("\t1. Test funzione CreateDatabase\n");
		printf("\t2. Test funzione DeleteDatabase\n");
		printf("\t3. Test completo e valutazione\n");
		printf("\n\t0. Uscita\n");
		printf("\n\nScelta: ");

		(void) fgets(scelta, sizeof(scelta), stdin);
		sel = atoi(scelta);
		Result(NULL);
		switch(sel)
		{
		case 0:
			printf("Bye!\n\n");
			return(0);
		case 1:
			TestCreate();
			break;
		case 2:
			TestDelete();
			break;
		case 3:
			TestCreate();
			TestDelete();
			break;
		default:
			printf("Scelta errata...\n");
			break;;
		}
	}
}

/*********************************
* \brief Richiama le funzioni per il test della CreateDatabaseFile()
**********************************/

void TestCreate(void)
{
	int ret= 0;
	int NumFields = 0;
	FILE *fp;
	FIELD_DATA_t FieldData[MAX_NUM_FIELDS];
	int len, len1;
	char buf[500], buftest[500];

	printf("Test CREATE\n");
    
// Test sul nome
	// null
	test[numtest].testid = 10101;
	test[numtest].weight = 3;
	strcpy(test[numtest].desc, "CREATE: nome NULL");
	printf("Test:[%d] Peso:[%d] - [%s]\n", test[numtest].testid, test[numtest].weight,test[numtest].desc);
	ret = CreateDatabaseFile(NULL, NumFields, &FieldData[0]);
	printf("Ritorno della create: [%d]\n\n", ret);
	if (ret != LPC_OK)
		test[numtest].passed = 1;
	numtest++;

	// Non valido
	test[numtest].testid = 10102;
	test[numtest].weight = 1;
	strcpy(test[numtest].desc, "CREATE: nome non valido");
	printf("Test:[%d] Peso:[%d] - [%s]\n", test[numtest].testid, test[numtest].weight,test[numtest].desc);
	ret = CreateDatabaseFile("PIppo-1", NumFields, &FieldData[0]);
	printf("Ritorno della create: [%d]\n\n", ret);
	if (ret != LPC_OK)
		test[numtest].passed = 1;
	numtest++;

	test[numtest].testid = 10103;
	test[numtest].weight = 1;
	strcpy(test[numtest].desc, "CREATE [%d]: nome non valido (2)");
	printf("Test:[%d] Peso:[%d] - [%s]\n", test[numtest].testid, test[numtest].weight,test[numtest].desc);
	ret = CreateDatabaseFile("_pippo", NumFields, &FieldData[0]);
	printf("Ritorno della create: [%d]\n\n", ret);
	if (ret != LPC_OK)
		test[numtest].passed = 1;
	numtest++;


// NumFields
	test[numtest].testid = 10104;
	test[numtest].weight = 3;
	strcpy(test[numtest].desc, "CREATE: NumFields nonvalido");
	printf("Test:[%d] Peso:[%d] - [%s]\n", test[numtest].testid, test[numtest].weight,test[numtest].desc);
	ret = CreateDatabaseFile("Prova", 0, &FieldData[0]);
	printf("Ritorno della create: [%d]\n\n", ret);
	if (ret != LPC_OK)
		test[numtest].passed = 1;
	numtest++;

	test[numtest].testid = 10105;
	test[numtest].weight = 3;
	strcpy(test[numtest].desc, "CREATE: NumFields nonvalido (2)");
	printf("Test:[%d] Peso:[%d] - [%s]\n", test[numtest].testid, test[numtest].weight,test[numtest].desc);
	ret = CreateDatabaseFile("Prova", MAX_NUM_FIELDS+1, &FieldData[0]);
	printf("Ritorno della create: [%d]\n\n", ret);
	if (ret != LPC_OK)
		test[numtest].passed = 1;
	numtest++;

// FieldData
	test[numtest].testid = 10106;
	test[numtest].weight = 3;
	strcpy(test[numtest].desc, "CREATE: FieldData nonvalido");
	printf("Test:[%d] Peso:[%d] - [%s]\n", test[numtest].testid, test[numtest].weight,test[numtest].desc);
	ret = CreateDatabaseFile("Prova", 5, NULL);
	printf("Ritorno della create: [%d]\n\n", ret);
	if (ret != LPC_OK)
		test[numtest].passed = 1;
	numtest++;


// Campo non valido 
/*** Test del Nome, Tipo, Lunghezza *****/
	test[numtest].testid = 10107;
	test[numtest].weight = 1;
	strcpy(test[numtest].desc, "CREATE: Nome campo non valido");
	printf("Test:[%d] Peso:[%d] - [%s]\n", test[numtest].testid, test[numtest].weight,test[numtest].desc);
	NumFields = 1;
	strcpy(FieldData[0].Name, "_Campo1");
	FieldData[0].FieldType = CHARACTER;
	FieldData[0].FieldLen = 10;
	ret = CreateDatabaseFile("Prova", NumFields, FieldData);
	printf("Ritorno della create: [%d]\n\n", ret);
	if (ret != LPC_OK)
		test[numtest].passed = 1;
	numtest++;

	test[numtest].testid = 10108;
	test[numtest].weight = 3;
	strcpy(test[numtest].desc, "CREATE: Tipo campo non valido");
	printf("Test:[%d] Peso:[%d] - [%s]\n", test[numtest].testid, test[numtest].weight,test[numtest].desc);
	NumFields = 1;
	strcpy(FieldData[0].Name, "Campo1");
	FieldData[0].FieldType = 15;
	FieldData[0].FieldLen = 10;
	ret = CreateDatabaseFile("Prova", NumFields, FieldData);
	printf("Ritorno della create: [%d]\n\n", ret);
	if (ret != LPC_OK)
		test[numtest].passed = 1;
	numtest++;

	test[numtest].testid = 10109;
	test[numtest].weight = 2;
	strcpy(test[numtest].desc, "CREATE: Lunghezza campo non valida");
	printf("Test:[%d] Peso:[%d] - [%s]\n", test[numtest].testid, test[numtest].weight,test[numtest].desc);
	NumFields = 1;
	strcpy(FieldData[0].Name, "Campo1");
	FieldData[0].FieldType = CHARACTER;
	FieldData[0].FieldLen = FIELD_CHAR_LEN+1;
	ret = CreateDatabaseFile("Prova", NumFields, FieldData);
	printf("Ritorno della create: [%d]\n\n", ret);
	if (ret != LPC_OK)
		test[numtest].passed = 1;
	numtest++;

	test[numtest].testid = 10110;
	test[numtest].weight = 2;
	strcpy(test[numtest].desc, "CREATE: Campo gia' esistente");
	printf("Test:[%d] Peso:[%d] - [%s]\n", test[numtest].testid, test[numtest].weight,test[numtest].desc);
	NumFields = 2;
	strcpy(FieldData[0].Name, "Campo1");
	FieldData[0].FieldType = CHARACTER;
	FieldData[0].FieldLen = 10;
	strcpy(FieldData[1].Name, "Campo1");
	FieldData[1].FieldType = CHARACTER;
	FieldData[1].FieldLen = 10;
	ret = CreateDatabaseFile("Prova", NumFields, FieldData);
	printf("Ritorno della create: [%d]\n\n", ret);
	if (ret != LPC_OK)
		test[numtest].passed = 1;
	numtest++;

// File esistente
	test[numtest].testid = 10111;
	test[numtest].weight = 4;
	strcpy(test[numtest].desc, "CREATE: DBF esistente");
	printf("Test:[%d] Peso:[%d] - [%s]\n", test[numtest].testid, test[numtest].weight,test[numtest].desc);
	fp = fopen("Prova.dbf", "w");
	fclose(fp);
	NumFields = 1;
	strcpy(FieldData[0].Name, "Campo1");
	FieldData[0].FieldType = CHARACTER;
	FieldData[0].FieldLen = 10;
	ret = CreateDatabaseFile("Prova", NumFields, FieldData);
	printf("Ritorno della create: [%d]\n\n", ret);
	remove("Prova.dbf");
	if (ret != LPC_OK)
		test[numtest].passed = 1;
	numtest++;

// Funzionalita'
	NumFields = 6;
	strcpy(FieldData[0].Name, "Campo1");
	FieldData[0].FieldType = CHARACTER;
	FieldData[0].FieldLen = 10;

	strcpy(FieldData[1].Name, "Campo2");
	FieldData[1].FieldType = NUMERIC;

	strcpy(FieldData[2].Name, "Campo3");
	FieldData[2].FieldType = DATE;

	strcpy(FieldData[3].Name, "Campo4");
	FieldData[3].FieldType = LOGICAL;

	strcpy(FieldData[4].Name, "Campo5");
	FieldData[4].FieldType = CHARACTER;
	FieldData[4].FieldLen = 1;

	strcpy(FieldData[5].Name, "Campo6");
	FieldData[5].FieldType = NUMERIC;

	test[numtest].testid = 10112;
	test[numtest].weight = 10;
	strcpy(test[numtest].desc, "CREATE: Funzionalita'");
	printf("Test:[%d] Peso:[%d] - [%s]\n", test[numtest].testid, test[numtest].weight,test[numtest].desc);
	ret = CreateDatabaseFile("Prova", NumFields, &FieldData[0]);
	printf("Ritorno della create: [%d]\n", ret);
	if (ret == LPC_OK)
		test[numtest].passed = 1;
	numtest++;

// Verifica correttezza
	test[numtest].testid = 10113;
	test[numtest].weight = 10;
	strcpy(test[numtest].desc, "CREATE: Verifica correttezza");
	printf("Test:[%d] Peso:[%d] - [%s]\n", test[numtest].testid, test[numtest].weight,test[numtest].desc);
	for(;;)
	{
		ret = -1;

		fp = fopen("ProvaTest.dbf", "r");
		len = fread(buftest, sizeof(char), 500, fp);
		fclose(fp);

		fp = fopen("Prova.dbf", "r");
		len1 = fread(buf, sizeof(char), 500, fp);
		fclose(fp);
		if (len1 != len)
			break;

		// Confronto la prima parte (prima del timestamp)
		len = DBF_NAME_LENGTH+1+2+4+2+2;
		if (memcmp(buf, buftest, len))
			break;

		// Confronto la seconda parte (dopo il timestamp)
		if (memcmp(buf+len+4, buftest+len+4, len1-len-4))
			break;

		ret = LPC_OK;
		break;
	}
	if (ret == LPC_OK)
		test[numtest].passed = 1;
	numtest++;

	Result("CREATE");

}
Manugal è offline   Rispondi citando il messaggio o parte di esso
Old 27-03-2006, 22:08   #16
Manugal
Senior Member
 
L'Avatar di Manugal
 
Iscritto dal: Jan 2001
Città: Villanova di Guidonia (RM)
Messaggi: 1079
Per mtrace devo digitare mtrace <file>.c? Perché così mi dà No memory leaks.
Manugal è offline   Rispondi citando il messaggio o parte di esso
Old 28-03-2006, 00:16   #17
mr_hyde
Senior Member
 
Iscritto dal: Oct 2005
Città: Genova
Messaggi: 937
Ci sono un po' di cose che hai fatto che non ho capito benissimo:

1) perche' l'allocazione di Name? perche' l'allocazione di FieldData?
Da quello che ho capito devono solo essere in input!
2) perche' per segnalare l'errore tutte le volte ti dichiari un buffer _locale_ sempre diverso (Err1, Err10)?
Sei sicuro che LPC_GestioneErrore richieda quell'array locale?

Comunque ho buttato giu' la seg. traccia, forse ti puo' essere utile.
Ricorda che vuole solo essere una traccia, probabilmente neanche compila.

Un consiglio: quando fai una funzione, COME PRIMA COSA controlla i parametri che ti vengono passati.
Solo dopo che sei certo della correttezza dei parametri mettiti a fare il codice per la loro elaborazione.

Ciao,
Mr Hyde

Codice:
int CreateDatabaseFile(const char *Name, int NumFields, FIELD_DATA_t *FieldData)
{

	header *h      = NULL;
	char   Err[256];

	memset((void*) Err, 0x0, 256);

	/* prima e' meglio controllare questo senza disturbare le allocazioni */
	if ((NumFields<=0) || (NumFields>MAX_NUM_FIELDS))
	{
		snprintf(Err, 256, "Nome DB nullo o non valido o NumFields<=0");
		LPC_GestioneErrore(LPC_BAD_ARG, "CreateDatabaseFile", Err);
		return LPC_BAD_ARG;
	}

	if (!Name)
	{
		snprintf(Err, 256, "Parametro Name NULL ");
		LPC_GestioneErrore(LPC_BAD_ARG, "CreateDatabaseFile", Err);
		return LPC_BAD_ARG;
	}

	if (!FieldData)
	{
		snprintf(Err, 256, "Array FieldData non valido");
		LPC_GestioneErrore(LPC_BAD_ARG, "CreateDatabaseFile", Err);
		return LPC_BAD_ARG;

	}

	if (cercaErr(Name)==1)
	{
		snprintf(Err, 256, "Parametro Name invalido ");
		LPC_GestioneErrore(LPC_BAD_ARG, "CreateDatabaseFile", Err);
		return LPC_BAD_ARG;
	}

	h = (header *) malloc(sizeof(header)*(DBF_FIXED_HEADER_LEN+MAX_NUM_FIELDS*(DBF_FIELD_LEN+MAX_NUM_FIELDS)+2));
	if (!h)
	{
		snprintf(Err, 256, "Errore allocazione header");
		LPC_GestioneErrore(LPC_BAD_ALLOC, "CreateDatabaseFile", Err);
		return LPC_BAD_ALLOC;
	}
 
       [...]
}
__________________
MacMini Late 2009/MacMini 2018

Ultima modifica di mr_hyde : 28-03-2006 alle 00:26. Motivo: correzione snprintf
mr_hyde è offline   Rispondi citando il messaggio o parte di esso
Old 28-03-2006, 08:45   #18
ilsensine
Senior Member
 
L'Avatar di ilsensine
 
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
La mia opinione è che il doppio free viene fatto da una libreria di runtime che utilizzi. Potrebbe non essere un errore tuo, quindi; mi sono capitati casi simili.
L'errore ti capita durante l'esecuzione del programma o alla sua chiusura?
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al
andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12
ilsensine è offline   Rispondi citando il messaggio o parte di esso
Old 28-03-2006, 11:44   #19
Manugal
Senior Member
 
L'Avatar di Manugal
 
Iscritto dal: Jan 2001
Città: Villanova di Guidonia (RM)
Messaggi: 1079
L'errore mi capita in fase di esecuzione dei test. Cmq avevo allocato anche Name e FieldData perché senza allocarli mi dava un segmentation fault. Per quanto riguarda i buffer degli errori si devo allocarli per ogni gestione dell'errore (magari è sufficiente anche allocarne solo 1 invece di fare da Err1 a Err11, questo sì).

Ora che ho provato a togliere l'allocazione di FieldData e Name mi da questo errore (sempre in esecuzione):

*** glibc detected *** free(): invalid pointer: 0xbfea31fa ***

x MrHyde:

hai scritto il codice esattamente come l'avevo scritto io senza le free(). Senza le free funziona però sorgono due problemi:

1 - Le free() sono richieste dalle specifiche
2 - Se non metto le free (credo dipendano da loro) in alcuni test in cui mi deve ritornare un certo errore, me ne ritorna un altro (ad esempio, nel test che verifica se il file del database esiste, mi ritorna un altro errore che non c'entra niente, mentre io gli ho scritto esplicitamente di tornare l'errore associato a quell'evento)

Ultima modifica di Manugal : 28-03-2006 alle 11:47.
Manugal è offline   Rispondi citando il messaggio o parte di esso
Old 28-03-2006, 12:07   #20
ilsensine
Senior Member
 
L'Avatar di ilsensine
 
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
Quote:
Originariamente inviato da Manugal
*** glibc detected *** free(): invalid pointer: 0xbfea31fa ***
Quell'indirizzo cade all'interno dello stack, quindi ovviamente non è valido per la free.
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al
andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12
ilsensine è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Prova GeForce NOW upgrade Blackwell: il cloud gaming cambia per sempre Prova GeForce NOW upgrade Blackwell: il cloud ga...
Ecovacs Deebot X11 Omnicyclone: niente più sacchetto per lo sporco Ecovacs Deebot X11 Omnicyclone: niente più...
Narwal Flow: con il mocio orizzontale lava i pavimenti al meglio Narwal Flow: con il mocio orizzontale lava i pav...
Panasonic 55Z95BEG cala gli assi: pannello Tandem e audio senza compromessi Panasonic 55Z95BEG cala gli assi: pannello Tande...
HONOR Magic V5: il pieghevole ultra sottile e completo! La recensione HONOR Magic V5: il pieghevole ultra sottile e co...
Larry Ellison guadagna 101 miliardi in u...
Johnson Controls amplia la gamma di solu...
NASA Perseverance: il rover potrebbe ave...
Quelli di Immuni si 'pappano' Vimeo: Ben...
Changan lancia la Deepal S05 in Europa, ...
Substrati in vetro, Intel smentisce le v...
ECOVACS DEEBOT T50 PRO OMNI Gen2 fa piaz...
Windelo 62: catamarano a vela che unisce...
Francia, in arrivo un incentivo di 1.000...
Haier, la sorpresa a IFA: la lavatrice C...
GeForce RTX 5000 SUPER in arrivo? Sembra...
Ionity prova una soluzione contro i ladr...
Pirateria, svolta clamorosa: Dazn e Lega...
Maxi richiamo Toyota e Lexus: oltre 900....
Blackwell Ultra: fino al 45% di prestazi...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 21:30.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Served by www3v