Newsgroup: it.comp.lang.c
Titolo: Ma è normale o è un bug del GCC?

$ cat simone.c
#include "stdio.h"
int f(int x) {
        return x+1;
}
int g(int x) {
        f(x);
}
int main() {
        printf("%d\n", g(3));
}
$ gcc -Wall -std=c99 -pedantic simone.c && ./a.out
test.c: In function `g':
test.c:9: warning: control reaches end of non-void function
4
$
come mai g(3) ritorna 4, se non č stato definito al suo interno il valore di
return?
Il comportamento del GCC č del tutto casuale, o č previsto dallo standard?
-- 
Under construction

 Il comportamento del GCC č del tutto casuale, o č previsto dallo standard?
Lo standard lo classifica come "undefined behavior".
A te la funzione restituisce 4, ma potrebbe essere un qualunque altro 
valore.
Ciao
-- 
Cybertoldo
Per rispondermi via email, sostituisci moc.liamg con 
gmail.com

 Il comportamento del GCC è del tutto casuale, o è previsto dallo standard?
Del tutto causale.
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

 
Del tutto casuale.   Il compilatore ti avvisa pure che la funzione g() 
non ha alcun statement di return, pur essendo definita che ritorna un 
intero.  LO stesso anche per main().
Ciao
Giovanni
-- 
   A computer is like an air conditioner,
   it stops working when you open Windows.
   Registered Linux user #337974  < 
http://giovanni.homelinux.net/
 >

 intero.  LO stesso anche per main().
No, per main() è diverso: non è richiesto che vi sia un return esplicito.
Il warning difatti è solo per la funzione g().
Nel caso di main() viene implicitamente aggiunto un "return 0;".


 Il comportamento del GCC è del tutto casuale, o è previsto dallo standard?
Il main dovrebbe pescare il valore di ritorno della funzione "g" da un
registro dove se lo aspetta che sia. Non so come lavori il compilatore GCC,
cosa usa per far ritornare un int da una funzione.
Su quel registro probabilmente alla fine dell'esecuzione della funzione "g"
si trova il valore 4 a seguito dai calcoli eseguiti dalla funzione "g" e
quindi ti trovi 4 come risultato, ma la cosa non è garantita.
In generale il valore di ritorno potrebbe essere un valore qualsiasi.

 
Si sentiva la mancanza delle tue cazzate ;-)
Hai scritto un nuovo compilatore?  Tutti quelli che ho usato
generano un warning anche se lo standard specifica un "return 0;".


 generano un warning anche se lo standard specifica un "return 0;".
Irrilevante ciò che tu hai o non hai usato. Probabilmente l'idiozia del
compilatore s'è conformata a quella di chi lo usa. 
Come già detto, in mancanza di un "return 0;" nel main(), il compilatore
NON E' TENUTO a sollevare ALCUN warning, ma viene adoperato uno statement
di ritorno implicito, come già detto.
Qui dentro, chi spara cazzate, come al solito sei tu.


 .....
...state boni! :-)
Mettetevi d'accordo e non litigate:
C99
=============
5.1.2.2.3 Program termination
1. If the return type of the main function is a type compatible with 
int, a return from the initial call to the main function is equivalent 
to calling the exit function with the value returned by the main 
function as its argument; 10) reaching the } that terminates the main 
function returns a value of 0. If the return type is not compatible with 
int, the termination status returned to the host environment is unspecified.
C90
=============
5.1.2.2.3 Program termination
A return from the initial call to the main function is equivalent to 
calling the exit function with the value returned by the main function 
as its argument. If the main function executes a return that specifies 
no value, the termination status returned to the host environment is 
undefined.
Ciao ;)


Mettetevi d'accordo e non litigate:
Mettermi d'accordo ? con un incompetente ? mai e poi mai (e mi sembra
anche ovvio).

 In generale il valore di ritorno potrebbe essere un valore qualsiasi.
imho, in questi casi e' giusto dire e far capire che il valore di 
ritorno [1] possa essere "un valore qualsiasi"... ma, in verita', spesso 
e' invece del tutto prevedibile (cioe' assolutamente 'non random').
Se ho ben capito, l'OP si e' stupito del valore, restituito da g(), 
proprio pari a 4 - cioe', lo stesso che avrebbe ottenuto se avesse 
scritto esplicitamente "return f(x);" nella funzione g(). Ma, come anche 
tu hai spiegato, il 4 si trovava in EAX come valore restituito della 
precedente chiamata alla funzione f(). Essendo quella l'ultima 
istruzione che poteva modificare il registro EAX, a sua volta, anche la 
funzione g() l'ha restituito.
Insomma: almeno in questo caso, era del tutto prevedibile.
Note:
[1] in italiano sarebbe piu' corretto dire: "valore restituito" (...ma 
chi se ne frega ;) )
Ciao


 
Non ho bisogno di un presuntuoso come te per spiegare come funzionano 
i compilatori.
Le tue affermazioni mostrano chiaramente che dopo aver ben studiato il 
manuale non hai mai scritto una riga di codice ne tanto meno hai mai 
compilato un programma neanche scritto da altri.
Se un giorno ritornerai nel mondo reale dal piedistallo su cui ti sei 
messo ti accorgerai che non esistono solo le specifiche e le librerie 
ANSI e che queste ultime non coprono che una parte piccola (come te) 
del mondo del C.
Quanto ai warning un compilatore non sara` forse tenuto ad emetterli, 
ma chissa` come mai il gcc versione 3.4.6 lo emette?  Npn e` poi cosi` 
antidiluviano da non poter implementare le specifiche ANSI!  Qualche 
volta chi sviluppa i compilatori ha piu` buon senso di chi si siede a 
dettare regole senza avere alcuna esperienza di programmazione.  Mi 
ricorda i bei tempi in cui ho partecipato alle riunioni del comitato 
C.C.I.T.T. che doveva scrivere gli standard per il CHILL.
Se conosci solo un compilatore e` un tuo limite.  Non devi riversare 
la tua ignoranza del mondo reale sul NG.  Qui si parla del mondo C e 
rileggerti il manifesto di questo NG non ti farebbe male.
Quasi quasi mi ricredo su tutti quei programmi che ho contribuito a 
scrivere e che tu stai usando ogni giorno.  Lo sai che non sono 
conformi agli standard ANSI e che non usano nessuna libreria ANSI?  E 
come mai funzionano?  E tu continui ad usarli?
Ora che hai sparato le tue solite offese fammi il favore di chiudere 
quella bocca piena di m....  Non ho ancora capito se sei solo un 
ragazzino alle prime armi o sei il personaggio di questo link: 
http://tinyurl.com/3btp3y
   In quest'ultimo caso capisco perche` 
l'universita` italiana sia caduta cosi` in basso. :-(
Non e` mia abitudine rispondere con offese alle offese anche se 
qualche volta sei riuscito a tirarmi per i capelli.  Per cui ti prego, 
risciacquati la bocca o ritorna nella tua fogna.


 antidiluviano da non poter implementare le specifiche ANSI! 
Rileggi i quote dello standard che sono stati postati. Il gcc fa
esattamente quello che gli viene detto.
kronos:/tmp$ cat test.c
int main(void) {
}
kronos:/tmp$ gcc-3.4 -Wall -c test.c
test.c: In function `main':
test.c:1: warning: control reaches end of non-void function
kronos:/tmp$ gcc-3.4 -std=c99 -Wall -c test.c
kronos:/tmp$
Luca
-- 
Quando un uomo porta dei fiori a sua moglie senza motivo, 
un motivo c'e`.

 standard specifica un "return 0;". 
e di quelli usati solo il gcc ha l'opzione per essere compatibile con 
il C99.
Inoltre se posso aggiungere un mio parere senza essere messo OT e 
senza scatenare le ire dei supporter dello standard ANSI, quella 
sezione dello standard e` stupida e andrebbe rimossa o meglio 
riportata al C90.  Sara` comoda perche` stabilisce un default, ma io 
la trovo contraria alle buone norme di come si dovrebbe scrivere il 
codice.  Se,  omettendo lo statement del return quando la funzione 
deve ritornare un valore, viene forzato un default = 0, questo puo` 
mascherare un errore di codifica.  E IMO vale anche per il main() 
anche se non sempre viene usato.
Tra le altre cose vorrei sapere come puo` essere risolto in ambiente 
DEC VAX/VMS (ammesso che ci sia ancora chi lo usa) dove per restituire 
OK (no error) il valore e` 1.
