PDA

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.

andbin
18-06-2007, 15:53
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).

andbin
18-06-2007, 16:09
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)

andbin
18-06-2007, 16:33
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.