PDA

View Full Version : [C] Allineamento dei campi delle struct: macro che vada bene e per GCC e per Visual S


Vincenzo1968
02-01-2013, 19:03
Recentemente ho avuto un problema di segmentation fault. L'applicazione compilata con GCC a 64 bit, su Linux, funzionava correttamente. Compilata a 32 bit, con l'opzione -m32, mi dava segfault.

Debuggando con GNU gdb mi sono accorto che si trattava di un problema di allineamento dei campi delle struct. Ho risolto con la seguente macro:


#ifndef MACROS_H
#define MACROS_H

#define ATTR_ALIGNED __attribute__ ((aligned))

#endif /*MACROS_H*/


Poi, nella definizione delle struct inserisco la macro dopo ogni campo:

typedef struct tagArrayDef
{
void *pArray ATTR_ALIGNED;
int countIndexes ATTR_ALIGNED;
/*int *indexes ATTR_ALIGNED;*/
int *sizes ATTR_ALIGNED;
struct nodeTypeTag **indexes ATTR_ALIGNED;
} ArrayDef;


In questo modo il programma funziona correttamente e a 32 bit e a 64 bit.

Ma adesso ho il problema della portabilità. La macro va bene in GCC/Linux ma non in Visual Studio/Windows. Devo inserire delle macro di compilazione condizionale.

C'è un equivalente di "__attribute__ ((aligned))" in Visual Studio?

WarDuck
03-01-2013, 11:11
Mi sembra strano tu abbia dei problemi di allineamento (i processori attuali Intel non dovrebbero avere di questi problemi, non so gli AMD).

Non capisco perché dovrebbe andare in segmentation (se non erro c'è uno specifico errore per l'accesso non allineato, diverso dal segmentation), non è che fai qualche gioco strano con i puntatori non tenendo conto delle differenze di size tra 32 e 64 bit?

Analizzando la struttura hai le seguenti dimensioni:


@32bit:

void* 4 bytes
int 4 bytes
int* 4 bytes
nodeTypeTag** 4 bytes

Totale: 16 bytes.


@64bit:

void* 8 bytes
int 4 bytes
int* 8 bytes
nodeTypeTag** 8 bytes

Totale: 28 bytes (non so se fa padding tra int e int*, arrivando ad occupare 32 bytes).

Tra l'altro ti consiglio di usare i tipi in stdint.h per maggiore portabilità.

Vincenzo1968
03-01-2013, 11:59
Pure a me sembra strano(e ci stavo impazzendo sopra). Si tratta dei sorgenti del Contest 17 (http://www.hwupgrade.it/forum/showthread.php?t=2030843). Finora avevo compilato con Visual studio e il programma andava bene e a 32 bit e a 64 bit.

Compilando con GCC per linux, invece, la versione a 64 bit andava bene e la versione a 32 bit andava in crash.

Ho risolto con "__attribute__ ((aligned))".

Con visual studio si può utilizzare "__declspec(align(x))" ma va messo prima della dichiarazione della variabile. Ho risolto così:


#ifndef MACROS_H
#define MACROS_H

#if defined(_WIN32)
#define PREFIX_ALIGNED __declspec(align(4))
#define SUFFIX_ALIGNED
#else
#define SUFFIX_ALIGNED __attribute__ ((aligned))
#define PREFIX_ALIGNED
#endif

#endif /*MACROS_H*/



typedef struct tagArrayDef
{
PREFIX_ALIGNED void *pArray SUFFIX_ALIGNED;
PREFIX_ALIGNED int countIndexes SUFFIX_ALIGNED;
PREFIX_ALIGNED int *sizes SUFFIX_ALIGNED;
PREFIX_ALIGNED struct nodeTypeTag **indexes SUFFIX_ALIGNED;
} ArrayDef;

Vincenzo1968
03-01-2013, 12:57
Con l'accorgimento di cui sopra il programma funziona anche su Linux a 32 bit:

http://img812.imageshack.us/img812/3459/contest1732linux01.png
http://img707.imageshack.us/img707/641/contest1732linux02.png
http://img507.imageshack.us/img507/3082/contest1732linux03.png

:D

Senza l'accorgimento invece:

A 64 bit andava bene:
http://img690.imageshack.us/img690/3960/contest1701.jpg
http://img211.imageshack.us/img211/8607/contest1702.jpg





A 32 bit, segmentation fault:
http://img585.imageshack.us/img585/363/debug01.jpg
http://img217.imageshack.us/img217/613/debug02.jpg

Vincenzo1968
03-01-2013, 13:51
Che mi venga un colpo!

C'è anche la possibilità di usare "#pragma pack":

http://en.wikipedia.org/wiki/Data_structure_alignment

While there is no standard way of defining the alignment of structure members, some compilers use #pragma directives to specify packing inside source files. Here is an example:

#pragma pack(push) /* push current alignment to stack */
#pragma pack(1) /* set alignment to 1 byte boundary */

struct MyPackedData
{
char Data1;
long Data2;
char Data3;
};

#pragma pack(pop) /* restore original alignment from stack */

This structure would have a compiled size of 6 bytes on a 32-bit system. The above directives are available in compilers from Microsoft[1], Borland, GNU[2] and many others.


Funzionerà su entrambi i sistemi(32/64 bit) e con entrambi i compilatori(Visual Studio/GCC)?

Faccio una prova... :mbe:

cdimauro
03-01-2013, 15:18
Concordo con WarDuck: non è possibile che un programma non funzioni per questioni di allineamento. Non è possibile su x86 e x64, che possono leggere valori completamente disallineati, ma neppure coi RISC che hanno l'obbligo di leggere le word a indirizzi allineati opportunamente, perché è il compilatore che si occupa di allineare le strutture in maniera adeguata in questi casi, per evitare a monte il problema.

Il problema è sicuramente un altro. Accertati che magari non sia un bug del GCC. E' ben noto che in passato ne abbia avuti proprio sull'allineamento, perché, ad esempio, generava codice ottimizzato per le SSE, ma senza allineare correttamente lo stack a 128 bit all'inizio di una funzione, per cui a seguito di una chiamata con lo stack disallineato, la CPU andava in segmentation fault alla prima istruzione SSE che facesse accesso alle variabili locali della funzione.

Vincenzo1968
03-01-2013, 15:30
Ehm Cesare, non so che dirti.

Il fatto strano è che con Visual Studio il programma va bene a 32 e a 64 bit anche senza usare l'allineamento. Con GCC, se non uso l'allineamento, il programma a 32 bit mi crasha.
Sarà, come dici tu, un bug del GCC ma non ho trovato niente su google(ieri stavo impazzendo a forza di googlare, controllare il codice... ricontrollare il codice, rigooglare...). Fatto sta che usando l'allineamento il programma va bene per tutte le piattaforme/sistemi(32/64 bit, Visual Studio/GCC).

Boh! :confused:

Ah, il "pragma pack" non va bene. Ho provato ma con GCC/32 bit ho di nuovo il segfault.

cdimauro
03-01-2013, 16:13
E' sicuramente un bug o qualche altro motivo. Non esiste che in C si debba per forza ricorrere a direttive per l'allineamento del codice, pena la mancanza di portabilità perché il codice non funziona.

In 25 anni che ho avuto a che fare col C non m'è mai successo, e le mie applicazioni hanno girato tranquillamente su architetture a 16, 32, 64 bit, dagli 8086 ai PA-RISC di HP.

WarDuck
03-01-2013, 17:38
Dal debugger si evince che p punta ad un indirizzo sballato (0x29), bisognerebbe capire come fai ad ottenere quel valore.

Per curiosità hai provato a far stampare un sizeof di quella struttura prima a 32 e poi a 64 bit e vedere se tornano i conti?

Vincenzo1968
03-01-2013, 20:14
Faccio la prova e ti faccio sapere. Domani però che fino a poco fa ho dovuto combattere con un cliente rognosissimo e sono stanco morto.

Se vuoi dare un'occhiata ai sorgenti li trovi qui:

http://www.hwupgrade.it/forum/showpost.php?p=28533792&postcount=5

Prima che chiamasse 'sto rompi... avevo provato a compilare con GCC per Windows(MinGW) e il bello è che, come per Visual Studio, funzionano entrambe le versioni(32/64 bit) anche senza allineamento.

Mah! :confused:

Occhio: per compilare a 64 bit con GCC su Windows dovete utilizzare questa versione di MinGW:

http://sourceforge.net/projects/mingw-w64/?source=directory

http://mingw-w64.sourceforge.net/

marco.r
03-01-2013, 21:41
Tipicamente queste cose capitano o perche' da qualche parte si fa una errata assunzione sulla dimensione dei tipi (strutture e/o primitive), oppure perche' c'e' un errore di memoria "latente" che si manifesta solo in alcune condizioni.
Se "aggiustando" l'allineamento la cosa si sistema, puo' essere che sfori una struct da qualche parte (sospettato numero uno: errato o mancato ridimensionamento di quell'array di dimensione uno che usi in una delle strutture). Se la struttura ha una dimensione che non e' multiplo dell'allineamento usato (e.g. allineamento a 4 byte, struttura di 10) un eventuale sforamento non ha gravi ripercussioni perche' vai a lavorare nei byte di padding. Se invece la dimensione e' giusto un multiplo puoi finire per smadonnare nella memoria di un'altra istanza, o nello stack.

Io darei una controllata con valgrind.

Vincenzo1968
04-01-2013, 13:04
Valgrind? :confused:

Googlo un attimo, installo(se non è già installato) e ti faccio sapere.

Edit:

http://img846.imageshack.us/img846/2651/valgrind.jpg

http://www.hwupgrade.org/public/style_emoticons/default/coolface.png

marco.r
04-01-2013, 13:25
Valgrind? :confused:

Googlo un attimo, installo(se non è già installato) e ti faccio sapere.

E' un tool per l'analisi di eseguibili per linux e altri unix. Detto in termini poveri interpreta il codice x86 inserendo del codice aggiuntivo per verificare che non vengano effettuate "porcherie" come sforare array, leggere memoria non inizializzata e altre cose analoghe.

Non e' di immediato uso ma ci sono diversi tutorial online.

Dovresti trovarlo nel repository di ubuntu. Installa anche kcachegrind che e' un comodo tool grafico per visualizzarne i risultati (valgrind di suo e' solo da linea di comando).



Ci sono anche altri tool simili. Trovi qualche riferimento qua
http://code.google.com/p/address-sanitizer/wiki/ComparisonOfMemoryTools

Vincenzo1968
04-01-2013, 13:37
http://img854.imageshack.us/img854/6691/valgrindoutput.jpg

:confused: :mbe: :stordita:

Vincenzo1968
04-01-2013, 13:41
E' un tool per l'analisi di eseguibili per linux e altri unix. Detto in termini poveri interpreta il codice x86 inserendo del codice aggiuntivo per verificare che non vengano effettuate "porcherie" come sforare array, leggere memoria non inizializzata e altre cose analoghe.

Non e' di immediato uso ma ci sono diversi tutorial online.

Dovresti trovarlo nel repository di ubuntu. Installa anche kcachegrind che e' un comodo tool grafico per visualizzarne i risultati (valgrind di suo e' solo da linea di comando).



Ci sono anche altri tool simili. Trovi qualche riferimento qua
http://code.google.com/p/address-sanitizer/wiki/ComparisonOfMemoryTools

http://img267.imageshack.us/img267/6640/kcachegrind.jpg

:yeah: :winner: :yeah:

Vincenzo1968
04-01-2013, 13:46
http://img90.imageshack.us/img90/2038/libc6dgb.jpg

:confused:

Vincenzo1968
04-01-2013, 14:20
Risolto: bisognava installare libc-dbg a 32 bit: libc6-dbg:i386.

Ma adesso l'output è troppo lungo per il terminale. Ho provato a redirezionare con "> output.txt" ma crea il file con solo l'output del mio programma. L'output di valgrind viene sempre stampato a video e non riesco a leggerlo tutto. Come si fa, su Linux, a redirezionare l'output su file?


vincenzo@Ubuntu12-10-AMD64:~/Contest17$ valgrind --leak-check=yes ./Contest1732debug Files/prog01.txt > outputValgrind.txt

Vincenzo1968
04-01-2013, 15:08
Risolto. C'è l'opzione --log-file


vincenzo@Ubuntu12-10-AMD64:~/Contest17$ valgrind --leak-check=yes --log-file=outValgrind.txt ./Contest1732debug Files/prog01.txt


Ecco il log:


==30226== Memcheck, a memory error detector
==30226== Copyright (C) 2002-2012, and GNU GPL'd, by Julian Seward et al.
==30226== Using Valgrind-3.8.1 and LibVEX; rerun with -h for copyright info
==30226== Command: ./Contest1732debug Files/prog01.txt
==30226== Parent PID: 29996
==30226==
==30226== Invalid write of size 1
==30226== at 0x402C6C5: strcpy (mc_replace_strmem.c:438)
==30226== by 0x805CA2E: GetNextToken (scanner.c:296)
==30226== by 0x80584C9: Parse (parser.c:107)
==30226== by 0x804C65F: main (main.c:995)
==30226== Address 0x4202cdb is 0 bytes after a block of size 3 alloc'd
==30226== at 0x402BE41: malloc (vg_replace_malloc.c:270)
==30226== by 0x805C9FB: GetNextToken (scanner.c:294)
==30226== by 0x80584C9: Parse (parser.c:107)
==30226== by 0x804C65F: main (main.c:995)
==30226==
==30226== Invalid write of size 1
==30226== at 0x402C6C5: strcpy (mc_replace_strmem.c:438)
==30226== by 0x805CA2E: GetNextToken (scanner.c:296)
==30226== by 0x80591C2: type (parser.c:602)
==30226== by 0x805910F: decl (parser.c:579)
==30226== by 0x8058984: decl_list (parser.c:357)
==30226== by 0x8058955: program (parser.c:340)
==30226== by 0x80584D9: Parse (parser.c:112)
==30226== by 0x804C65F: main (main.c:995)
==30226== Address 0x4202d11 is 0 bytes after a block of size 1 alloc'd
==30226== at 0x402BE41: malloc (vg_replace_malloc.c:270)
==30226== by 0x805C9FB: GetNextToken (scanner.c:294)
==30226== by 0x80591C2: type (parser.c:602)
==30226== by 0x805910F: decl (parser.c:579)
==30226== by 0x8058984: decl_list (parser.c:357)
==30226== by 0x8058955: program (parser.c:340)
==30226== by 0x80584D9: Parse (parser.c:112)
==30226== by 0x804C65F: main (main.c:995)
==30226==
==30226== Invalid read of size 1
==30226== at 0x402C6AD: strcpy (mc_replace_strmem.c:438)
==30226== by 0x8059296: var_list (parser.c:632)
==30226== by 0x805911F: decl (parser.c:581)
==30226== by 0x8058984: decl_list (parser.c:357)
==30226== by 0x8058955: program (parser.c:340)
==30226== by 0x80584D9: Parse (parser.c:112)
==30226== by 0x804C65F: main (main.c:995)
==30226== Address 0x4202d11 is 0 bytes after a block of size 1 alloc'd
==30226== at 0x402BE41: malloc (vg_replace_malloc.c:270)
==30226== by 0x805C9FB: GetNextToken (scanner.c:294)
==30226== by 0x80591C2: type (parser.c:602)
==30226== by 0x805910F: decl (parser.c:579)
==30226== by 0x8058984: decl_list (parser.c:357)
==30226== by 0x8058955: program (parser.c:340)
==30226== by 0x80584D9: Parse (parser.c:112)
==30226== by 0x804C65F: main (main.c:995)
==30226==
==30226== Invalid read of size 1
==30226== at 0x805DAD3: htFind (symtab.c:78)
==30226== by 0x805E47B: scopeFind (symtab.c:407)
==30226== by 0x80592EF: var_list (parser.c:641)
==30226== by 0x805911F: decl (parser.c:581)
==30226== by 0x8058984: decl_list (parser.c:357)
==30226== by 0x8058955: program (parser.c:340)
==30226== by 0x80584D9: Parse (parser.c:112)
==30226== by 0x804C65F: main (main.c:995)
==30226== Address 0x4202d11 is 0 bytes after a block of size 1 alloc'd
==30226== at 0x402BE41: malloc (vg_replace_malloc.c:270)
==30226== by 0x805C9FB: GetNextToken (scanner.c:294)
==30226== by 0x80591C2: type (parser.c:602)
==30226== by 0x805910F: decl (parser.c:579)
==30226== by 0x8058984: decl_list (parser.c:357)
==30226== by 0x8058955: program (parser.c:340)
==30226== by 0x80584D9: Parse (parser.c:112)
==30226== by 0x804C65F: main (main.c:995)
==30226==
==30226== Invalid read of size 1
==30226== at 0x805DAD3: htFind (symtab.c:78)
==30226== by 0x805E4CB: scopeInsert (symtab.c:423)
==30226== by 0x80593C7: var_list (parser.c:658)
==30226== by 0x805911F: decl (parser.c:581)
==30226== by 0x8058984: decl_list (parser.c:357)
==30226== by 0x8058955: program (parser.c:340)
==30226== by 0x80584D9: Parse (parser.c:112)
==30226== by 0x804C65F: main (main.c:995)
==30226== Address 0x4202d11 is 0 bytes after a block of size 1 alloc'd
==30226== at 0x402BE41: malloc (vg_replace_malloc.c:270)
==30226== by 0x805C9FB: GetNextToken (scanner.c:294)
==30226== by 0x80591C2: type (parser.c:602)
==30226== by 0x805910F: decl (parser.c:579)
==30226== by 0x8058984: decl_list (parser.c:357)
==30226== by 0x8058955: program (parser.c:340)
==30226== by 0x80584D9: Parse (parser.c:112)
==30226== by 0x804C65F: main (main.c:995)
==30226==
==30226== Invalid read of size 1
==30226== at 0x805DC0A: htInsert (symtab.c:111)
==30226== by 0x805E53E: scopeInsert (symtab.c:429)
==30226== by 0x80593C7: var_list (parser.c:658)
==30226== by 0x805911F: decl (parser.c:581)
==30226== by 0x8058984: decl_list (parser.c:357)
==30226== by 0x8058955: program (parser.c:340)
==30226== by 0x80584D9: Parse (parser.c:112)
==30226== by 0x804C65F: main (main.c:995)
==30226== Address 0x4202d11 is 0 bytes after a block of size 1 alloc'd
==30226== at 0x402BE41: malloc (vg_replace_malloc.c:270)
==30226== by 0x805C9FB: GetNextToken (scanner.c:294)
==30226== by 0x80591C2: type (parser.c:602)
==30226== by 0x805910F: decl (parser.c:579)
==30226== by 0x8058984: decl_list (parser.c:357)
==30226== by 0x8058955: program (parser.c:340)
==30226== by 0x80584D9: Parse (parser.c:112)
==30226== by 0x804C65F: main (main.c:995)
==30226==
==30226== Invalid read of size 1
==30226== at 0x402C653: strlen (mc_replace_strmem.c:399)
==30226== by 0x805D91A: htNewNode (symtab.c:22)
==30226== by 0x805DC8C: htInsert (symtab.c:119)
==30226== by 0x805E53E: scopeInsert (symtab.c:429)
==30226== by 0x80593C7: var_list (parser.c:658)
==30226== by 0x805911F: decl (parser.c:581)
==30226== by 0x8058984: decl_list (parser.c:357)
==30226== by 0x8058955: program (parser.c:340)
==30226== by 0x80584D9: Parse (parser.c:112)
==30226== by 0x804C65F: main (main.c:995)
==30226== Address 0x4202d11 is 0 bytes after a block of size 1 alloc'd
==30226== at 0x402BE41: malloc (vg_replace_malloc.c:270)
==30226== by 0x805C9FB: GetNextToken (scanner.c:294)
==30226== by 0x80591C2: type (parser.c:602)
==30226== by 0x805910F: decl (parser.c:579)
==30226== by 0x8058984: decl_list (parser.c:357)
==30226== by 0x8058955: program (parser.c:340)
==30226== by 0x80584D9: Parse (parser.c:112)
==30226== by 0x804C65F: main (main.c:995)
==30226==
==30226== Invalid read of size 1
==30226== at 0x402C6AD: strcpy (mc_replace_strmem.c:438)
==30226== by 0x805D965: htNewNode (symtab.c:29)
==30226== by 0x805DC8C: htInsert (symtab.c:119)
==30226== by 0x805E53E: scopeInsert (symtab.c:429)
==30226== by 0x80593C7: var_list (parser.c:658)
==30226== by 0x805911F: decl (parser.c:581)
==30226== by 0x8058984: decl_list (parser.c:357)
==30226== by 0x8058955: program (parser.c:340)
==30226== by 0x80584D9: Parse (parser.c:112)
==30226== by 0x804C65F: main (main.c:995)
==30226== Address 0x4202d11 is 0 bytes after a block of size 1 alloc'd
==30226== at 0x402BE41: malloc (vg_replace_malloc.c:270)
==30226== by 0x805C9FB: GetNextToken (scanner.c:294)
==30226== by 0x80591C2: type (parser.c:602)
==30226== by 0x805910F: decl (parser.c:579)
==30226== by 0x8058984: decl_list (parser.c:357)
==30226== by 0x8058955: program (parser.c:340)
==30226== by 0x80584D9: Parse (parser.c:112)
==30226== by 0x804C65F: main (main.c:995)
==30226==
==30226== Invalid write of size 1
==30226== at 0x402C6C5: strcpy (mc_replace_strmem.c:438)
==30226== by 0x805CA2E: GetNextToken (scanner.c:296)
==30226== by 0x80585BB: match (parser.c:169)
==30226== by 0x8059136: decl (parser.c:583)
==30226== by 0x8058984: decl_list (parser.c:357)
==30226== by 0x8058955: program (parser.c:340)
==30226== by 0x80584D9: Parse (parser.c:112)
==30226== by 0x804C65F: main (main.c:995)
==30226== Address 0x4202ddd is 0 bytes after a block of size 5 alloc'd
==30226== at 0x402BE41: malloc (vg_replace_malloc.c:270)
==30226== by 0x805C9FB: GetNextToken (scanner.c:294)
==30226== by 0x80585BB: match (parser.c:169)
==30226== by 0x8059136: decl (parser.c:583)
==30226== by 0x8058984: decl_list (parser.c:357)
==30226== by 0x8058955: program (parser.c:340)
==30226== by 0x80584D9: Parse (parser.c:112)
==30226== by 0x804C65F: main (main.c:995)
==30226==
==30226== Invalid write of size 1
==30226== at 0x402C6C5: strcpy (mc_replace_strmem.c:438)
==30226== by 0x805CA2E: GetNextToken (scanner.c:296)
==30226== by 0x80585BB: match (parser.c:169)
==30226== by 0x805987D: code_block (parser.c:803)
==30226== by 0x8058965: program (parser.c:343)
==30226== by 0x80584D9: Parse (parser.c:112)
==30226== by 0x804C65F: main (main.c:995)
==30226== Address 0x4202e11 is 0 bytes after a block of size 1 alloc'd
==30226== at 0x402BE41: malloc (vg_replace_malloc.c:270)
==30226== by 0x805C9FB: GetNextToken (scanner.c:294)
==30226== by 0x80585BB: match (parser.c:169)
==30226== by 0x805987D: code_block (parser.c:803)
==30226== by 0x8058965: program (parser.c:343)
==30226== by 0x80584D9: Parse (parser.c:112)
==30226== by 0x804C65F: main (main.c:995)
==30226==
==30226== Invalid read of size 1
==30226== at 0x805DAD3: htFind (symtab.c:78)
==30226== by 0x805E47B: scopeFind (symtab.c:407)
==30226== by 0x805A248: stmt (parser.c:1045)
==30226== by 0x80599C3: stmt_list (parser.c:846)
==30226== by 0x80598B8: code_block (parser.c:810)
==30226== by 0x8058965: program (parser.c:343)
==30226== by 0x80584D9: Parse (parser.c:112)
==30226== by 0x804C65F: main (main.c:995)
==30226== Address 0x4202e11 is 0 bytes after a block of size 1 alloc'd
==30226== at 0x402BE41: malloc (vg_replace_malloc.c:270)
==30226== by 0x805C9FB: GetNextToken (scanner.c:294)
==30226== by 0x80585BB: match (parser.c:169)
==30226== by 0x805987D: code_block (parser.c:803)
==30226== by 0x8058965: program (parser.c:343)
==30226== by 0x80584D9: Parse (parser.c:112)
==30226== by 0x804C65F: main (main.c:995)
==30226==
==30226== Invalid read of size 1
==30226== at 0x402D2EA: strcmp (mc_replace_strmem.c:725)
==30226== by 0x805DB0C: htFind (symtab.c:86)
==30226== by 0x805E47B: scopeFind (symtab.c:407)
==30226== by 0x805A248: stmt (parser.c:1045)
==30226== by 0x80599C3: stmt_list (parser.c:846)
==30226== by 0x80598B8: code_block (parser.c:810)
==30226== by 0x8058965: program (parser.c:343)
==30226== by 0x80584D9: Parse (parser.c:112)
==30226== by 0x804C65F: main (main.c:995)
==30226== Address 0x4202e11 is 0 bytes after a block of size 1 alloc'd
==30226== at 0x402BE41: malloc (vg_replace_malloc.c:270)
==30226== by 0x805C9FB: GetNextToken (scanner.c:294)
==30226== by 0x80585BB: match (parser.c:169)
==30226== by 0x805987D: code_block (parser.c:803)
==30226== by 0x8058965: program (parser.c:343)
==30226== by 0x80584D9: Parse (parser.c:112)
==30226== by 0x804C65F: main (main.c:995)
==30226==
==30226== Invalid read of size 1
==30226== at 0x402C6AD: strcpy (mc_replace_strmem.c:438)
==30226== by 0x805A296: stmt (parser.c:1053)
==30226== by 0x80599C3: stmt_list (parser.c:846)
==30226== by 0x80598B8: code_block (parser.c:810)
==30226== by 0x8058965: program (parser.c:343)
==30226== by 0x80584D9: Parse (parser.c:112)
==30226== by 0x804C65F: main (main.c:995)
==30226== Address 0x4202e11 is 0 bytes after a block of size 1 alloc'd
==30226== at 0x402BE41: malloc (vg_replace_malloc.c:270)
==30226== by 0x805C9FB: GetNextToken (scanner.c:294)
==30226== by 0x80585BB: match (parser.c:169)
==30226== by 0x805987D: code_block (parser.c:803)
==30226== by 0x8058965: program (parser.c:343)
==30226== by 0x80584D9: Parse (parser.c:112)
==30226== by 0x804C65F: main (main.c:995)
==30226==
==30226== Invalid write of size 1
==30226== at 0x402C6C5: strcpy (mc_replace_strmem.c:438)
==30226== by 0x805CA2E: GetNextToken (scanner.c:296)
==30226== by 0x80585BB: match (parser.c:169)
==30226== by 0x805A941: stmt (parser.c:1248)
==30226== by 0x80599C3: stmt_list (parser.c:846)
==30226== by 0x80598B8: code_block (parser.c:810)
==30226== by 0x8058965: program (parser.c:343)
==30226== by 0x80584D9: Parse (parser.c:112)
==30226== by 0x804C65F: main (main.c:995)
==30226== Address 0x4202f65 is 0 bytes after a block of size 5 alloc'd
==30226== at 0x402BE41: malloc (vg_replace_malloc.c:270)
==30226== by 0x805C9FB: GetNextToken (scanner.c:294)
==30226== by 0x80585BB: match (parser.c:169)
==30226== by 0x805A941: stmt (parser.c:1248)
==30226== by 0x80599C3: stmt_list (parser.c:846)
==30226== by 0x80598B8: code_block (parser.c:810)
==30226== by 0x8058965: program (parser.c:343)
==30226== by 0x80584D9: Parse (parser.c:112)
==30226== by 0x804C65F: main (main.c:995)
==30226==
==30226== Invalid write of size 1
==30226== at 0x402C6C5: strcpy (mc_replace_strmem.c:438)
==30226== by 0x805CA2E: GetNextToken (scanner.c:296)
==30226== by 0x80585BB: match (parser.c:169)
==30226== by 0x8059C9E: stmt (parser.c:918)
==30226== by 0x80599C3: stmt_list (parser.c:846)
==30226== by 0x80598B8: code_block (parser.c:810)
==30226== by 0x8058965: program (parser.c:343)
==30226== by 0x80584D9: Parse (parser.c:112)
==30226== by 0x804C65F: main (main.c:995)
==30226== Address 0x4203101 is 0 bytes after a block of size 1 alloc'd
==30226== at 0x402BE41: malloc (vg_replace_malloc.c:270)
==30226== by 0x805C9FB: GetNextToken (scanner.c:294)
==30226== by 0x80585BB: match (parser.c:169)
==30226== by 0x8059C9E: stmt (parser.c:918)
==30226== by 0x80599C3: stmt_list (parser.c:846)
==30226== by 0x80598B8: code_block (parser.c:810)
==30226== by 0x8058965: program (parser.c:343)
==30226== by 0x80584D9: Parse (parser.c:112)
==30226== by 0x804C65F: main (main.c:995)
==30226==
==30226== Invalid read of size 1
==30226== at 0x805DAD3: htFind (symtab.c:78)
==30226== by 0x805E47B: scopeFind (symtab.c:407)
==30226== by 0x805BD72: expr4 (parser.c:1885)
==30226== by 0x805B6EB: expr3 (parser.c:1652)
==30226== by 0x805B484: expr2 (parser.c:1573)
==30226== by 0x805B28F: expr1 (parser.c:1505)
==30226== by 0x805B0F8: expr (parser.c:1444)
==30226== by 0x8059CD0: stmt (parser.c:925)
==30226== by 0x80599C3: stmt_list (parser.c:846)
==30226== by 0x80598B8: code_block (parser.c:810)
==30226== by 0x8058965: program (parser.c:343)
==30226== by 0x80584D9: Parse (parser.c:112)
==30226== Address 0x4203101 is 0 bytes after a block of size 1 alloc'd
==30226== at 0x402BE41: malloc (vg_replace_malloc.c:270)
==30226== by 0x805C9FB: GetNextToken (scanner.c:294)
==30226== by 0x80585BB: match (parser.c:169)
==30226== by 0x8059C9E: stmt (parser.c:918)
==30226== by 0x80599C3: stmt_list (parser.c:846)
==30226== by 0x80598B8: code_block (parser.c:810)
==30226== by 0x8058965: program (parser.c:343)
==30226== by 0x80584D9: Parse (parser.c:112)
==30226== by 0x804C65F: main (main.c:995)
==30226==
==30226== Invalid read of size 1
==30226== at 0x402D2EA: strcmp (mc_replace_strmem.c:725)
==30226== by 0x805DB0C: htFind (symtab.c:86)
==30226== by 0x805E47B: scopeFind (symtab.c:407)
==30226== by 0x805BD72: expr4 (parser.c:1885)
==30226== by 0x805B6EB: expr3 (parser.c:1652)
==30226== by 0x805B484: expr2 (parser.c:1573)
==30226== by 0x805B28F: expr1 (parser.c:1505)
==30226== by 0x805B0F8: expr (parser.c:1444)
==30226== by 0x8059CD0: stmt (parser.c:925)
==30226== by 0x80599C3: stmt_list (parser.c:846)
==30226== by 0x80598B8: code_block (parser.c:810)
==30226== by 0x8058965: program (parser.c:343)
==30226== Address 0x4203101 is 0 bytes after a block of size 1 alloc'd
==30226== at 0x402BE41: malloc (vg_replace_malloc.c:270)
==30226== by 0x805C9FB: GetNextToken (scanner.c:294)
==30226== by 0x80585BB: match (parser.c:169)
==30226== by 0x8059C9E: stmt (parser.c:918)
==30226== by 0x80599C3: stmt_list (parser.c:846)
==30226== by 0x80598B8: code_block (parser.c:810)
==30226== by 0x8058965: program (parser.c:343)
==30226== by 0x80584D9: Parse (parser.c:112)
==30226== by 0x804C65F: main (main.c:995)
==30226==
==30226== Invalid read of size 1
==30226== at 0x402C653: strlen (mc_replace_strmem.c:399)
==30226== by 0x804C81B: id (ast.c:56)
==30226== by 0x805BF64: expr4 (parser.c:1934)
==30226== by 0x805B6EB: expr3 (parser.c:1652)
==30226== by 0x805B484: expr2 (parser.c:1573)
==30226== by 0x805B28F: expr1 (parser.c:1505)
==30226== by 0x805B0F8: expr (parser.c:1444)
==30226== by 0x8059CD0: stmt (parser.c:925)
==30226== by 0x80599C3: stmt_list (parser.c:846)
==30226== by 0x80598B8: code_block (parser.c:810)
==30226== by 0x8058965: program (parser.c:343)
==30226== by 0x80584D9: Parse (parser.c:112)
==30226== Address 0x4203101 is 0 bytes after a block of size 1 alloc'd
==30226== at 0x402BE41: malloc (vg_replace_malloc.c:270)
==30226== by 0x805C9FB: GetNextToken (scanner.c:294)
==30226== by 0x80585BB: match (parser.c:169)
==30226== by 0x8059C9E: stmt (parser.c:918)
==30226== by 0x80599C3: stmt_list (parser.c:846)
==30226== by 0x80598B8: code_block (parser.c:810)
==30226== by 0x8058965: program (parser.c:343)
==30226== by 0x80584D9: Parse (parser.c:112)
==30226== by 0x804C65F: main (main.c:995)
==30226==
==30226== Invalid read of size 1
==30226== at 0x402C6AD: strcpy (mc_replace_strmem.c:438)
==30226== by 0x804C843: id (ast.c:57)
==30226== by 0x805BF64: expr4 (parser.c:1934)
==30226== by 0x805B6EB: expr3 (parser.c:1652)
==30226== by 0x805B484: expr2 (parser.c:1573)
==30226== by 0x805B28F: expr1 (parser.c:1505)
==30226== by 0x805B0F8: expr (parser.c:1444)
==30226== by 0x8059CD0: stmt (parser.c:925)
==30226== by 0x80599C3: stmt_list (parser.c:846)
==30226== by 0x80598B8: code_block (parser.c:810)
==30226== by 0x8058965: program (parser.c:343)
==30226== by 0x80584D9: Parse (parser.c:112)
==30226== Address 0x4203101 is 0 bytes after a block of size 1 alloc'd
==30226== at 0x402BE41: malloc (vg_replace_malloc.c:270)
==30226== by 0x805C9FB: GetNextToken (scanner.c:294)
==30226== by 0x80585BB: match (parser.c:169)
==30226== by 0x8059C9E: stmt (parser.c:918)
==30226== by 0x80599C3: stmt_list (parser.c:846)
==30226== by 0x80598B8: code_block (parser.c:810)
==30226== by 0x8058965: program (parser.c:343)
==30226== by 0x80584D9: Parse (parser.c:112)
==30226== by 0x804C65F: main (main.c:995)
==30226==
==30226== Invalid write of size 1
==30226== at 0x402C6C5: strcpy (mc_replace_strmem.c:438)
==30226== by 0x805CA2E: GetNextToken (scanner.c:296)
==30226== by 0x805B13C: expr (parser.c:1466)
==30226== by 0x8059CD0: stmt (parser.c:925)
==30226== by 0x80599C3: stmt_list (parser.c:846)
==30226== by 0x80598B8: code_block (parser.c:810)
==30226== by 0x8058965: program (parser.c:343)
==30226== by 0x80584D9: Parse (parser.c:112)
==30226== by 0x804C65F: main (main.c:995)
==30226== Address 0x4203319 is 0 bytes after a block of size 1 alloc'd
==30226== at 0x402BE41: malloc (vg_replace_malloc.c:270)
==30226== by 0x805C9FB: GetNextToken (scanner.c:294)
==30226== by 0x805B13C: expr (parser.c:1466)
==30226== by 0x8059CD0: stmt (parser.c:925)
==30226== by 0x80599C3: stmt_list (parser.c:846)
==30226== by 0x80598B8: code_block (parser.c:810)
==30226== by 0x8058965: program (parser.c:343)
==30226== by 0x80584D9: Parse (parser.c:112)
==30226== by 0x804C65F: main (main.c:995)
==30226==
==30226== Invalid write of size 1
==30226== at 0x402C6C5: strcpy (mc_replace_strmem.c:438)
==30226== by 0x805CA2E: GetNextToken (scanner.c:296)
==30226== by 0x80585BB: match (parser.c:169)
==30226== by 0x8059CEA: stmt (parser.c:927)
==30226== by 0x80599C3: stmt_list (parser.c:846)
==30226== by 0x80598B8: code_block (parser.c:810)
==30226== by 0x8058965: program (parser.c:343)
==30226== by 0x80584D9: Parse (parser.c:112)
==30226== by 0x804C65F: main (main.c:995)
==30226== Address 0x4203585 is 0 bytes after a block of size 5 alloc'd
==30226== at 0x402BE41: malloc (vg_replace_malloc.c:270)
==30226== by 0x805C9FB: GetNextToken (scanner.c:294)
==30226== by 0x80585BB: match (parser.c:169)
==30226== by 0x8059CEA: stmt (parser.c:927)
==30226== by 0x80599C3: stmt_list (parser.c:846)
==30226== by 0x80598B8: code_block (parser.c:810)
==30226== by 0x8058965: program (parser.c:343)
==30226== by 0x80584D9: Parse (parser.c:112)
==30226== by 0x804C65F: main (main.c:995)
==30226==
==30226== Invalid write of size 1
==30226== at 0x402C6C5: strcpy (mc_replace_strmem.c:438)
==30226== by 0x805CA2E: GetNextToken (scanner.c:296)
==30226== by 0x805A186: stmt (parser.c:1031)
==30226== by 0x8059D59: stmt (parser.c:942)
==30226== by 0x80599C3: stmt_list (parser.c:846)
==30226== by 0x80598B8: code_block (parser.c:810)
==30226== by 0x8058965: program (parser.c:343)
==30226== by 0x80584D9: Parse (parser.c:112)
==30226== by 0x804C65F: main (main.c:995)
==30226== Address 0x42035bd is 0 bytes after a block of size 5 alloc'd
==30226== at 0x402BE41: malloc (vg_replace_malloc.c:270)
==30226== by 0x805C9FB: GetNextToken (scanner.c:294)
==30226== by 0x805A186: stmt (parser.c:1031)
==30226== by 0x8059D59: stmt (parser.c:942)
==30226== by 0x80599C3: stmt_list (parser.c:846)
==30226== by 0x80598B8: code_block (parser.c:810)
==30226== by 0x8058965: program (parser.c:343)
==30226== by 0x80584D9: Parse (parser.c:112)
==30226== by 0x804C65F: main (main.c:995)
==30226==
==30226== Invalid write of size 1
==30226== at 0x402C6C5: strcpy (mc_replace_strmem.c:438)
==30226== by 0x805CA2E: GetNextToken (scanner.c:296)
==30226== by 0x80585BB: match (parser.c:169)
==30226== by 0x8059B2B: stmt (parser.c:886)
==30226== by 0x80599C3: stmt_list (parser.c:846)
==30226== by 0x805A18B: stmt (parser.c:1032)
==30226== by 0x8059D59: stmt (parser.c:942)
==30226== by 0x80599C3: stmt_list (parser.c:846)
==30226== by 0x80598B8: code_block (parser.c:810)
==30226== by 0x8058965: program (parser.c:343)
==30226== by 0x80584D9: Parse (parser.c:112)
==30226== by 0x804C65F: main (main.c:995)
==30226== Address 0x420377d is 0 bytes after a block of size 5 alloc'd
==30226== at 0x402BE41: malloc (vg_replace_malloc.c:270)
==30226== by 0x805C9FB: GetNextToken (scanner.c:294)
==30226== by 0x80585BB: match (parser.c:169)
==30226== by 0x8059B2B: stmt (parser.c:886)
==30226== by 0x80599C3: stmt_list (parser.c:846)
==30226== by 0x805A18B: stmt (parser.c:1032)
==30226== by 0x8059D59: stmt (parser.c:942)
==30226== by 0x80599C3: stmt_list (parser.c:846)
==30226== by 0x80598B8: code_block (parser.c:810)
==30226== by 0x8058965: program (parser.c:343)
==30226== by 0x80584D9: Parse (parser.c:112)
==30226== by 0x804C65F: main (main.c:995)
==30226==
==30226== Invalid write of size 1
==30226== at 0x402C6C5: strcpy (mc_replace_strmem.c:438)
==30226== by 0x805CA2E: GetNextToken (scanner.c:296)
==30226== by 0x8059B0C: stmt (parser.c:883)
==30226== by 0x80599C3: stmt_list (parser.c:846)
==30226== by 0x805A18B: stmt (parser.c:1032)
==30226== by 0x8059D59: stmt (parser.c:942)
==30226== by 0x80599C3: stmt_list (parser.c:846)
==30226== by 0x80598B8: code_block (parser.c:810)
==30226== by 0x8058965: program (parser.c:343)
==30226== by 0x80584D9: Parse (parser.c:112)
==30226== by 0x804C65F: main (main.c:995)
==30226== Address 0x4203851 is 0 bytes after a block of size 1 alloc'd
==30226== at 0x402BE41: malloc (vg_replace_malloc.c:270)
==30226== by 0x805C9FB: GetNextToken (scanner.c:294)
==30226== by 0x8059B0C: stmt (parser.c:883)
==30226== by 0x80599C3: stmt_list (parser.c:846)
==30226== by 0x805A18B: stmt (parser.c:1032)
==30226== by 0x8059D59: stmt (parser.c:942)
==30226== by 0x80599C3: stmt_list (parser.c:846)
==30226== by 0x80598B8: code_block (parser.c:810)
==30226== by 0x8058965: program (parser.c:343)
==30226== by 0x80584D9: Parse (parser.c:112)
==30226== by 0x804C65F: main (main.c:995)
==30226==
==30226== Invalid read of size 1
==30226== at 0x402C6AD: strcpy (mc_replace_strmem.c:438)
==30226== by 0x805A296: stmt (parser.c:1053)
==30226== by 0x80599C3: stmt_list (parser.c:846)
==30226== by 0x805A18B: stmt (parser.c:1032)
==30226== by 0x8059D59: stmt (parser.c:942)
==30226== by 0x80599C3: stmt_list (parser.c:846)
==30226== by 0x80598B8: code_block (parser.c:810)
==30226== by 0x8058965: program (parser.c:343)
==30226== by 0x80584D9: Parse (parser.c:112)
==30226== by 0x804C65F: main (main.c:995)
==30226== Address 0x4203b61 is 0 bytes after a block of size 1 alloc'd
==30226== at 0x402BE41: malloc (vg_replace_malloc.c:270)
==30226== by 0x805C9FB: GetNextToken (scanner.c:294)
==30226== by 0x80585BB: match (parser.c:169)
==30226== by 0x8059B2B: stmt (parser.c:886)
==30226== by 0x80599C3: stmt_list (parser.c:846)
==30226== by 0x805A18B: stmt (parser.c:1032)
==30226== by 0x8059D59: stmt (parser.c:942)
==30226== by 0x80599C3: stmt_list (parser.c:846)
==30226== by 0x80598B8: code_block (parser.c:810)
==30226== by 0x8058965: program (parser.c:343)
==30226== by 0x80584D9: Parse (parser.c:112)
==30226== by 0x804C65F: main (main.c:995)
==30226==
==30226== Invalid write of size 1
==30226== at 0x402C6C5: strcpy (mc_replace_strmem.c:438)
==30226== by 0x805CA2E: GetNextToken (scanner.c:296)
==30226== by 0x80585BB: match (parser.c:169)
==30226== by 0x805A7FD: stmt (parser.c:1214)
==30226== by 0x80599C3: stmt_list (parser.c:846)
==30226== by 0x805A18B: stmt (parser.c:1032)
==30226== by 0x8059D59: stmt (parser.c:942)
==30226== by 0x80599C3: stmt_list (parser.c:846)
==30226== by 0x80598B8: code_block (parser.c:810)
==30226== by 0x8058965: program (parser.c:343)
==30226== by 0x80584D9: Parse (parser.c:112)
==30226== by 0x804C65F: main (main.c:995)
==30226== Address 0x4203c39 is 0 bytes after a block of size 1 alloc'd
==30226== at 0x402BE41: malloc (vg_replace_malloc.c:270)
==30226== by 0x805C9FB: GetNextToken (scanner.c:294)
==30226== by 0x80585BB: match (parser.c:169)
==30226== by 0x805A7FD: stmt (parser.c:1214)
==30226== by 0x80599C3: stmt_list (parser.c:846)
==30226== by 0x805A18B: stmt (parser.c:1032)
==30226== by 0x8059D59: stmt (parser.c:942)
==30226== by 0x80599C3: stmt_list (parser.c:846)
==30226== by 0x80598B8: code_block (parser.c:810)
==30226== by 0x8058965: program (parser.c:343)
==30226== by 0x80584D9: Parse (parser.c:112)
==30226== by 0x804C65F: main (main.c:995)
==30226==
==30226== Invalid write of size 1
==30226== at 0x402C6C5: strcpy (mc_replace_strmem.c:438)
==30226== by 0x805CA2E: GetNextToken (scanner.c:296)
==30226== by 0x80585BB: match (parser.c:169)
==30226== by 0x805A1A5: stmt (parser.c:1034)
==30226== by 0x8059D59: stmt (parser.c:942)
==30226== by 0x80599C3: stmt_list (parser.c:846)
==30226== by 0x80598B8: code_block (parser.c:810)
==30226== by 0x8058965: program (parser.c:343)
==30226== by 0x80584D9: Parse (parser.c:112)
==30226== by 0x804C65F: main (main.c:995)
==30226== Address 0x4203ff3 is 0 bytes after a block of size 3 alloc'd
==30226== at 0x402BE41: malloc (vg_replace_malloc.c:270)
==30226== by 0x805C9FB: GetNextToken (scanner.c:294)
==30226== by 0x80585BB: match (parser.c:169)
==30226== by 0x805A1A5: stmt (parser.c:1034)
==30226== by 0x8059D59: stmt (parser.c:942)
==30226== by 0x80599C3: stmt_list (parser.c:846)
==30226== by 0x80598B8: code_block (parser.c:810)
==30226== by 0x8058965: program (parser.c:343)
==30226== by 0x80584D9: Parse (parser.c:112)
==30226== by 0x804C65F: main (main.c:995)
==30226==
==30226== Conditional jump or move depends on uninitialised value(s)
==30226== at 0x804894C: convertToBoolean (main.c:33)
==30226== by 0x8049294: interpret (main.c:296)
==30226== by 0x8049A0A: interpret (main.c:430)
==30226== by 0x8049A2D: interpret (main.c:432)
==30226== by 0x804C6D1: main (main.c:1018)
==30226==
==30226== Conditional jump or move depends on uninitialised value(s)
==30226== at 0x8048951: convertToBoolean (main.c:33)
==30226== by 0x8049294: interpret (main.c:296)
==30226== by 0x8049A0A: interpret (main.c:430)
==30226== by 0x8049A2D: interpret (main.c:432)
==30226== by 0x804C6D1: main (main.c:1018)
==30226==
==30226== Invalid read of size 4
==30226== at 0x80499F6: interpret (main.c:430)
==30226== by 0x804924B: interpret (main.c:297)
==30226== by 0x8049A0A: interpret (main.c:430)
==30226== by 0x8049A2D: interpret (main.c:432)
==30226== by 0x804C6D1: main (main.c:1018)
==30226== Address 0x4204044 is 0 bytes after a block of size 28 alloc'd
==30226== at 0x402BE41: malloc (vg_replace_malloc.c:270)
==30226== by 0x804C8BB: opr (ast.c:75)
==30226== by 0x805A21D: stmt (parser.c:1042)
==30226== by 0x8059D59: stmt (parser.c:942)
==30226== by 0x80599C3: stmt_list (parser.c:846)
==30226== by 0x80598B8: code_block (parser.c:810)
==30226== by 0x8058965: program (parser.c:343)
==30226== by 0x80584D9: Parse (parser.c:112)
==30226== by 0x804C65F: main (main.c:995)
==30226==
==30226==
==30226== HEAP SUMMARY:
==30226== in use at exit: 9,120 bytes in 283 blocks
==30226== total heap usage: 320 allocs, 37 frees, 12,393 bytes allocated
==30226==
==30226== 1 bytes in 1 blocks are definitely lost in loss record 1 of 29
==30226== at 0x402BE41: malloc (vg_replace_malloc.c:270)
==30226== by 0x805C9FB: GetNextToken (scanner.c:294)
==30226== by 0x80591C2: type (parser.c:602)
==30226== by 0x805910F: decl (parser.c:579)
==30226== by 0x8058984: decl_list (parser.c:357)
==30226== by 0x8058955: program (parser.c:340)
==30226== by 0x80584D9: Parse (parser.c:112)
==30226== by 0x804C65F: main (main.c:995)
==30226==
==30226== 1 bytes in 1 blocks are definitely lost in loss record 2 of 29
==30226== at 0x402BE41: malloc (vg_replace_malloc.c:270)
==30226== by 0x805C9FB: GetNextToken (scanner.c:294)
==30226== by 0x80585BB: match (parser.c:169)
==30226== by 0x805987D: code_block (parser.c:803)
==30226== by 0x8058965: program (parser.c:343)
==30226== by 0x80584D9: Parse (parser.c:112)
==30226== by 0x804C65F: main (main.c:995)
==30226==
==30226== 1 bytes in 1 blocks are definitely lost in loss record 3 of 29
==30226== at 0x402BE41: malloc (vg_replace_malloc.c:270)
==30226== by 0x805C9FB: GetNextToken (scanner.c:294)
==30226== by 0x80585BB: match (parser.c:169)
==30226== by 0x8059C9E: stmt (parser.c:918)
==30226== by 0x80599C3: stmt_list (parser.c:846)
==30226== by 0x80598B8: code_block (parser.c:810)
==30226== by 0x8058965: program (parser.c:343)
==30226== by 0x80584D9: Parse (parser.c:112)
==30226== by 0x804C65F: main (main.c:995)
==30226==
==30226== 1 bytes in 1 blocks are definitely lost in loss record 4 of 29
==30226== at 0x402BE41: malloc (vg_replace_malloc.c:270)
==30226== by 0x805C9FB: GetNextToken (scanner.c:294)
==30226== by 0x805B13C: expr (parser.c:1466)
==30226== by 0x8059CD0: stmt (parser.c:925)
==30226== by 0x80599C3: stmt_list (parser.c:846)
==30226== by 0x80598B8: code_block (parser.c:810)
==30226== by 0x8058965: program (parser.c:343)
==30226== by 0x80584D9: Parse (parser.c:112)
==30226== by 0x804C65F: main (main.c:995)
==30226==
==30226== 1 bytes in 1 blocks are definitely lost in loss record 5 of 29
==30226== at 0x402BE41: malloc (vg_replace_malloc.c:270)
==30226== by 0x805C9FB: GetNextToken (scanner.c:294)
==30226== by 0x8059B0C: stmt (parser.c:883)
==30226== by 0x80599C3: stmt_list (parser.c:846)
==30226== by 0x805A18B: stmt (parser.c:1032)
==30226== by 0x8059D59: stmt (parser.c:942)
==30226== by 0x80599C3: stmt_list (parser.c:846)
==30226== by 0x80598B8: code_block (parser.c:810)
==30226== by 0x8058965: program (parser.c:343)
==30226== by 0x80584D9: Parse (parser.c:112)
==30226== by 0x804C65F: main (main.c:995)
==30226==
==30226== 1 bytes in 1 blocks are definitely lost in loss record 6 of 29
==30226== at 0x402BE41: malloc (vg_replace_malloc.c:270)
==30226== by 0x805C9FB: GetNextToken (scanner.c:294)
==30226== by 0x80585BB: match (parser.c:169)
==30226== by 0x805A7FD: stmt (parser.c:1214)
==30226== by 0x80599C3: stmt_list (parser.c:846)
==30226== by 0x805A18B: stmt (parser.c:1032)
==30226== by 0x8059D59: stmt (parser.c:942)
==30226== by 0x80599C3: stmt_list (parser.c:846)
==30226== by 0x80598B8: code_block (parser.c:810)
==30226== by 0x8058965: program (parser.c:343)
==30226== by 0x80584D9: Parse (parser.c:112)
==30226== by 0x804C65F: main (main.c:995)
==30226==
==30226== 2 bytes in 1 blocks are definitely lost in loss record 7 of 29
==30226== at 0x402BE41: malloc (vg_replace_malloc.c:270)
==30226== by 0x804C826: id (ast.c:56)
==30226== by 0x805AA54: stmt (parser.c:1268)
==30226== by 0x80599C3: stmt_list (parser.c:846)
==30226== by 0x80598B8: code_block (parser.c:810)
==30226== by 0x8058965: program (parser.c:343)
==30226== by 0x80584D9: Parse (parser.c:112)
==30226== by 0x804C65F: main (main.c:995)
==30226==
==30226== 2 bytes in 1 blocks are definitely lost in loss record 8 of 29
==30226== at 0x402BE41: malloc (vg_replace_malloc.c:270)
==30226== by 0x804C859: id (ast.c:58)
==30226== by 0x805AA54: stmt (parser.c:1268)
==30226== by 0x80599C3: stmt_list (parser.c:846)
==30226== by 0x80598B8: code_block (parser.c:810)
==30226== by 0x8058965: program (parser.c:343)
==30226== by 0x80584D9: Parse (parser.c:112)
==30226== by 0x804C65F: main (main.c:995)
==30226==
==30226== 2 bytes in 1 blocks are definitely lost in loss record 9 of 29
==30226== at 0x402BE41: malloc (vg_replace_malloc.c:270)
==30226== by 0x804C826: id (ast.c:56)
==30226== by 0x805BF64: expr4 (parser.c:1934)
==30226== by 0x805B6EB: expr3 (parser.c:1652)
==30226== by 0x805B484: expr2 (parser.c:1573)
==30226== by 0x805B28F: expr1 (parser.c:1505)
==30226== by 0x805B0F8: expr (parser.c:1444)
==30226== by 0x8059CD0: stmt (parser.c:925)
==30226== by 0x80599C3: stmt_list (parser.c:846)
==30226== by 0x80598B8: code_block (parser.c:810)
==30226== by 0x8058965: program (parser.c:343)
==30226== by 0x80584D9: Parse (parser.c:112)
==30226==
==30226== 2 bytes in 1 blocks are definitely lost in loss record 10 of 29
==30226== at 0x402BE41: malloc (vg_replace_malloc.c:270)
==30226== by 0x804C859: id (ast.c:58)
==30226== by 0x805BF64: expr4 (parser.c:1934)
==30226== by 0x805B6EB: expr3 (parser.c:1652)
==30226== by 0x805B484: expr2 (parser.c:1573)
==30226== by 0x805B28F: expr1 (parser.c:1505)
==30226== by 0x805B0F8: expr (parser.c:1444)
==30226== by 0x8059CD0: stmt (parser.c:925)
==30226== by 0x80599C3: stmt_list (parser.c:846)
==30226== by 0x80598B8: code_block (parser.c:810)
==30226== by 0x8058965: program (parser.c:343)
==30226== by 0x80584D9: Parse (parser.c:112)
==30226==
==30226== 2 bytes in 1 blocks are definitely lost in loss record 11 of 29
==30226== at 0x402BE41: malloc (vg_replace_malloc.c:270)
==30226== by 0x804C826: id (ast.c:56)
==30226== by 0x805BF64: expr4 (parser.c:1934)
==30226== by 0x805B6EB: expr3 (parser.c:1652)
==30226== by 0x805B484: expr2 (parser.c:1573)
==30226== by 0x805B28F: expr1 (parser.c:1505)
==30226== by 0x805B141: expr (parser.c:1468)
==30226== by 0x8059CD0: stmt (parser.c:925)
==30226== by 0x80599C3: stmt_list (parser.c:846)
==30226== by 0x80598B8: code_block (parser.c:810)
==30226== by 0x8058965: program (parser.c:343)
==30226== by 0x80584D9: Parse (parser.c:112)
==30226==
==30226== 2 bytes in 1 blocks are definitely lost in loss record 12 of 29
==30226== at 0x402BE41: malloc (vg_replace_malloc.c:270)
==30226== by 0x804C859: id (ast.c:58)
==30226== by 0x805BF64: expr4 (parser.c:1934)
==30226== by 0x805B6EB: expr3 (parser.c:1652)
==30226== by 0x805B484: expr2 (parser.c:1573)
==30226== by 0x805B28F: expr1 (parser.c:1505)
==30226== by 0x805B141: expr (parser.c:1468)
==30226== by 0x8059CD0: stmt (parser.c:925)
==30226== by 0x80599C3: stmt_list (parser.c:846)
==30226== by 0x80598B8: code_block (parser.c:810)
==30226== by 0x8058965: program (parser.c:343)
==30226== by 0x80584D9: Parse (parser.c:112)
==30226==
==30226== 2 bytes in 1 blocks are definitely lost in loss record 13 of 29
==30226== at 0x402BE41: malloc (vg_replace_malloc.c:270)
==30226== by 0x804C826: id (ast.c:56)
==30226== by 0x805BF64: expr4 (parser.c:1934)
==30226== by 0x805B6EB: expr3 (parser.c:1652)
==30226== by 0x805B484: expr2 (parser.c:1573)
==30226== by 0x805B28F: expr1 (parser.c:1505)
==30226== by 0x805B0F8: expr (parser.c:1444)
==30226== by 0x8059B11: stmt (parser.c:884)
==30226== by 0x80599C3: stmt_list (parser.c:846)
==30226== by 0x805A18B: stmt (parser.c:1032)
==30226== by 0x8059D59: stmt (parser.c:942)
==30226== by 0x80599C3: stmt_list (parser.c:846)
==30226==
==30226== 2 bytes in 1 blocks are definitely lost in loss record 14 of 29
==30226== at 0x402BE41: malloc (vg_replace_malloc.c:270)
==30226== by 0x804C859: id (ast.c:58)
==30226== by 0x805BF64: expr4 (parser.c:1934)
==30226== by 0x805B6EB: expr3 (parser.c:1652)
==30226== by 0x805B484: expr2 (parser.c:1573)
==30226== by 0x805B28F: expr1 (parser.c:1505)
==30226== by 0x805B0F8: expr (parser.c:1444)
==30226== by 0x8059B11: stmt (parser.c:884)
==30226== by 0x80599C3: stmt_list (parser.c:846)
==30226== by 0x805A18B: stmt (parser.c:1032)
==30226== by 0x8059D59: stmt (parser.c:942)
==30226== by 0x80599C3: stmt_list (parser.c:846)
==30226==
==30226== 2 bytes in 1 blocks are definitely lost in loss record 15 of 29
==30226== at 0x402BE41: malloc (vg_replace_malloc.c:270)
==30226== by 0x804C826: id (ast.c:56)
==30226== by 0x805BF64: expr4 (parser.c:1934)
==30226== by 0x805B6EB: expr3 (parser.c:1652)
==30226== by 0x805B484: expr2 (parser.c:1573)
==30226== by 0x805B28F: expr1 (parser.c:1505)
==30226== by 0x805B0F8: expr (parser.c:1444)
==30226== by 0x805A8AB: stmt (parser.c:1233)
==30226== by 0x80599C3: stmt_list (parser.c:846)
==30226== by 0x805A18B: stmt (parser.c:1032)
==30226== by 0x8059D59: stmt (parser.c:942)
==30226== by 0x80599C3: stmt_list (parser.c:846)
==30226==
==30226== 2 bytes in 1 blocks are definitely lost in loss record 16 of 29
==30226== at 0x402BE41: malloc (vg_replace_malloc.c:270)
==30226== by 0x804C859: id (ast.c:58)
==30226== by 0x805BF64: expr4 (parser.c:1934)
==30226== by 0x805B6EB: expr3 (parser.c:1652)
==30226== by 0x805B484: expr2 (parser.c:1573)
==30226== by 0x805B28F: expr1 (parser.c:1505)
==30226== by 0x805B0F8: expr (parser.c:1444)
==30226== by 0x805A8AB: stmt (parser.c:1233)
==30226== by 0x80599C3: stmt_list (parser.c:846)
==30226== by 0x805A18B: stmt (parser.c:1032)
==30226== by 0x8059D59: stmt (parser.c:942)
==30226== by 0x80599C3: stmt_list (parser.c:846)
==30226==
==30226== 2 bytes in 1 blocks are definitely lost in loss record 17 of 29
==30226== at 0x402BE41: malloc (vg_replace_malloc.c:270)
==30226== by 0x804C826: id (ast.c:56)
==30226== by 0x805AA54: stmt (parser.c:1268)
==30226== by 0x80599C3: stmt_list (parser.c:846)
==30226== by 0x805A18B: stmt (parser.c:1032)
==30226== by 0x8059D59: stmt (parser.c:942)
==30226== by 0x80599C3: stmt_list (parser.c:846)
==30226== by 0x80598B8: code_block (parser.c:810)
==30226== by 0x8058965: program (parser.c:343)
==30226== by 0x80584D9: Parse (parser.c:112)
==30226== by 0x804C65F: main (main.c:995)
==30226==
==30226== 2 bytes in 1 blocks are definitely lost in loss record 18 of 29
==30226== at 0x402BE41: malloc (vg_replace_malloc.c:270)
==30226== by 0x804C859: id (ast.c:58)
==30226== by 0x805AA54: stmt (parser.c:1268)
==30226== by 0x80599C3: stmt_list (parser.c:846)
==30226== by 0x805A18B: stmt (parser.c:1032)
==30226== by 0x8059D59: stmt (parser.c:942)
==30226== by 0x80599C3: stmt_list (parser.c:846)
==30226== by 0x80598B8: code_block (parser.c:810)
==30226== by 0x8058965: program (parser.c:343)
==30226== by 0x80584D9: Parse (parser.c:112)
==30226== by 0x804C65F: main (main.c:995)
==30226==
==30226== 3 bytes in 1 blocks are definitely lost in loss record 19 of 29
==30226== at 0x402BE41: malloc (vg_replace_malloc.c:270)
==30226== by 0x805C9FB: GetNextToken (scanner.c:294)
==30226== by 0x80584C9: Parse (parser.c:107)
==30226== by 0x804C65F: main (main.c:995)
==30226==
==30226== 3 bytes in 1 blocks are definitely lost in loss record 20 of 29
==30226== at 0x402BE41: malloc (vg_replace_malloc.c:270)
==30226== by 0x805C9FB: GetNextToken (scanner.c:294)
==30226== by 0x80585BB: match (parser.c:169)
==30226== by 0x805A941: stmt (parser.c:1248)
==30226== by 0x80599C3: stmt_list (parser.c:846)
==30226== by 0x805A18B: stmt (parser.c:1032)
==30226== by 0x8059D59: stmt (parser.c:942)
==30226== by 0x80599C3: stmt_list (parser.c:846)
==30226== by 0x80598B8: code_block (parser.c:810)
==30226== by 0x8058965: program (parser.c:343)
==30226== by 0x80584D9: Parse (parser.c:112)
==30226== by 0x804C65F: main (main.c:995)
==30226==
==30226== 3 bytes in 1 blocks are definitely lost in loss record 21 of 29
==30226== at 0x402BE41: malloc (vg_replace_malloc.c:270)
==30226== by 0x805C9FB: GetNextToken (scanner.c:294)
==30226== by 0x80585BB: match (parser.c:169)
==30226== by 0x805A1A5: stmt (parser.c:1034)
==30226== by 0x8059D59: stmt (parser.c:942)
==30226== by 0x80599C3: stmt_list (parser.c:846)
==30226== by 0x80598B8: code_block (parser.c:810)
==30226== by 0x8058965: program (parser.c:343)
==30226== by 0x80584D9: Parse (parser.c:112)
==30226== by 0x804C65F: main (main.c:995)
==30226==
==30226== 5 bytes in 1 blocks are definitely lost in loss record 22 of 29
==30226== at 0x402BE41: malloc (vg_replace_malloc.c:270)
==30226== by 0x805C9FB: GetNextToken (scanner.c:294)
==30226== by 0x80585BB: match (parser.c:169)
==30226== by 0x8059136: decl (parser.c:583)
==30226== by 0x8058984: decl_list (parser.c:357)
==30226== by 0x8058955: program (parser.c:340)
==30226== by 0x80584D9: Parse (parser.c:112)
==30226== by 0x804C65F: main (main.c:995)
==30226==
==30226== 5 bytes in 1 blocks are definitely lost in loss record 23 of 29
==30226== at 0x402BE41: malloc (vg_replace_malloc.c:270)
==30226== by 0x805C9FB: GetNextToken (scanner.c:294)
==30226== by 0x80585BB: match (parser.c:169)
==30226== by 0x805A941: stmt (parser.c:1248)
==30226== by 0x80599C3: stmt_list (parser.c:846)
==30226== by 0x80598B8: code_block (parser.c:810)
==30226== by 0x8058965: program (parser.c:343)
==30226== by 0x80584D9: Parse (parser.c:112)
==30226== by 0x804C65F: main (main.c:995)
==30226==
==30226== 5 bytes in 1 blocks are definitely lost in loss record 24 of 29
==30226== at 0x402BE41: malloc (vg_replace_malloc.c:270)
==30226== by 0x805C9FB: GetNextToken (scanner.c:294)
==30226== by 0x80585BB: match (parser.c:169)
==30226== by 0x8059CEA: stmt (parser.c:927)
==30226== by 0x80599C3: stmt_list (parser.c:846)
==30226== by 0x80598B8: code_block (parser.c:810)
==30226== by 0x8058965: program (parser.c:343)
==30226== by 0x80584D9: Parse (parser.c:112)
==30226== by 0x804C65F: main (main.c:995)
==30226==
==30226== 5 bytes in 1 blocks are definitely lost in loss record 25 of 29
==30226== at 0x402BE41: malloc (vg_replace_malloc.c:270)
==30226== by 0x805C9FB: GetNextToken (scanner.c:294)
==30226== by 0x805A186: stmt (parser.c:1031)
==30226== by 0x8059D59: stmt (parser.c:942)
==30226== by 0x80599C3: stmt_list (parser.c:846)
==30226== by 0x80598B8: code_block (parser.c:810)
==30226== by 0x8058965: program (parser.c:343)
==30226== by 0x80584D9: Parse (parser.c:112)
==30226== by 0x804C65F: main (main.c:995)
==30226==
==30226== 7 bytes in 2 blocks are definitely lost in loss record 26 of 29
==30226== at 0x402BE41: malloc (vg_replace_malloc.c:270)
==30226== by 0x805CE4D: GetNextToken (scanner.c:472)
==30226== by 0x8059B0C: stmt (parser.c:883)
==30226== by 0x80599C3: stmt_list (parser.c:846)
==30226== by 0x805A18B: stmt (parser.c:1032)
==30226== by 0x8059D59: stmt (parser.c:942)
==30226== by 0x80599C3: stmt_list (parser.c:846)
==30226== by 0x80598B8: code_block (parser.c:810)
==30226== by 0x8058965: program (parser.c:343)
==30226== by 0x80584D9: Parse (parser.c:112)
==30226== by 0x804C65F: main (main.c:995)
==30226==
==30226== 7 bytes in 2 blocks are definitely lost in loss record 27 of 29
==30226== at 0x402BE41: malloc (vg_replace_malloc.c:270)
==30226== by 0x805B9C6: expr4 (parser.c:1765)
==30226== by 0x805B6EB: expr3 (parser.c:1652)
==30226== by 0x805B484: expr2 (parser.c:1573)
==30226== by 0x805B28F: expr1 (parser.c:1505)
==30226== by 0x805B0F8: expr (parser.c:1444)
==30226== by 0x8059B11: stmt (parser.c:884)
==30226== by 0x80599C3: stmt_list (parser.c:846)
==30226== by 0x805A18B: stmt (parser.c:1032)
==30226== by 0x8059D59: stmt (parser.c:942)
==30226== by 0x80599C3: stmt_list (parser.c:846)
==30226== by 0x80598B8: code_block (parser.c:810)
==30226==
==30226== 11 bytes in 3 blocks are definitely lost in loss record 28 of 29
==30226== at 0x402BE41: malloc (vg_replace_malloc.c:270)
==30226== by 0x805C9FB: GetNextToken (scanner.c:294)
==30226== by 0x80585BB: match (parser.c:169)
==30226== by 0x8059B2B: stmt (parser.c:886)
==30226== by 0x80599C3: stmt_list (parser.c:846)
==30226== by 0x805A18B: stmt (parser.c:1032)
==30226== by 0x8059D59: stmt (parser.c:942)
==30226== by 0x80599C3: stmt_list (parser.c:846)
==30226== by 0x80598B8: code_block (parser.c:810)
==30226== by 0x8058965: program (parser.c:343)
==30226== by 0x80584D9: Parse (parser.c:112)
==30226== by 0x804C65F: main (main.c:995)
==30226==
==30226== 9,036 bytes in 251 blocks are definitely lost in loss record 29 of 29
==30226== at 0x402BE41: malloc (vg_replace_malloc.c:270)
==30226== by 0x805E225: scopeInit (symtab.c:317)
==30226== by 0x804C62E: main (main.c:992)
==30226==
==30226== LEAK SUMMARY:
==30226== definitely lost: 9,120 bytes in 283 blocks
==30226== indirectly lost: 0 bytes in 0 blocks
==30226== possibly lost: 0 bytes in 0 blocks
==30226== still reachable: 0 bytes in 0 blocks
==30226== suppressed: 0 bytes in 0 blocks
==30226==
==30226== For counts of detected and suppressed errors, rerun with: -v
==30226== Use --track-origins=yes to see where uninitialised values come from
==30226== ERROR SUMMARY: 90 errors from 59 contexts (suppressed: 0 from 0)

Vincenzo1968
04-01-2013, 16:14
Il problema è nel file "mc_replace_strmem.c" o in uno dei miei file?



scanner.c:

http://img855.imageshack.us/img855/9295/scannercriga296.jpg

Vincenzo1968
04-01-2013, 18:57
Il manuale dice che il problema si verifica nel file indicato nella prima riga dopo "Invalid write of size 1"


Invalid write of size 1
==30226== at 0x402C6C5: strcpy (mc_replace_strmem.c:438)
==30226== by 0x805CA2E: GetNextToken (scanner.c:296)


Dunque sembrerebbe un bug di GCC. Per esserne sicuro dovrei provare a utilizzare un altro compilatore. Che compilatori ci sono su Linux oltre a GCC?

Vincenzo1968
04-01-2013, 20:49
Ho installato il compilatore Intel:

http://img801.imageshack.us/img801/5684/intels.jpg

http://software.intel.com/en-us/intel-parallel-studio-xe

http://software.intel.com/en-us/non-commercial-software-development

http://www.hwupgrade.org/public/style_emoticons/default/coolface.png

Ora debbo capire come si usa.

Vincenzo1968
04-01-2013, 21:54
Confermato. Si tratta di un bug di GCC a 32 bit. Compilando col compilatore Intel funziona tutto a meraviglia(anche senza allineamento):

http://img16.imageshack.us/img16/8615/intelcomp.jpg

E io che stavo impazzendo a cercare il bug nel mio codice...

http://www.hwupgrade.org/public/style_emoticons/default/rage.png http://www.hwupgrade.org/public/style_emoticons/default/rage.png http://www.hwupgrade.org/public/style_emoticons/default/rage.png

cdimauro
05-01-2013, 00:30
Uomo di poca fede. :O

P.S. Anche GCC è farina del sacco di Stallman. :asd:

Vincenzo1968
05-01-2013, 11:17
Praticamente è da quando hanno deciso di sostituire bison con un parser a discesa ricorsiva scritto a mano che gcc presenta qualche bug...



Scheeeeeerzo :Prrr:

No, ma, a parte gli scherzi, vorrei segnalare il bug al team degli sviluppatori GCC. Vorrei mandargli i sorgenti del mio programma, il log di Valgrind, i test che ho effettuato e i risultati ottenuti. Come si fa? Chi debbo contattare? A chi debbo telefonare? Debbo prendere l'aereo e consegnare il tutto personalmente?

WarDuck, Cesare, Marco: grazie di cuore a tutti voi per i vostri preziosi consigli e suggerimenti. Senza di voi probabilmente starei ancora impazzendo cercando di scovare il bug. Un ringraziamento particolare a Marco per l'ottimo Valgrind.

;)

Vincenzo1968
05-01-2013, 12:31
Alt! Fermi tutti!

In realtà ho sbagliato a passare il parametro per la compilazione a 32 bit: doveva essere -m32(come in GCC) e non -mia32.
compilando con -mia32 il parametro viene ignorato e viene prodotto un eseguibile a 64 bit(ecco perché funziona, come nel caso di GCC).
Me ne sono accorto col comando "file" che mostra se un file eseguibile è a 32 o 64 bit.

La compoilazione a 32 bit col compilatore Intel produce lo stesso errore segfault del compilatore GCC:
http://img715.imageshack.us/img715/4423/erroreintel.jpg

E dunque il bug è nel mio codice, non in GCC.
Ma intanto perché Valgrind mi indica il file mc_replace_strmem.c?

Invalid write of size 1
==30226== at 0x402C6C5: strcpy (mc_replace_strmem.c:438)
==30226== by 0x805CA2E: GetNextToken (scanner.c:296)


Si prospetta un gran bel fine settimana... :mad:

Adesso provo a sostituire le dichiarazioni dei tipi con quelli definiti in stdint.h, come suggerito da WarDuck.

:mbe:

Vincenzo1968
05-01-2013, 15:45
Anche col compilatore Intel se uso l'allineamento è tutto ok:

http://img441.imageshack.us/img441/5933/intel32ok2.jpg

Mah! :confused:

WarDuck
05-01-2013, 15:56
Ti consiglio anche di sostituire la strcpy con strncpy, la variante che ti consente di specificare il numero massimo di bytes da scrivere nel buffer, è più sicura.

Vincenzo1968
05-01-2013, 16:00
Ti consiglio anche di sostituire la strcpy con strncpy, la variante che ti consente di specificare il numero massimo di bytes da scrivere nel buffer, è più sicura.

Grazie WarDuck.
Ancora non ho sostituito le dichiarazioni dei tipi con quelli in stdint.h(ho lavorato di debug con Valgrind).

Faccio le sostituzioni che mi hai indicato e ti faccio sapere.

marco.r
06-01-2013, 01:49
Ma intanto perché Valgrind mi indica il file mc_replace_strmem.c?

Perche' e dove avviene lo sforamento. Il problema pero' direi che probabilmente sta nella funzione che lo chiama.
Puoi a valgrind di aprire il debugger quando incontra quell'errore, invece di continuare impunemente. Usare gdb da linea di comando non e' la cosa piu' piacevole del mondo, ma almeno dovresti poter vedere l'input al momento della chiamata e capire cosa c'e' di sbagliato negli argomenti.
Nel frattempo segui il consiglio di Warduck riguardo strncpy, e aumenta la dimensione dei buffer.

Vincenzo1968
06-01-2013, 09:58
Ho applicato le sostituzioni indicate da WarDuck ma il problema rimane. Resta comunque una buona pratica de seguire per la portabilità. D'ora in poi la adotterò.

Intanto ho isolato la parte di codice rognosa(grazie a Valgrind):


typedef struct nodeTypeTag
{
nodeEnum type;
enumTipo0 type0; /* T_SIMPLE, T_ARRAY */
enumTipo1 type1; /* T_INTEGER, T_REAL, T_STRING, T_BOOLEAN */
enumTipo2 type2; /* T_CONST, T_VAR */

/* union deve essere l'ultima voce in nodeType */
/* perché operNodeType può crescere dinamicamente */
union
{
PREFIX_ALIGNED constNodeType con SUFFIX_ALIGNED; /* costanti */
PREFIX_ALIGNED idNodeType id SUFFIX_ALIGNED; /* identificatori */
PREFIX_ALIGNED operatorNodeType opr SUFFIX_ALIGNED; /* operatori */
};
} nodeType;


E' la union a creare problemi a 32 bit. Sto modificando il codice per eliminarla.

Aho', 'sto Valgrind è favoloso! (anche da riga di comando) :D
Non c'è una versione per Windows(o qualcosa di simile)?

Vincenzo1968
06-01-2013, 14:56
Risoltoooooooooooooooooooooooooooooooooo!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

http://img407.imageshack.us/img407/6053/funziona.jpg

:yeah: :winner: :yeah:

Vincenzo1968
06-01-2013, 15:01
Non era la union. Era quella minchia di funzione con argomenti variabili.

Ho risolto così:

Questa la funzione incriminata(nel file "ast.c"):

nodeType *opr(int oper, int nops, ...)
{
va_list ap;
nodeType *p = NULL;
size_t nodeSize;
int i;

nodeSize = SIZEOF_NODETYPE + sizeof(operatorNodeType) + (nops - 1) * sizeof(nodeType*);

if ((p = (nodeType*)malloc(nodeSize)) == NULL)
{
printf("Errore: memoria insufficiente.\n");
return NULL;
}

p->type = typeOperator;
p->opr.oper = oper;
p->opr.nops = nops;

va_start(ap, nops);
for (i = 0; i < nops; i++)
p->opr.op[i] = va_arg(ap, nodeType*);
va_end(ap);

return p;
}


L'ho modificata così:

nodeType *opr(int oper, int nops, nodeType *p1, nodeType *p2, nodeType *p3)
{
nodeType *p = NULL;
size_t nodeSize;

nodeSize = SIZEOF_NODETYPE + sizeof(operatorNodeType);

if ((p = (nodeType*)malloc(nodeSize)) == NULL)
{
printf("Errore ast opr: memoria insufficiente.\n");
return NULL;
}

p->type = typeOperator;
p->opr.oper = oper;
p->opr.nops = nops;
p->opr.op[0] = p1;
p->opr.op[1] = p2;
p->opr.op[2] = p3;

return p;
}


Senza Valgrind non ce l'avrei mai fatta. Grazie di cuore a Marco per avermelo segnalato.
Ti meriti un bacino sulla fronte. Tie': smackkkkkkkkkkkkkk.
:D

Grazie di cuore anche a WarDuck e Cesare ;)

Stallman for president :D

Vincenzo1968
06-01-2013, 15:20
Ovviamente funziona anche compilando coi compilatori Intel (http://software.intel.com/en-us/intel-parallel-studio-xe) e CLang (http://clang.llvm.org/):

http://img12.imageshack.us/img12/5364/funzionaiccclang.jpg

:yeah: :winner: :yeah:

marco.r
07-01-2013, 13:18
Il link che ti avevo dato contiene riferimenti ad altri prodotti analoghi , alcuni dei quali disponibili pure per windows.
Ad esempio
http://www.drmemory.org/

Pero' non li ho mai usati e non li conosco (neanche di nome).

Vincenzo1968
07-01-2013, 14:59
Il link che ti avevo dato contiene riferimenti ad altri prodotti analoghi , alcuni dei quali disponibili pure per windows.
Ad esempio
http://www.drmemory.org/

Pero' non li ho mai usati e non li conosco (neanche di nome).

No no, che prodotti analoghi! Io mi sono innamorato di Valgrind. E' meraviglioso.

Minchia ti dice anche se lasci la memoria sporca perché ti sei dimenticato una free!

Come ho fatto per vent'anni a non utilizzarlo? E come ho potuto rinunciare a Linux per vent'anni? Ma come sono stato pazzo? :mad:

:D

Bisogna avviarlo coi seguenti parametri:

--leak-check=full
--show-reachable=yes
--track-origins=yes
--log-file=outValgrind.txt

Per esempio:

valgrind --leak-check=full --show-reachable=yes --track-origins=yes --log-file=outValgrind.txt ./Contest1732 Files/prog01.txt


:yeah: :winner: :yeah:

Edit: comunque ora provo 'sto Dr. Memory visto che è disponibile anche per Windows. http://www.hwupgrade.it/forum/images_hwu/smilies/icon_mrgreen.gif

Riedit: Ahi! : Dr. Memory currently targets 32-bit applications only.