Re: segfault su Debian & su centos 5 no

2012-12-31 Per discussione bodrato
Ciao,

Il Dom, 30 Dicembre 2012 7:45 pm, emmanuel segura ha scritto:
> Sto giocando con un piccolo e stupido programma in C che posto qua sotto,
> sulla mia debian 6.0.6 va in segfault su una centos 5 no, la cosa stranna

[...]

> name_t pa[];
>
> int main()
> {
> int i,SIZE = 255;
> for(i = 0; i <= SIZE; i++)
> {
> pa[i].name = "Pippo";
> pa[i].id = i;
> printf("\t%s - %d\n",pa[i].name,pa[i].id);
> }
> }

Quale sarebbe il risultato atteso da questo programma?

Io, vedendo che questo programma scrive dentro un array per il quale non
è stata allocata memoria, mi aspetterei un "segfault". Quindi direi che
la tua prova con Debian è andata più vicina al risultato atteso.

Come ti hanno già scritto altri, attento ai messaggi del compilatore, il
gcc dice chiaramente:
/tmp/x.c:8:8: warning: array ‘pa’ assumed to have one element [enabled
by default]

Quindi, se 'pa' ha un elemento e tu ne scrivi 256...

Ti consiglierei di cominciare il codice con
#define SIZE 256

definire l'array con
name_t pa[SIZE];

non ridichiarare la variabile SIZE dentro la funzione main e impostare il
ciclo con:
for(i = 0; i < SIZE; i++)

... poi leggere un buon manuale sul C, al capitolo sui puntatori.

Infine compilare con 'gcc -Wall' e leggere _tutti_ i "warning" che il
compilatore tira fuori.

Buono studio,
m

-- 
http://bodrato.it/software/combinatorics.html


-- 
Per REVOCARE l'iscrizione alla lista, inviare un email a 
debian-italian-requ...@lists.debian.org con oggetto "unsubscribe". Per
problemi inviare un email in INGLESE a listmas...@lists.debian.org

To UNSUBSCRIBE, email to debian-italian-requ...@lists.debian.org
with a subject of "unsubscribe". Trouble? Contact listmas...@lists.debian.org
Archive: 
http://lists.debian.org/36307.151.32.166.21.1356948957.squir...@mail.dm.unipi.it



Re: segfault su Debian & su centos 5 no

2012-12-31 Per discussione emmanuel segura
Ciao Bodrato

Capisco il tuo consiglio e ti rigranzio, ma comunque non mi spiego perche
su debian a 64 non funziona invece su una debian a 32bit e su centos 32 bit
si

Il giorno 31 dicembre 2012 11:15,  ha scritto:

> Ciao,
>
> Il Dom, 30 Dicembre 2012 7:45 pm, emmanuel segura ha scritto:
> > Sto giocando con un piccolo e stupido programma in C che posto qua sotto,
> > sulla mia debian 6.0.6 va in segfault su una centos 5 no, la cosa stranna
>
> [...]
>
> > name_t pa[];
> >
> > int main()
> > {
> > int i,SIZE = 255;
> > for(i = 0; i <= SIZE; i++)
> > {
> > pa[i].name = "Pippo";
> > pa[i].id = i;
> > printf("\t%s - %d\n",pa[i].name,pa[i].id);
> > }
> > }
>
> Quale sarebbe il risultato atteso da questo programma?
>
> Io, vedendo che questo programma scrive dentro un array per il quale non
> è stata allocata memoria, mi aspetterei un "segfault". Quindi direi che
> la tua prova con Debian è andata più vicina al risultato atteso.
>
> Come ti hanno già scritto altri, attento ai messaggi del compilatore, il
> gcc dice chiaramente:
> /tmp/x.c:8:8: warning: array ‘pa’ assumed to have one element [enabled
> by default]
>
> Quindi, se 'pa' ha un elemento e tu ne scrivi 256...
>
> Ti consiglierei di cominciare il codice con
> #define SIZE 256
>
> definire l'array con
> name_t pa[SIZE];
>
> non ridichiarare la variabile SIZE dentro la funzione main e impostare il
> ciclo con:
> for(i = 0; i < SIZE; i++)
>
> ... poi leggere un buon manuale sul C, al capitolo sui puntatori.
>
> Infine compilare con 'gcc -Wall' e leggere _tutti_ i "warning" che il
> compilatore tira fuori.
>
> Buono studio,
> m
>
> --
> http://bodrato.it/software/combinatorics.html
>
>


-- 
esta es mi vida e me la vivo hasta que dios quiera


Re: segfault su Debian & su centos 5 no

2012-12-31 Per discussione GiancFir

Il 31/12/2012 12:14, emmanuel segura ha scritto:

Ciao Bodrato

Capisco il tuo consiglio e ti rigranzio, ma comunque non mi spiego
perche su debian a 64 non funziona invece su una debian a 32bit e su
centos 32 bit si


bisogna capire perchè in un caso si và a scrivere nella memoria del 
processo e nell'altro và a scrivere nella memoria di un altro processo o 
nella memoria di sistema.

In un caso, dopo la dichiarazione in memoria di
name_t pa[];
c'è della memoria allocata 'disponibile' (allocata dal sistema) 
nell'altro no.
Nei sistemi a 64 bit forse alloca solo la dimensione del tipo di 
variabile,  nei 32 bit magari alloca un segmento di non sò quanti bytes.

Prova  a fargli fare un loop più lungo finchè non fà 'boom'.






--
--
Meglio un uovo oggi
che una gallina domani


--
Per REVOCARE l'iscrizione alla lista, inviare un email a 
debian-italian-requ...@lists.debian.org con oggetto "unsubscribe". Per

problemi inviare un email in INGLESE a listmas...@lists.debian.org

To UNSUBSCRIBE, email to debian-italian-requ...@lists.debian.org
with a subject of "unsubscribe". Trouble? Contact listmas...@lists.debian.org
Archive: http://lists.debian.org/50e176a7.9020...@gmail.com



Re: segfault su Debian & su centos 5 no

2012-12-31 Per discussione Davide Prina

On 31/12/2012 12:14, emmanuel segura wrote:


 non mi spiego perche
su debian a 64 non funziona invece su una debian a 32bit e su centos 32 bit


attenzione, non funziona. Sembra funzionare, ma non funziona.

Il segfault non è detto che avvenga sempre allo stesso modo e nello 
stesso punto.


> typedef struct Name {
> char *name;
> int id;
> } name_t;
>
> name_t pa[];


 pa[i].name = "Pippo";


per esempio sai cosa fa quest'istruzione?
Di certo non inserisce in name la stringa "Pippo\0". name è una 
variabile che contiene un numero: un indirizzo di memoria.


Quello che probabilmente fa con quel ciclo è far si che tutti i 
puntatori pa[i].name contengano lo stesso valore numerico (indirizzo) 
che corrisponde alla memoria dove è contenuta la costante "Pippo".
Però non è detto che questo venga fatto con ogni compilatore, perché non 
è questo il modo per assegnare i valori ad un puntatore.


Inoltre, sembra funzionare, perché gli stai soltanto dicendo di andare 
alla posizione 'i' a partire dalla posizione 0 allocata con la 
dichiarazione di pa[] e se quell'area di memoria è accessibile, allora 
la usa... ma potrebbe essere usata contemporaneamente da altro... se non 
c'è null'altro che usa quell'area di memoria, allora il tuo programma 
sembra funzionare, altrimenti o hai dei malfunzionamenti o un segfault.


Ciao
Davide

--
Dizionari: http://linguistico.sourceforge.net/wiki
Petizione per l'uso di formati accessibili nell'Unione Europea
http://tinyurl.com/y6u4m5
Non autorizzo la memorizzazione del mio indirizzo su outlook


--
Per REVOCARE l'iscrizione alla lista, inviare un email a
debian-italian-requ...@lists.debian.org con oggetto "unsubscribe". Per
problemi inviare un email in INGLESE a listmas...@lists.debian.org

To UNSUBSCRIBE, email to debian-italian-requ...@lists.debian.org
with a subject of "unsubscribe". Trouble? Contact listmas...@lists.debian.org
Archive: http://lists.debian.org/50e17f1b.7000...@gmail.com



Re: [OT] programmazione in C [era: segfault su Debian & su centos 5 no]

2012-12-31 Per discussione bodrato
Ciao,

Il Lun, 31 Dicembre 2012 12:14 pm, emmanuel segura ha scritto:
> Capisco il tuo consiglio e ti rigranzio, ma comunque non mi spiego perche
> su debian a 64 non funziona invece su una debian a 32bit e su centos 32

Invece devo essermi spiegato male.

Quel programma, per le istruzioni che contiene, richiede di scrivere in
aree di memoria su cui il programma stesso non dovrebbe scrivere.
Questo, in qualunque sistema operativo che preveda il controllo della
memoria, fornirà un errore durante l'esecuzione.

Quindi il sistema che ti dà "segfault" prima è quello che "funziona
meglio".

Un programma funziona se è scritto coscienziosamente dal programmatore in
modo tale da dare sempre il risultato atteso, non se per ragioni fortuite
dà in qualche caso il risultato che il programmatore avrebbe voluto.

La porzione di codice che hai scritto contiene degli errori, evidenziati
dai partecipanti a questa lista e dai "warning" di qualunque compilatore.

Invece di interrogarti sul perché in qualche caso fortunato quegli errori
non vengono a galla, ti consiglio nuovamente di rimuoverli.

Colgo l'occasione per fare a tutti gli auguri di buon veglione, buon
capodanno e di un Magnifico 2013!

Cià,
m

-- 
http://bodrato.it/software/strassen.html


-- 
Per REVOCARE l'iscrizione alla lista, inviare un email a 
debian-italian-requ...@lists.debian.org con oggetto "unsubscribe". Per
problemi inviare un email in INGLESE a listmas...@lists.debian.org

To UNSUBSCRIBE, email to debian-italian-requ...@lists.debian.org
with a subject of "unsubscribe". Trouble? Contact listmas...@lists.debian.org
Archive: 
http://lists.debian.org/37360.151.32.246.240.1356959324.squir...@mail.dm.unipi.it