Visualizzazione dei risultati da 1 a 8 su 8

Discussione: [C] gets e gcc

  1. #1
    Utente di HTML.it L'avatar di wolf64
    Registrato dal
    Jul 2001
    Messaggi
    521

    [C] gets e gcc

    In Linux quando compilo con il Gcc se è inclusa la funzione "gets" compila ma mi avverte "the `gets' function is dangerous and should not be used.", qualcuno saprebbe indicarmene il motivo?
    Cioè, perchè "gets" sarebbe pericolosa quando vedo che viene consigliata da tutti i manuali? O è un problema solo per il Gcc?
    Powered by Slack Current - Kernel 2.6.22
    Slackware Evangelist
    My LUG (Linux User Group): LinuxVar (LUG di Varese)

  2. #2
    Sinceramente non so darti una risposta DEFINITIVA

    ma la cosa succede anche a me

    P.S. se INVECE compilo sotto windows niente warning!!!

  3. #3
    Utente di HTML.it L'avatar di wolf64
    Registrato dal
    Jul 2001
    Messaggi
    521
    Confermo ciò che mi dici, non capisco il perchè, oltre tutto è un Warning ma comunque lo compila e mi sembra funzioni, approfitto di questa risposta per "uppare" questo post, comunque se scopro qualcosa al riguardo lo segnalo in questo thread.

    Ciao
    Powered by Slack Current - Kernel 2.6.22
    Slackware Evangelist
    My LUG (Linux User Group): LinuxVar (LUG di Varese)

  4. #4
    Utente di HTML.it L'avatar di wolf64
    Registrato dal
    Jul 2001
    Messaggi
    521
    Johnny, ho implementato in /usr/include il file "my_gets.h" con la seguente funzione "mygets":

    // Questa funzione sostituisce la funzione "gets"

    void mygets(char *str) {

    int i;
    for(i=0; (str[i]=getchar())!='\n'; i++);
    str[i]='\0';

    return;
    }

    Posso usare questa al posto di "gets", in realtà non mi cambia niente sull'effetto finale con la differenza che non ho più il Warning del compilatore, però ho dato un'occhiata in "stdio.h" e guarda cosa ho trovato:

    /* Get a newline-terminated string from stdin, removing the newline.
    DO NOT USE THIS FUNCTION!! There is no limit on how much it will read. */
    extern char *gets (char *__s) __THROW;

    Penso che il Warning si riferisca a questo (mi rivolgo a Johnny ma sono ovviamente ben accetti anche altri pareri).
    Powered by Slack Current - Kernel 2.6.22
    Slackware Evangelist
    My LUG (Linux User Group): LinuxVar (LUG di Varese)

  5. #5
    Utente di HTML.it
    Registrato dal
    Dec 2001
    Messaggi
    167
    Semplicemente perchè gets() è deprecated; il suo utilizzo è sconsigliato. E' da un po' che non smanetto ma mi sembra di ricordare che fgets() sia accettata senza problemi.
    ciao.

  6. #6
    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...

    Ok per usarla nei programmi di studio, ma mai usarla nei programmi da distribuire (sostituirla con fgets)
    La stupidità umana e l'universo sono infinite.
    Della seconda non sono certo(Einstein)

    Gnu/Linux User

  7. #7

    RE:Wolf

    Tutte le funzioni che nn fanno
    1 controllo numerico sui
    dati immessi da tastiera(letti da file)
    sono "pericolose",mentre in unix
    è lo stesso compilatore ad
    avvertire il programmatore in windows
    il programmatore viene avvertito dal crash del sistema(eh eh),quando usa queste funzioni.
    PROBLEMA:
    char v[100];
    char b[5];
    Se leggo da tastiera(o file)una riga
    di char superiore a 100 char,e la
    deposito in v[] "trabocca"(overflow)
    perchè solo 100 byte(1char=1byte)di
    memoria sono stati riservati dal compilatore per v[],e al solito
    i byte in piu' "sporcano memoria"
    cancellando(sovrascrivendo)locazioni
    di memoria utilizzate da altri
    programmi i quali sanno che li'
    devono trovare quello che hanno scritto prima,ma nn lo trovano piu'
    e crashano
    NOTA:un vettore di char viene detto "buffer"--->"trabocco di vettore"=buffer overflow
    FUNZIONI CRITICHE:
    gets(),strcat(),strcpy()
    RIMPIAZZATE DA:
    fgets(),strncat(),strncpy()
    che accettano come parametro n
    ovvero il numero di caratteri da leggere
    ESEMPIO:

    1)riga di 220 char
    gets(v);/*120 byte +'\n' di memoria vengono cancellati*/
    2)strcat(b,"111111");/*6 char,2 byte cancellati */

  8. #8
    Utente di HTML.it L'avatar di wolf64
    Registrato dal
    Jul 2001
    Messaggi
    521

    Re: RE:Wolf

    Originariamente inviato da hmesfet
    ...in windows
    il programmatore viene avvertito dal crash del sistema(eh eh),quando usa queste funzioni.
    :gren: :gren: :gren:
    ... da linuxaro convinto non potevo non evidenziare questo passaggio!!! :quote:
    Scherzi a parte, grazie per gli interventi , è chiaro il concetto che in C la caratteristica di aver una maggior responsabilità nella gestione dei buffer si traduce da una parte in un codice più performante ma dall'altra richiede un'attenzione maggiore del programmatore per evitare guai tipo appunto un buffer overflow, al proposito un ringraziamento in particolare a Hmesfet nell'indicarmi le funzioni critiche e le loro sostitute.
    Volevo chiedere anche cosa ne pensate delle Glib, sino ad ora ho avuto modo di leggere qualcosa qua e là, però ho notato che hanno anche diverse funzioni sostitutive alle librerie standard, tra queste anche funzioni per il trattamento di stringhe, qualcuno di voi le ha già usate?
    Powered by Slack Current - Kernel 2.6.22
    Slackware Evangelist
    My LUG (Linux User Group): LinuxVar (LUG di Varese)

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.