Newsgroup: it.comp.lang.c
Titolo: realloc() Illegal instruction

Salve a tutto il NG.
Ho un problema di "Illegal Instruction" per via di una realloc.
Il mio programmino dovrebbe prendere un file e riempire un buffer ogni
4096 "oggetti" letti.
a questo punto il buffer deve essere concatenato ad un array dinamico 
preventivamente allocato.
Bene , dopo la prima malloc(sizeof(int)*4096) fatta in fase di
inizializzazione dell'array dinamico 
int *out = (int*) malloc(sizeof(int)*4096);
il mio codice si presenta cosi: 
while(!feof(filein)) {
	out = (int *) realloc(out, 4096*sizeof(int));
	size = fread(buffer,2,4096,filein);
 
 for(i=0; i<size; i++) {
  	      out[count] = buffer[i];
              count++;
                }
  }
La compilazione (anche con l'opzione Wall dell gcc non segnala nessun
errore ma in esecuzione il programma genera un incomprensibile "Illegal
instruction".
Grazie in anticipo per l'aiuto.
-- 
_________________________________________________
Imagine no possessions
I wonder if you can
No need for greed or hunger
A brotherhood of man
Imagine all the people
Sharing all the world...
		John Lennon
_________________________________________________
_________________________________________________
Francesco Gadaleta - Italian GNU/Linux User
      web site: 
www.gadaleta.org
   email   : 
fran...@gadaleta.org
_________________________________________________
Pls do not send me Word or Powerpoint files 
RMS'll explain you why, here: 
http://www.gadaleta.org/articles/ita/allegati_word.html

  }
Luca
-- 
Home: 
http://kronoz.cjb.net
"Ci sono le balle , le megaballe e le statistiche".
 Mark Twain

 Luca
Grazie della risposta celere :-)
cmq c'e' ancora un seg fault introdotto dalla realloc.
Ti uppo il codice ; io non vedo nulla di strano .
        int *out = NULL;
        int *tmp = NULL;
 
        int elemread = 0;
        size_t size = 0;
 
        int i;
        int count = 0;
        short buffer[4096];
 while(!feof(filein)) {
                size += sizeof(int)*4096;
                // printf(" %d \n ", size);    // for debug only!!
                out = realloc(out, size);
                if(!tmp) {
                        exit(1);
                }
                out = tmp;
                elemread = fread(buffer,2,4096,filein);
 
        for(i=0; i<elemread; i++) {
                out[count] = buffer[i];
                count++;
                }
        }
Grazie ancora.
Fra
-- 
_________________________________________________
Imagine no possessions
I wonder if you can
No need for greed or hunger
A brotherhood of man
Imagine all the people
Sharing all the world...
		John Lennon
_________________________________________________
_________________________________________________
Francesco Gadaleta - Linux Italian User


         }
Il puntatore *tmp è sempre NULL!



:-)
hai ragione :-)
che noti di strano nel "mio" codice ? 


 
Domanda, forse banale, ma ho notato che in molti specificate il fatto
di NON effettuare il cast del puntatore restituito dalla malloc
(void*) al tipo cui viene assegnato. E' lecito chiedere come mai? E'
una questione di forma o c'e' una qualche ragione profonda che mi
sfugge/ignoro?
Grazie mille,
  Sergio "33%" Borghese
reply to: sergio DOT borghese AT_ NOSPAM snai DOT it

 sfugge/ignoro?
Lo standard non lo vieta ma nn lo consiglia, stando a quanto ho letto 
nell'ng :D
-- 
Kleidemos
Un computer a un altro quando si incontrano:
"Ciao, come ti boota oggi???"


Un mucchio di cose purtroppo :-(
a.. void *realloc(void *ptr, size_t size)
Cambia la dimensione del blocco allocato all'indirizzo ptr portandola a
size.
La funzione restituisce il puntatore alla zona di memoria allocata in caso
di successo e NULL in caso di fallimento, nel qual caso errno assumerà il
valore ENOMEM.
Ricontrollati il puntatore *out prechè va troppo in alto.. elimina il
puntatore *tmp che non ti serve a nulla e anche il contatore count (utilizza
l'atirmetica dei puntatori..)
Il fatto è che ho momentaneamente sospeso la programmazione per altri hobby,
ho cercato di indirizzarti, magari altri potranno sciverti il programmino
funzionante io al momento non ho neanche il compilaore installato..
---
Outgoing mail is certified Virus Free.
Checked by AVG anti-virus system (
http://www.grisoft.com
).
Version: 6.0.622 / Virus Database: 400 - Release Date: 13/03/2004

 Release Date: 13/03/2004
-- 
_________________________________________________
Imagine no possessions
I wonder if you can
No need for greed or hunger
A brotherhood of man
Imagine all the people
Sharing all the world...
		John Lennon
_________________________________________________
_________________________________________________
Francesco Gadaleta - Italian GNU/Linux User


                out = tmp;
Stai facendo casino con i puntatori. Sicuro che il problema e` sulla
realloc? Puoi postare un backtrack del crash?
Luca
-- 
Home: 
http://kronoz.cjb.net
"Su cio` di cui non si puo` parlare e` bene tacere".
 Ludwig Wittgenstein

 sfugge/ignoro?
Cercando sul NG trovi la risposta :)
In sintesi il problema nasce quando il prototipo di malloc non e`
visibile e sizeof(int) != sizeof(void*). Questo puo` portate a
comportamenti apparentemente inspiegabili ed il cast sopprime un warning
che ti indicherebbe la causa dei problemi.
Luca
-- 
Home: 
http://kronoz.cjb.net
Una donna sposa un uomo sperando che cambi, e lui non cambiera`. Un
uomo sposa una donna sperando che non cambi, e lei cambiera`.



Ok, allora al momento (visti i numerosi aggiornamenti) il codice e' il
seguente:
out = malloc(sizeof(int)*4096);
        if(!out)
                printf("Sti cazzi!!!");
        mdct_init(info, winsz);
        while(!feof(filein)) {
                size += sizeof(short)*4096;
//              printf(" %d \n ", size);
                tmp = realloc(out, size);
                if(!tmp) {
                        exit(1);
                }
                out = tmp;
                elemread = fread(buffer,2,4096,filein);
        for(i=0; i<elemread; i++) {
                out[count] = (int) buffer[i];
                count++;
                }
        blocks++;
        } // close while
un strace dell'eseguibile si blocca qui:
 strace ./process
execve("./process", ["./process"], [/* 24 vars */]) = 0
uname({sys="Linux", node="calypsoII", ...}) = 0
brk(0)                                  = 0x804ba94
old_mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x40017000
access("/etc/ld.so.nohwcap", F_OK)      = -1 ENOENT (No such file or directory)
open("/etc/ld.so.preload", O_RDONLY)    = -1 ENOENT (No such file or directory)
open("/etc/ld.so.cache", O_RDONLY)      = 3
fstat64(3, {st_mode=S_IFREG|0644, st_size=63465, ...}) = 0
old_mmap(NULL, 63465, PROT_READ, MAP_PRIVATE, 3, 0) = 0x40018000
close(3)                                = 0
access("/etc/ld.so.nohwcap", F_OK)      = -1 ENOENT (No such file or directory)
open("/lib/libm.so.6", O_RDONLY)        = 3
read(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0@5\0\000"..., 512) = 512
fstat64(3, {st_mode=S_IFREG|0644, st_size=134388, ...}) = 0
old_mmap(NULL, 136944, PROT_READ|PROT_EXEC, MAP_PRIVATE, 3, 0) = 0x40028000
old_mmap(0x40049000, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED, 3, 0x20000) = 0x40049000
close(3)                                = 0
access("/etc/ld.so.nohwcap", F_OK)      = -1 ENOENT (No such file or directory)
open("/lib/libc.so.6", O_RDONLY)        = 3
read(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0\200^\1"..., 512) = 512
fstat64(3, {st_mode=S_IFREG|0644, st_size=1244004, ...}) = 0
old_mmap(NULL, 1254244, PROT_READ|PROT_EXEC, MAP_PRIVATE, 3, 0) = 0x4004a000
old_mmap(0x40172000, 32768, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED, 3, 0x127000) = 0x40172000
old_mmap(0x4017a000, 9060, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x4017a000
close(3)                                = 0
munmap(0x40018000, 63465)               = 0
brk(0)                                  = 0x804ba94
brk(0x806ca94)                          = 0x806ca94
brk(0)                                  = 0x806ca94
brk(0x806d000)                          = 0x806d000
open("linda.raw", O_RDONLY)             = 3
--- SIGILL (Illegal instruction) @ 0 (0) ---
+++ killed by SIGILL +++
e cioe' sembra bloccarsi alla lettura del secondo blocco dal file.
la cosa continua a non suggerirmi nulla di buono.
gdb non mi viene in aiuto nemmeno lui.
bhoo
-- 
_________________________________________________
Imagine no possessions
I wonder if you can
No need for greed or hunger
A brotherhood of man
Imagine all the people
Sharing all the world...
		John Lennon
_________________________________________________
_________________________________________________
Francesco Gadaleta - Italian GNU/Linux User


Sullo stesso codice di prima ho fatto un gdb con relativi break
e ho avuto la conferma che il problema e' nella realloc.
(gdb) next
32              if(!out) 
(gdb) next
35              mdct_init(info, winsz);
(gdb) next
37              while(!feof(filein)) {
(gdb) next
38                      size += sizeof(short)*4096;
(gdb) next
Breakpoint 2, main () at process.c:40
40                      tmp = realloc(out, size);
(gdb) next
Program received signal SIGILL, Illegal instruction.
0x0804fd74 in ?? ()


 un strace dell'eseguibile si blocca qui:
Non serve, intendevo un trace del gdb.
Luca
-- 
Home: 
http://kronoz.cjb.net
"It is more complicated than you think"
                -- The Eighth Networking Truth from RFC 1925



Stasera ho rifatto tutto con una linked-list usando malloc e free nel modo
piu standard possibile.
Sconsiglio a tutti l'uso di realloc che sotto linux ha anche problemi.
K&R rulez.
Grazie a tutti comunque.
Fra 
-- 
_________________________________________________
Imagine no possessions
I wonder if you can
No need for greed or hunger
A brotherhood of man
Imagine all the people
Sharing all the world...
		John Lennon
_________________________________________________
_________________________________________________
Francesco Gadaleta - Linux Italian User


 Sconsiglio a tutti l'uso di realloc che sotto linux ha anche problemi.
Dai, non scriviamo stupidate. Se pensi che il problema sia nella
libreria C nel 99% dei casi il problema e` in realta` nel tuo codice. Il
comportamento che vedi lascia presupporre che l'allocatore sia molto
confuso, probabilmente per qualche errore precedente al codice postato.
E, per la cronaca, realloc sotto linux non ha alcun problema.
Luca
-- 
Home: 
http://kronoz.cjb.net
Porc i' mond che cio' sott i piedi!
V. Catozzo

 Luca
Diciamo che e' meglio restare sullo standard ... per me standard e' quello
che e' scritto sul Kernighan&Ritchie, dove la realloc e' menzionata solo
sulla sintassi.
Il modo piu' "pulito" per risolvere la mia questione era una linked list
realizzata in un'ora di lavoro, testata e funzionante al secondo colpo.
La mia conclusione e' che malloc() e free(), effettivamente bastano per
l'allocazione dinamica della memoria.
Luca, non dimenticare che anche gcc ha problemi quindi .... 
Va be' ... ma non facciamo polemiche adesso :-)
L'importante e' che ho risolto no ?


 Va be' ... ma non facciamo polemiche adesso :-)
Nessuna polemica, semplicemente la tua affermazione era totalmente
gratuita, FUD. gcc (o meglio glibc) hanno sicuramente dei bug, ma non
cosi` macroscopici.
Luca
-- 
Home: 
http://kronoz.cjb.net
Il dottore mi ha detto di smettere di fare cene intime per quattro.
A meno che non ci siamo altre tre persone.