Se compili con l'opzione -Wall abiliti tutti gli warning.
Nel caso spefico della main ed altre funzioni il manuale non è chiaro... o meglio non mi risulta esserlo
-Wreturn-type
Warn whenever a function is defined with a return-type that defaults to int. Also warn about any return statement with no return-value in a function whose return-type is not void (falling off the end of the function body is considered returning without a value), and about a return statement with an expression in a function whose return-type is void.
For C++, a function without return type always produces a diagnostic message, even when -Wno-return-type is specified. The only exceptions are `main' and functions defined in system headers.
This warning is enabled by -Wall.
Ho scritto qui di seguito un esempio che ho compilato senza porre attenzione sugli warnings e l'oggetto disassemblato
si presenta cosi:
foo ()
{
0: 55 push rbp
1: 48 89 e5 mov rbp,rsp
}
4: c9 leave
5: c3 ret
0000000000000006 <main>:
main ()
{
6: 55 push rbp
7: 48 89 e5 mov rbp,rsp
a: 48 83 ec 10 sub rsp,0x10
int i=foo();
e: b8 00 00 00 00 mov eax,0x0
13: e8 00 00 00 00 call 18 <main+0x12>
18: 89 45 fc mov DWORD PTR [rbp-0x4],eax
}
1b: c9 leave
1c: c3
Ecco un buon motivo per compilare con l'opzione '-Wall':
Qui si puo' notare come la funzione main che punta sullo stack al ritorno di foo su zona che non esiste per assegnare 'i'. Anche la main dovrebbe restituire il valore di return in eax, ma niente di tutto ciò.
Il valore di 'i' e il return del main rimangono indefiniti