PDA

Visualizza la versione completa : [C]gets() pericoloso


Al è qui
11-11-2002, 11:56
Ho posto questa domanda in alcuni Ng ma senza ottenere risposta, provo anche qui.

Utilizzando la funzione gets() spesso il compilatore gcc mi da un warning così: "gets function is dangerous and should not be used"

Secondo voi quali sono le maggiori pericolosità nell'uso di gets?

darkblOOd
11-11-2002, 12:08
io non lavoro in c, cmq ti posso dire che spesso gli avvisi rilasciati dal compilatore possono essere "faziosi" nel senso che non identificano dei warning reali. Questo dipende dal tipo e versione del complatore che si sta usando, dal tipo di impostazioni predefinite, se predilige una ottimizzazione piuttosto che un'altra e via dicendo.

Almeno così mi sembra di aver letto.


:ciauz:

Al è qui
11-11-2002, 12:20
Bè gcc dovrebbe darlo a chiunque lo utilizza, non ho fatto particolari configurazioni. E comunque se lo scrive qualcosa vorrà dire, ma aparte il buffering non mi viene in mente nulla.

darkblOOd
11-11-2002, 12:30
Originariamente inviato da Al è qui
Bè gcc dovrebbe darlo a chiunque lo utilizza, non ho fatto particolari configurazioni. E comunque se lo scrive qualcosa vorrà dire, ma aparte il buffering non mi viene in mente nulla.

infatti, ma potrebbe essere pure legato alla memoria RAM che ha la macchina che sta compilando... :bhò:

ma fami capire, dopo quel warning lui non ti compila perchè non può includere la funzione o compila correttamente?

Al è qui
11-11-2002, 12:32
Originariamente inviato da darkblOOd


infatti, ma potrebbe essere pure legato alla memoria RAM che ha la macchina che sta compilando... :bhò:

ma fami capire, dopo quel warning lui non ti compila perchè non può includere la funzione o compila correttamente?

No no compila correttamente.

darkblOOd
11-11-2002, 13:00
Originariamente inviato da McAuriel V
è plausibile invece che lui si metta in testa che possa verificarsi un buffer overflow se durante cicli, iterazioni o controlli qualche indice sfora dal suo range?

questo lo può dire solo un testing sul programma compilato...

come già detto (visto che Al conferma la compilazione a buon fine) molti libri dicono esplicitamente che i compilatori rilasciano warnig che possono essere tranquillamente non presi in considerazione. Alcuni sono configurati in modo da rilasciare avvisi come warning per i programmatori novelli o solo per avere un resoconto più dettagliato della fase di compilazione.

Appena posso ti posto uno spaccato del libro in questione (McGraw Hill, non ricordo ne il titolo ne l'autore) per rendere + chiaro ciò che intendo dire.

Al è qui
11-11-2002, 13:35
Originariamente inviato da McAuriel V
è plausibile invece che lui si metta in testa che possa verificarsi un buffer overflow se durante cicli, iterazioni o controlli qualche indice sfora dal suo range?

Non credo, ti spiego, stavo provando un nuovo portatile e per vedere se era tutto ok ho scritto due righe con gets() e strcpy giusto per vedere che faceva.
Lì mi da questo warning.

Incuriosito ho riprovato su un altro che uso da tempo e mi ha dato lo stesso warning.

I programmi vanno tranquillamente, ma vorrei sapere da dove salta fuori questo warning di cui mai mi sono accorto.

Luc@s
11-11-2002, 14:36
La gets può provocare buffer overflow...
In caso in cui il programma che usa la gets venga lanciato da un utente con molti permessi, ma venga usato da altri...inviando un numero di byte in ingresso superiore alla dimensione del buffer di ricezione della gets si può eseguire codice potenzialmente pericoloso slla macchina... Tutto ciò che va oltre la dimensione del buffer infatti potrebbe essere visto dalla macchina come codice eseguibile e quindi si possono avere notevoli problemi di sicurezza...

Al è qui
11-11-2002, 16:40
Originariamente inviato da Luc@s
La gets può provocare buffer overflow...
In caso in cui il programma che usa la gets venga lanciato da un utente con molti permessi, ma venga usato da altri...inviando un numero di byte in ingresso superiore alla dimensione del buffer di ricezione della gets si può eseguire codice potenzialmente pericoloso slla macchina... Tutto ciò che va oltre la dimensione del buffer infatti potrebbe essere visto dalla macchina come codice eseguibile e quindi si possono avere notevoli problemi di sicurezza...

Quindi solo quelli classici di gets(). Niente di particolare rispetto l'utilizzo fatto?

Luc@s
11-11-2002, 16:43
Originariamente inviato da Al è qui


Quindi solo quelli classici di gets(). Niente di particolare rispetto l'utilizzo fatto? basta usare fgets():adhone:

Loading