View Full Version : gcc e i suoi warnings
trallallero
18-06-2007, 15:42
ma cosa hanno fatto al gcc ? :mbe:
adesso ti avvisa anche sulle % errate delle printf ma non piu´ su indici modificati dentro i cicli ?
Gia´ lo faceva il turbo C della Borland non capisco perche´ non ci sia il warning nel gcc.
Per errore ho fatto una cosa cosi´:
for (Idx = 1; Idx <= n; Idx++)
{
... righe e righe di codice ...
for (Idx = 0; Idx < NN; Idx++)
...
}
e il compilatore non m´ha detto niente e io ho perso la mattinata e un pezzo del pomeriggio
per capire dove cacchio era il problema :muro:
il bello e´ che nel secondo ciclo non entra mai ma Idx viene inizializzato a 0 lo stesso
quindi non esce mai dal primo ciclo.
ilsensine
18-06-2007, 15:52
Per errore ho fatto una cosa cosi´:
for (Idx = 1; Idx <= n; Idx++)
{
... righe e righe di codice ...
for (Idx = 0; Idx < NN; Idx++)
...
}
e il compilatore non m´ha detto niente
e ha fatto bene.
il bello e´ che nel secondo ciclo non entra mai ma Idx viene inizializzato a 0 lo stesso
Se non ci entra mai perché "0<NN" è falsa, è corretto che ponga ldx a 0.
Per errore ho fatto una cosa cosi´:
for (Idx = 1; Idx <= n; Idx++)
{
... righe e righe di codice ...
for (Idx = 0; Idx < NN; Idx++)
...
}
e il compilatore non m´ha detto nienteNon vedo perché dovrebbe (e come potrebbe), visto che è perfettamente legale. Il compilatore al massimo cattura gli errori di sintassi ma non può capire il comportamento del programma o comunque cosa vuol fare il programmatore.
Così come non ti può segnalare che qui:
char *s = NULL;
*s = 'a';
stai facendo un macello.
trallallero
18-06-2007, 15:56
perche´ sto modificando un indice di un ciclo all´interno del ciclo E´ pericoloso e infatti mi son giocato la mattina per una distrazione.
A me sembra giusto un avviso.
trallallero
18-06-2007, 15:57
Se non ci entra mai perché "0<NN" è falsa, è corretto che ponga ldx a 0.
si lo so ma intendevo il "bello" in senso ironico.
Cioe´, il secondo ciclo non viene eseguito ma rompe comunque i maroni al primo :D
trallallero
18-06-2007, 16:00
Non vedo perché dovrebbe (e come potrebbe), visto che è perfettamente legale. Il compilatore al massimo cattura gli errori di sintassi ma non può capire il comportamento del programma o comunque cosa vuol fare il programmatore.
Così come non ti può segnalare che qui:
char *s = NULL;
*s = 'a';
stai facendo un macello.
a me sembra facile da individuare e mi ricordo un vecchio compilatore che avvisava problemi di questo tipo (indici modificati). Se non sbaglio era il turbo C o al limite il cc ...
ilsensine
18-06-2007, 16:03
a me sembra facile da individuare e mi ricordo un vecchio compilatore che avvisava problemi di questo tipo (indici modificati). Se non sbaglio era il turbo C o al limite il cc ...
Il warning è sbagliato. Il codice che hai scritto è non solo corretto, ma anche teoricamente possibile (come è possibile modificare la variabile di un ciclo for dentro il blocco stesso).
a me sembra facile da individuare e mi ricordo un vecchio compilatore che avvisava problemi di questo tipo (indici modificati). Se non sbaglio era il turbo C o al limite il cc ...Per curiosità ho provato adesso su un "vecchio" Borland C++ 3.1 e mettendo i warning a All non mi segnala nulla sul doppio for come il tuo.
ilsensine
18-06-2007, 16:11
Così come non ti può segnalare che qui:
char *s = NULL;
*s = 'a';
stai facendo un macello.
No nessun macello ;)
mmap(NULL, 4096, PROT_WRITE|PROT_READ, MAP_PRIVATE|MAP_ANONYMOUS|MAP_FIXED, -1, 0);
sprintf(NULL, "ciao\n");
write(fileno(stdout), NULL, strlen(NULL));
trallallero
18-06-2007, 16:16
Il warning è sbagliato. Il codice che hai scritto è non solo corretto, ma anche teoricamente possibile (come è possibile modificare la variabile di un ciclo for dentro il blocco stesso).
che sia possibile son d´accordo ma anche una cosa cosi´ e´ possibile
while( c = memchr(...))
pero´ ricevi giustamente un warning ;)
Per curiosità ho provato adesso su un "vecchio" Borland C++ 3.1 e mettendo i warning a All non mi segnala nulla sul doppio for come il tuo.
ho provato con cc e idem ... forse mi sono sognato tutto :boh:
o forse era solo per dare la colpa a qualcun altro :D
trallallero
18-06-2007, 16:16
No nessun macello ;)
mmap(NULL, 4096, PROT_WRITE|PROT_READ, MAP_PRIVATE|MAP_ANONYMOUS|MAP_FIXED, -1, 0);
sprintf(NULL, "ciao\n");
write(fileno(stdout), NULL, strlen(NULL));
:eek:
e questa dove l´hai trovata ???
ilsensine
18-06-2007, 16:24
che sia possibile son d´accordo ma anche una cosa cosi´ e´ possibile
while( c = memchr(...))
pero´ ricevi giustamente un warning ;)
Perché le forma "if (a=b)" sono molto spesso degli errori di scrittura, tali da giustificare il warning. Inoltre se leggi bene il warning non ti viene detto che il codice è sospetto, ma ti viene suggerito di utilizzare parentesi ulteriori per indicare che _effettivamente_ intendi scrivere una assegnazione. Se scrivi while ( (c=memchr()) ) non ottieni alcun warning!
ilsensine
18-06-2007, 16:31
:eek:
e questa dove l´hai trovata ???
Il c non ha un vero puntatore nullo. NULL è definito come "0", ma nello standard C nessuno dice che 0 è un indirizzo...vietato :D
Per lo stesso motivo, una mmap che fallisce non restituisce 0 (NULL), ma ~0 (0xffffffff) !
(e sbaglia anche la mmap, ma la scelta è giustificata dal fatto che la mmap non può restituire legalmente quel valore)
No nessun macello ;) Era per fare un esempio ..... :rolleyes:
Se mi vai a smanettare con il memory management.... non vale!! :D
trallallero
18-06-2007, 16:37
Il c non ha un vero puntatore nullo. NULL è definito come "0", ma nello standard C nessuno dice che 0 è un indirizzo...vietato :D
Per lo stesso motivo, una mmap che fallisce non restituisce 0 (NULL), ma ~0 (0xffffffff) !
(e sbaglia anche la mmap, ma la scelta è giustificata dal fatto che la mmap non può restituire legalmente quel valore)
prova a spedire una lettera con un indirizzo: via Null n. 0
secondo me vanno in tilt le poste italiane :asd:
trallallero
18-06-2007, 16:39
Perché le forma "if (a=b)" sono molto spesso degli errori di scrittura, tali da giustificare il warning. Inoltre se leggi bene il warning non ti viene detto che il codice è sospetto, ma ti viene suggerito di utilizzare parentesi ulteriori per indicare che _effettivamente_ intendi scrivere una assegnazione. Se scrivi while ( (c=memchr()) ) non ottieni alcun warning!
comunque insisto che ci vorrebbe un warning anche per gli´indici dei cicli :O
che sia possibile modificarli son d´accordo ma resta sempre una tecnica sporca e poco leggibile. Per me, ovviamente
^TiGeRShArK^
18-06-2007, 16:40
Il warning è sbagliato. Il codice che hai scritto è non solo corretto, ma anche teoricamente possibile (come è possibile modificare la variabile di un ciclo for dentro il blocco stesso).
:mbe:
e perchè il warning dovrebbe essere sbagliato?
Eclipse avvisa per ogni tipo di possibili errori...
compresi ovviamente quelli citati in questo thread.
E vi assicuro che aiutano moltissimo questi warning (come può ben testimoniare trallallero :asd: )
trallallero
18-06-2007, 16:43
:mbe:
e perchè il warning dovrebbe essere sbagliato?
Eclipse avvisa per ogni tipo di possibili errori...
compresi ovviamente quelli citati in questo thread.
E vi assicuro che aiutano moltissimo questi warning (come può ben testimoniare trallallero :asd: )
io uso Eclipse ma non ho ricevuto un beneamato ... :cry:
ma poi cosa c´entra Eclipse ? e´ il compilatore che usa che dovrebbe avvisarti
ilsensine
18-06-2007, 16:43
comunque insisto che ci vorrebbe un warning anche per gli´indici dei cicli :O
che sia possibile modificarli son d´accordo ma resta sempre una tecnica sporca e poco leggibile. Per me, ovviamente
:mbe:
e perchè il warning dovrebbe essere sbagliato?
Eclipse avvisa per ogni tipo di possibili errori...
compresi ovviamente quelli citati in questo thread.
E vi assicuro che aiutano moltissimo questi warning (come può ben testimoniare trallallero :asd: )
Il problema di gcc non è di avere pochi warning, ma di averne troppi...
^TiGeRShArK^
18-06-2007, 18:02
io uso Eclipse ma non ho ricevuto un beneamato ... :cry:
ma poi cosa c´entra Eclipse ? e´ il compilatore che usa che dovrebbe avvisarti
Io veramente mi riferivo al Java :p
cmq immagino che anke con il CDT il livello di warning sia configurabile a piacere warning per warning come si può fare in col JDT.
trallallero
18-06-2007, 20:59
Io veramente mi riferivo al Java :p
cmq immagino che anke con il CDT il livello di warning sia configurabile a piacere warning per warning come si può fare in col JDT.
uhm ... in effetti il -Wall non attiva proprio tutti i warnings.
Domani - se ho tempo (quì durante l'orario di lavoro si lavora :eek:) - ci do un occhio. Grazie.
vBulletin® v3.6.4, Copyright ©2000-2026, Jelsoft Enterprises Ltd.