Torna indietro   Hardware Upgrade Forum > Software > Programmazione

La rivoluzione dei dati in tempo reale è in arrivo. Un assaggio a Confluent Current 2025
La rivoluzione dei dati in tempo reale è in arrivo. Un assaggio a Confluent Current 2025
Siamo andati a Londra per partecipare a Current 2025, la conferenza annuale di Confluent. Il tema al centro dell'evento era l'elaborazione dei dati in tempo reale resa possibile da Apache Kafka, una piattaforma open source pensata proprio per questo. Si è parlato di come stia cambiando la gestione dei dati in tempo reale, del perché sia importante e di quali siano le prospettive per il futuro
SAP Sapphire 2025: con Joule l'intelligenza artificiale guida app, dati e decisioni
SAP Sapphire 2025: con Joule l'intelligenza artificiale guida app, dati e decisioni
A Madrid SAP rilancia sulla visione di un ecosistema integrato dove app, dati e AI generano un circolo virtuoso capace di affrontare l’incertezza globale. Joule diventa l’interfaccia universale del business, anche oltre il perimetro SAP
Dalle radio a transistor ai Micro LED: il viaggio di Hisense da Qingdao al mondo intero
Dalle radio a transistor ai Micro LED: il viaggio di Hisense da Qingdao al mondo intero
Una delle realtà a maggiore crescita nel mondo dell'elettronica di consumo, Hisense Group, affonda le sue radici nella storica città portuale di Qingdao, famosa per la sua birra. Ed è proprio qui il centro nevralgico dell'espansione mondiale dell'azienda, che sta investendo massicciamente in infrastrutture e ricerca per consolidare ulteriormente la propria leadership tecnologica.
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: 9302
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: 9302
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: 16209
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
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: 3191
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: 16209
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
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: 9302
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


La rivoluzione dei dati in tempo reale è in arrivo. Un assaggio a Confluent Current 2025 La rivoluzione dei dati in tempo reale è ...
SAP Sapphire 2025: con Joule l'intelligenza artificiale guida app, dati e decisioni SAP Sapphire 2025: con Joule l'intelligenza arti...
Dalle radio a transistor ai Micro LED: il viaggio di Hisense da Qingdao al mondo intero Dalle radio a transistor ai Micro LED: il viaggi...
Meglio un MacBook o un PC portatile con Windows, oggi? Scenari, dubbi e qualche certezza Meglio un MacBook o un PC portatile con Windows,...
realme GT7: un "flaghsip killer" concreto! La recensione realme GT7: un "flaghsip killer" concr...
E-tattoo: arriva il tatuaggio elettronic...
GreenMindAI Hackathon Catania: annunciat...
DeepSeek R1 si aggiorna: l'IA cinese ade...
Torna in offerta il portatile Lenovo con...
Windows 11: problemi di avvio dopo l'upd...
Nothing Phone 3: il teaser ufficiale con...
GeForce NOW sbarca su Steam Deck: arriva...
Instagram supporta adesso il formato 3:4...
Perplexity Labs: perché usare la ...
iPad 2025: tre modelli, tre identità: qu...
Cortona On The Move 2025: la fotografia ...
Schede video, dissipatori e case: le nov...
Tutta la rete che serve, oggi in sconto:...
Da 240€ a 294€: sono i soldi risparmiati...
DEEBOT T50 PRO OMNI: il robot aspirapolv...
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: 09:50.


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