Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Marvel's Wolverine, la recensione: Logan torna protagonista in un'avventura brutale e intensa
Marvel's Wolverine, la recensione: Logan torna protagonista in un'avventura brutale e intensa
Marvel's Wolverine porta Logan in un'avventura inedita, violenta e fortemente narrativa, costruita attorno alla sua natura di combattente e al difficile rapporto con il proprio passato. Insomniac Games punta su combattimenti spettacolari, progressione e personalizzazione, inserendo l'azione in un mondo segnato dalla persecuzione dei mutanti. Un viaggio intenso, che alterna mattanza, esplorazione e momenti sorprendentemente emotivi.
DJI Romo 2: tante novità lo rendono un robot completo
DJI Romo 2: tante novità lo rendono un robot completo
Romo 2 è la seconda generazione di robot lavapavimenti di DJI, un modello che si caratterizza per la precisione nel sistema di navigazione e per il funzionamento particolarmente silenzioso. Con le modifiche introdotte in questa seconda versione, e un posizionamento di prezzo più allineato alla concorrenza, rappresenta una valida alternativa sul mercato delle soluzioni di pulizia domestica
Sony Bravia 9 II: il True RGB alla prova, dove l'LCD sfida l'OLED
Sony Bravia 9 II: il True RGB alla prova, dove l'LCD sfida l'OLED
Il primo Sony con retroilluminazione True RGB alla prova del banco di misura e dei contenuti: luminanza enorme, colori accurati in HDR e un antiriflesso molto efficace. I limiti sono due sole HDMI 2.1 e il blooming fuori asse
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: 2794
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


Marvel's Wolverine, la recensione: Logan torna protagonista in un'avventura brutale e intensa Marvel's Wolverine, la recensione: Logan torna p...
DJI Romo 2: tante novità lo rendono un robot completo DJI Romo 2: tante novità lo rendono un ro...
Sony Bravia 9 II: il True RGB alla prova, dove l'LCD sfida l'OLED Sony Bravia 9 II: il True RGB alla prova, dove l...
Geely EX5, un mese al volante: il SUV elettrico cinese che ci ha sorpreso (quasi) senza riserve Geely EX5, un mese al volante: il SUV elettrico ...
Mova Z70 Ultra Roller Complete: motore potente, rullo di lavaggio e l'IA a guidare Mova Z70 Ultra Roller Complete: motore potente, ...
Dopo 23 anni di silenzio, Warcraft 3 spi...
Roblox sfida l'ecosistema gaming: app st...
OpenAI accusata di plagio dai migliori m...
Altro attacco hacker dell'IA: gli agenti...
Stiamo davvero perdendo il controllo del...
Microsoft perde un pilastro: Frank Shaw ...
Diablo V annunciato a sorpresa: il colpo...
Meno di 5 euro per il 5G: l'offerta Kena...
World of Warcraft: Forever è il Classic+...
La Serie A con DAZN e Amazon Prime con l...
Giochi Ubisoft su Steam senza Ubisoft Co...
Miami Beach ha autorizzato la maxi opera...
Apple regala un altro anno di funzioni s...
Alla fine è successo davvero: Vol...
Il meglio di Amazon del weekend in uno s...
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: 14:17.


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