Torna indietro   Hardware Upgrade Forum > Software > Programmazione

GIGABYTE GAMING A16, Raptor Lake e RTX 5060 Laptop insieme per giocare al giusto prezzo
GIGABYTE GAMING A16, Raptor Lake e RTX 5060 Laptop insieme per giocare al giusto prezzo
Il Gigabyte Gaming A16 offre un buon equilibrio tra prestazioni e prezzo: con Core i7-13620H e RTX 5060 Laptop garantisce gaming fluido in Full HD/1440p e supporto DLSS 4. Display 165 Hz reattivo, buona autonomia e raffreddamento efficace; peccano però le USB e la qualità cromatica del pannello. Prezzo: circa 1200€.
iPhone 17 Pro: più di uno smartphone. È uno studio di produzione in formato tascabile
iPhone 17 Pro: più di uno smartphone. È uno studio di produzione in formato tascabile
C'è tanta sostanza nel nuovo smartphone della Mela dedicato ai creator digitali. Nuovo telaio in alluminio, sistema di raffreddamento vapor chamber e tre fotocamere da 48 megapixel: non è un semplice smartphone, ma uno studio di produzione digitale on-the-go
Intel Panther Lake: i processori per i notebook del 2026
Intel Panther Lake: i processori per i notebook del 2026
Panther Lake è il nome in codice della prossima generazione di processori Intel Core Ultra, che vedremo al debutto da inizio 2026 nei notebook e nei sistemi desktop più compatti. Nuovi core, nuove GPU e soprattutto una struttura a tile che vede per la prima volta l'utilizzo della tecnologia produttiva Intel 18A: tanta potenza in più, ma senza perdere in efficienza
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 07-06-2004, 11:30   #1
maxithron
Senior Member
 
L'Avatar di maxithron
 
Iscritto dal: Mar 2002
Città: Italy/Usa
Messaggi: 2817
[C] Funzioni da evitare

Salve ragazzi, allora, posto quello che mi è venuto dopo aver spesso riflettuto su quanta informazione sia didattica che professionale è a disposizione di tutti i programmatori, di qualsiasi livello:

Capita di rado che si parli di funzioni da evitare per eliminare fastidiosi problemi come buffer overflow etc..

Proporrei quindi, se siete d'accordo, di farne un elenco che ritengo possa essere utile sia a chi comincia con la programmazione, in modo da adeguarsi subito ad un buon modo di pensare, sia per i + esperti come.....'ripasso'

Poi, magari, volendo ampliare il discorso, si potrebbe fare che al posto della funzione da evitare si posti la 'buona' che la sostituisce.

Saluti.
__________________
"Utilizzando atomi pentavalenti drogheremo il silicio di tipo n;
Utilizzando atomi trivalenti drogheremo il silicio di tipo p;
Utilizzando della cannabis ci drogheremo noi e vedremo il silicio fare cose impossibili" - DSDT-HowTo
maxithron è offline   Rispondi citando il messaggio o parte di esso
Old 07-06-2004, 11:40   #2
ilsensine
Senior Member
 
L'Avatar di ilsensine
 
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
La "classica" gets; da sostituire con fgets o simili.

Cmq i buffer overflow più spesso dipendono da inaccurata programmazione, più che da funzioni di libreria pericolose.
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al
andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12
ilsensine è offline   Rispondi citando il messaggio o parte di esso
Old 07-06-2004, 12:03   #3
cionci
Senior Member
 
L'Avatar di cionci
 
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
Anche la sprintf può essere pericola se il programma è fatto male (ad esempio dimensionando male la stringa)...
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 07-06-2004, 12:11   #4
VegetaSSJ5
Senior Member
 
L'Avatar di VegetaSSJ5
 
Iscritto dal: Sep 2002
Città: Celano (AQ) Segno_Zodiacale: Leone Ascendente: Cammello Segni_Particolari: Quello
Messaggi: 9571
per favore potere spiegare anche perchè la funzione è da evitare e scrivere anche i parametri delle funzioni "buone e cattive"? tutti coloro che sono niubbi come me ve ne saranno molto grati...
VegetaSSJ5 è offline   Rispondi citando il messaggio o parte di esso
Old 07-06-2004, 12:19   #5
cionci
Senior Member
 
L'Avatar di cionci
 
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
Per la gets è semplicissimo:

char *gets( char *buffer );

Se buffer è stato allocato di dimensione più piccola di quella immessa allora c'è un buffer overflow (e non evitabile in alcun modo)...

Lo stesso problema c'è con la (*)scanf leggendo una stringa...
scanf("%s", buffer);

Per evitare bisogna leggere le stringhe da file o dallo stdin tramite:

char *fgets( char *string, int n, FILE *stream );
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 07-06-2004, 12:45   #6
VegetaSSJ5
Senior Member
 
L'Avatar di VegetaSSJ5
 
Iscritto dal: Sep 2002
Città: Celano (AQ) Segno_Zodiacale: Leone Ascendente: Cammello Segni_Particolari: Quello
Messaggi: 9571
Quote:
Originariamente inviato da cionci
Per la gets è semplicissimo:

char *gets( char *buffer );

Se buffer è stato allocato di dimensione più piccola di quella immessa allora c'è un buffer overflow (e non evitabile in alcun modo)...

Lo stesso problema c'è con la (*)scanf leggendo una stringa...
scanf("%s", buffer);

Per evitare bisogna leggere le stringhe da file o dallo stdin tramite:

char *fgets( char *string, int n, FILE *stream );
ecco adesso sì! potresti spiegarmi cos'è l'int n della fgets? è il numero massimo di caratteri che si possono leggere giusto? per leggere da stdin dobbiamo specificare stdin nel campo FILE *stream giusto?
VegetaSSJ5 è offline   Rispondi citando il messaggio o parte di esso
Old 07-06-2004, 12:55   #7
Ziosilvio
Moderatore
 
L'Avatar di Ziosilvio
 
Iscritto dal: Nov 2003
Messaggi: 16211
Quote:
Originariamente inviato da VegetaSSJ5
potresti spiegarmi cos'è l'int n della fgets? è il numero massimo di caratteri che si possono leggere giusto?
No, e' il massimo spazio che fgets deve considerare gia' allocato.
Quindi, il numero massimo di caratteri che si possono leggere e' n-1, perche' nel totale va messo il carattere nullo di fine stringa.
Quote:
per leggere da stdin dobbiamo specificare stdin nel campo FILE *stream giusto?
Giusto.
__________________
Ubuntu è un'antica parola africana che significa "non so configurare Debian" Chi scherza col fuoco si brucia.
Scienza e tecnica: Matematica - Fisica - Chimica - Informatica - Software scientifico - Consulti medici
REGOLAMENTO DarthMaul = Asus FX505 Ryzen 7 3700U 8GB GeForce GTX 1650 Win10 + Ubuntu
Ziosilvio è offline   Rispondi citando il messaggio o parte di esso
Old 07-06-2004, 12:57   #8
Gogeta ss4
Senior Member
 
L'Avatar di Gogeta ss4
 
Iscritto dal: May 2001
Città: Milano
Messaggi: 3197
per la gets basta mettere una fflush(stdin) prima di usarla, anzi è molto comoda da usare,io la uso sempre
Gogeta ss4 è offline   Rispondi citando il messaggio o parte di esso
Old 07-06-2004, 13:20   #9
ilsensine
Senior Member
 
L'Avatar di ilsensine
 
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
Quote:
Originariamente inviato da cionci
Lo stesso problema c'è con la (*)scanf leggendo una stringa...
scanf("%s", buffer);
char s[16];
scanf("%15s", s);
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al
andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12
ilsensine è offline   Rispondi citando il messaggio o parte di esso
Old 07-06-2004, 14:24   #10
Ziosilvio
Moderatore
 
L'Avatar di Ziosilvio
 
Iscritto dal: Nov 2003
Messaggi: 16211
Quote:
Originariamente inviato da Gogeta ss4
per la gets basta mettere una fflush(stdin) prima di usarla
Funziona con molti compilatori, ma non e' standard.
(Lo standard C89, per default, non definisce il comportamento di fflush su uno stream di input.)
Io, di solito, quando devo assicurarmi la lettura di una riga "nuova", leggo un carattere per volta dallo stream di input (e lo scarto) finche' non trovo un EOF o un newline; ma mi sembra di ricordare che neanche questo metodo e' universale...
E poi non mi e' chiaro (ma potrei aver capito male io) perche' questo dovrebbe risolvere il problema di buffer overflow con gets.
__________________
Ubuntu è un'antica parola africana che significa "non so configurare Debian" Chi scherza col fuoco si brucia.
Scienza e tecnica: Matematica - Fisica - Chimica - Informatica - Software scientifico - Consulti medici
REGOLAMENTO DarthMaul = Asus FX505 Ryzen 7 3700U 8GB GeForce GTX 1650 Win10 + Ubuntu
Ziosilvio è offline   Rispondi citando il messaggio o parte di esso
Old 07-06-2004, 14:45   #11
fpucci
Senior Member
 
Iscritto dal: Jul 2002
Città: Roma
Messaggi: 806
Programmo in C da 15 anni ed ormai ritengo che non esiston funzioni pericolose.
Il pericolo viene determinato, secondo me, da chi le usa, ossia il programmatore che "non sa quello che fa".

Per cvi capita il buffer overflow, la colpa non è della funzione in sé ma di chi ha sottodimensionato il buffer oppure ha non saputo gestire il particolare evento.

E' chiaro che nel momento in cui utilizzo una primitiva devo fare attenzione a tutti le implicazioni...
fpucci è offline   Rispondi citando il messaggio o parte di esso
Old 07-06-2004, 15:03   #12
cionci
Senior Member
 
L'Avatar di cionci
 
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
Quote:
Originariamente inviato da Gogeta ss4
per la gets basta mettere una fflush(stdin) prima di usarla, anzi è molto comoda da usare,io la uso sempre
Non mi sembra che, standard o non standard, risolva il problema...
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 07-06-2004, 15:14   #13
cionci
Senior Member
 
L'Avatar di cionci
 
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
Quote:
Originariamente inviato da ilsensine
char s[16];
scanf("%15s", s);
Certo questo risolve per scanf...ma in quanti la usano così

Comunque fra le fuinzioni di input sicuramente quella più insicura è la gets...ma bisogna stare attenti su qualsiasi funzioen di input che non permette di specificare il numero di byte o strutture da leggere...
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 07-06-2004, 15:38   #14
fpucci
Senior Member
 
Iscritto dal: Jul 2002
Città: Roma
Messaggi: 806
Quote:
Originariamente inviato da cionci
[...]ma bisogna stare attenti su qualsiasi funzioen di input che non permette di specificare il numero di byte o strutture da leggere...
Per l'appunto!
In generale, come già detto prima, meglio privilegiare quelle funzioni che consentano di specificare a priori la dimensione dei buffer
fpucci è offline   Rispondi citando il messaggio o parte di esso
Old 07-06-2004, 15:39   #15
ilsensine
Senior Member
 
L'Avatar di ilsensine
 
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
Quote:
Originariamente inviato da cionci
Certo questo risolve per scanf...ma in quanti la usano così
IO! IO!

...e c'è chi fa MOLTO peggio
http://marc.theaimsgroup.com/?l=linu...9071114282&w=2
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al
andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12
ilsensine è offline   Rispondi citando il messaggio o parte di esso
Old 07-06-2004, 15:43   #16
VegetaSSJ5
Senior Member
 
L'Avatar di VegetaSSJ5
 
Iscritto dal: Sep 2002
Città: Celano (AQ) Segno_Zodiacale: Leone Ascendente: Cammello Segni_Particolari: Quello
Messaggi: 9571
Quote:
Originariamente inviato da ilsensine
IO! IO!

...e c'è chi fa MOLTO peggio
http://marc.theaimsgroup.com/?l=linu...9071114282&w=2
questo merita di essere inserito:
Codice:
fscanf(in, "%*[^\n]\n%*[^\n]");		/* skip two lines */
while (fscanf(in, " %16[^:]:%*[^\n]", name) == 1)
VegetaSSJ5 è offline   Rispondi citando il messaggio o parte di esso
Old 07-06-2004, 23:32   #17
maxithron
Senior Member
 
L'Avatar di maxithron
 
Iscritto dal: Mar 2002
Città: Italy/Usa
Messaggi: 2817
Quote:
Originariamente inviato da fpucci
Programmo in C da 15 anni ed ormai ritengo che non esiston funzioni pericolose.
Il pericolo viene determinato, secondo me, da chi le usa, ossia il programmatore che "non sa quello che fa".

Per cvi capita il buffer overflow, la colpa non è della funzione in sé ma di chi ha sottodimensionato il buffer oppure ha non saputo gestire il particolare evento.

E' chiaro che nel momento in cui utilizzo una primitiva devo fare attenzione a tutti le implicazioni...
In effetti, è più a questo modo di pensare che ho aperto il 3d che non alla mera 'liquidazione' delle primitive. Mi rendo conto di averla espressa male.

Ciò comunque vale perchè come già evidenziato dalla maggior parte di voi, è un utilizzo 'inconsapevole' della funzione a provocare problemi che non la funzione stessa.
__________________
"Utilizzando atomi pentavalenti drogheremo il silicio di tipo n;
Utilizzando atomi trivalenti drogheremo il silicio di tipo p;
Utilizzando della cannabis ci drogheremo noi e vedremo il silicio fare cose impossibili" - DSDT-HowTo
maxithron è offline   Rispondi citando il messaggio o parte di esso
Old 08-06-2004, 10:13   #18
fpucci
Senior Member
 
Iscritto dal: Jul 2002
Città: Roma
Messaggi: 806
Quote:
Originariamente inviato da maxithron
[...] è un utilizzo 'inconsapevole' della funzione a provocare problemi che non la funzione stessa.
Infatti.
Però mi sono accorto di una cosa.
Che il programmatore smaliziato (o esperto, fate voi), capisce al volo quali potrebbero essere i possibili problemi, mentre il neofita rischia di cadere nella trappola.

A volte il "man" (sotto unix/linux) o l'help sotto windows o comunque una buona guida sul C, dovrebbero porre in evidenza questi problemi.

Nel caso tanto discusso della gets(), ad esempio, il man() del compilatore C per Unix-Solaris mette in guardia l'utente proprio su questo aspetto, e cioè che un utilizzo improprio del buffer potrebbe portare a risultati impredicibili... e pertanto consigliano l'uso della fgets()

Poi sta al buon uso di chi programma scegliere quella che fa al caso suo...
fpucci è offline   Rispondi citando il messaggio o parte di esso
Old 08-06-2004, 11:10   #19
maxithron
Senior Member
 
L'Avatar di maxithron
 
Iscritto dal: Mar 2002
Città: Italy/Usa
Messaggi: 2817
Inoltre, se già compili con gcc anche senza l'opzione -Wall ed hai una gets, ti esce lo stesso il warning che indica la possibile problematica.
__________________
"Utilizzando atomi pentavalenti drogheremo il silicio di tipo n;
Utilizzando atomi trivalenti drogheremo il silicio di tipo p;
Utilizzando della cannabis ci drogheremo noi e vedremo il silicio fare cose impossibili" - DSDT-HowTo
maxithron è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


GIGABYTE GAMING A16, Raptor Lake e RTX 5060 Laptop insieme per giocare al giusto prezzo GIGABYTE GAMING A16, Raptor Lake e RTX 5060 Lapt...
iPhone 17 Pro: più di uno smartphone. È uno studio di produzione in formato tascabile iPhone 17 Pro: più di uno smartphone. &Eg...
Intel Panther Lake: i processori per i notebook del 2026 Intel Panther Lake: i processori per i notebook ...
Intel Xeon 6+: è tempo di Clearwater Forest Intel Xeon 6+: è tempo di Clearwater Fore...
4K a 160Hz o Full HD a 320Hz? Titan Army P2712V, a un prezzo molto basso 4K a 160Hz o Full HD a 320Hz? Titan Army P2712V,...
Start Cup Puglia 2025: il 16 ottobre la ...
Incentivi auto elettriche, falsa partenz...
Silence crea anche in Francia una rete d...
La realtà mista al servizio degli...
Nothing ha un altro smartphone in progra...
Decisione storica ad Amburgo: i cittadin...
Questo è il nuovo motore elettric...
HUAWEI WATCH GT 6: lo smartwatch 'infini...
Fotografia con AI: ecco Caira, la macchi...
PlayStation 6 vs Xbox Magnus: il rumor s...
DJI Osmo Action 4 a soli 208€ su Amazon:...
Irion, la data governance diventa strate...
EHang VT35: debutta in Cina il nuovo aer...
Cooler Master MasterLiquid Atmos II 360:...
Trapela in rete la roadmap dei nuovi gio...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 03:42.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Served by www3v