Newsgroup: it.comp.lang.c
Titolo: Strano segmentation fault

Ciao, 
Sto scrivendo un programma 
che compila sia con cygwin che con gcc.
Ma succede una cosa strana.
Con gcc funziona correttamente ma con cygwin 
mi da una segmentation fault.
La cosa strana e' che se aggiungo una sola 
printf(""); funziona bene anche con cygwin.
quale puo' essere la causa? 
grazie 

cerelaz ha scritto:

Probabilmente e' un caso che funzioni con gcc. Magari hai usato qualche 
funzione tipo scanf, gets, strcpy o altre senza controllo, vero? Senza 
codice e' difficile capire, ma credo che sia un buffer overflow. Gcc ha 
l'abitudine di arrotondare lo stack a 16 byte e quindi potresti non 
notare il problema dato che sovrascrivi memoria inutile. Cygwin sembra 
non farlo e quindi vai a sovrascrivere qualcosa di importante, tipo l'ip 
di ritorno, magari aumentandolo di pochi byte. Quella printf ti allunga 
la sezione text e quindi l'ip di ritorno rimane valido anche se 
sbagliato. Sono solo ipotesi di uno che si e' appena svegliato, 
comunque... :-)
-- 
Devaraja (Xdevaraja87^gmail^c0mX)
Linux Registerd User #338167
http://counter.li.org

 sbagliato. Sono solo ipotesi di uno che si e' appena svegliato, comunque... :-)
Se cambio posizione a tre righe, portando sopra un if 
tutto funziona. Mistero della fede :-)
Il codice e' molto lungo e non posso postarlo. 
aggiungo una domanda:
Se all'interno della funzione dichiaro 3 array di ulong lunghi 256
ciascuno come ulong pippo[256] questi utilizzano lo stack, giusto? 
a livello di prestazioni e' meglio allocarli nello heap con una malloc? 
(potrebbe essere questo il problema?)
Come si scopre dov'e' l'errore?

 
Posti la parte di codice incriminata...
ReDiCuori
-- 
-- 
L'uomo non sa perchè si innamora, l'uomo viene travolto e basta
------------------------------­---------------------------
www.giordanoemilio.altervista.org
------------------------------­---------------------------
www.securitygroup.it
Società di servizio che opera nel campo
della sicurezza aziendale
------------------------------­---------------------------
www.pascallike.too.it
http://utenti.lycos.it/pascallike
il sito sulla programmazione pascal
sorgenti, tutorial ed utility
------------------------------­------------------------------
www.treves-srl.com
Libreria Internazionale Treves
Via Toledo 249/250 Napoli
------------------------------­------------------------------
www.alphalibri.com
Vendita ingrosso di libri
Via S.Anna dei Lombardi 10 , Napoli
------------------------------­-------------------------

 --
segmentation fault qualunque sia il valore di i->skip
ma se metto s->skip = 1 cioe' esco al primo if 
i->a_s vale 76
Questo funziona 
Anche se i-> vale piu di 1 cioe' anche se non esco subito al primo if
int
fooo (ulong pe, ulong element, ulong * positions, pluto * i)
{
	ulong curr_row, used, recurs, elements, diff;
	ulong *elem_array;	// contiene il numero di elementi del sottogruppo
	ulong occsp[i->a_s];
	ulong occep[i->a_s];
	ulong occcharsup;
	suint *step_array, step;	// come sopra ma passi
	uchar chars_in[i->a_s];
	int j, state, num_char;
	if(i->skip == 1) {
		get_p (pe, element, 0, positions, i);
		return element;
	}
	ulong occ_sb[i->a_s], occ_b[i->a_s];
	suint localstep;
	uchar c, c_sb, cb;
	if(i->op==i->a_s-1)
		occcharsup = i->size-1;
	else 
		occcharsup = i->b_occ[i->op+1];
	continua .....
Questo NO
int
fooo (ulong pe, ulong element, ulong * positions, pluto * i)
{
	if(i->skip == 1) {
		get_p (pe, element, 0, positions, i);
		return element;
	}
	ulong curr_row, used, recurs, elements, diff;
	ulong *elem_array;	// contiene il numero di elementi del sottogruppo
	ulong occsp[i->a_s];
	ulong occep[i->a_s];
	ulong occcharinf = i->b_occ[i->op];
	ulong occcharsup;
	suint *step_array, step;	// come sopra ma passi
	uchar chars_in[i->a_s];
	int j, state, num_char;
	ulong occ_sb[i->a_s], occ_b[i->a_s];
	suint localstep;
	uchar c, c_sb, cb;
	if(i->op==i->a_s-1)
		occcharsup = i->size-1;
	else 
		occcharsup = i->b_occ[i->op+1];
	continua .....

 Come si scopre dov'e' l'errore?
Servono due strumenti: un debugger e tanta pazienza. Verifica tutte le
allocazioni dinamiche. Accertati che non vegano rilasciate (free) piů di
una volta. Controlla le operazioni di scrittura negli array. Accertati che
nessuna superi i confini. Tieni presente che il mancato rispetto dei limiti
di un blocco di memoria allocato non determina necessariamente un errore
run-time nel punto incriminato.
Con il debugger puoi vedere qual č l'operazione che ha determinato il
"segmentation fault". Risalendo a ritroso puoi identificare le cause,
verificando, ad esempio, se qualche struttura dati č stata inavvertitamente
corrotta in qualche momento.
Max