Visualizzazione dei risultati da 1 a 10 su 10
  1. #1

    [C] funzionamento strano della fopen

    Spero possiate aiutarmi a chiarire i dubbi su questa cosa, ci sto impazzendo!
    Se io faccio:

    codice:
    #define D "./nuovadir/"
    void save(char *nomeutente, char *nomefile)
    {
         char nomedir[MAXDIM];
         FILE * f;
         ...
         snprintf(nomedir,"%s%s/%s", D, nomeutente, nomefile);
         f = fopen(nomedir,"w");
         fputs("bla bla bla",f);
         fclose(f);
    }
    (ovviamente il codice e' semplificato.. non fa nulla!)
    che cosa c'e' di sbagliato? Non mi sembra ci sia qualcosa di "anomalo"!
    Eppure, nell'eseguirlo tramite dei test che mi sono costruita nel makefile (in modo che eseguendo make test possa testare i miei client e il mio server) non mi funziona! Mi va in loop! Se tolgo questa fopen mi va tutto correttamente e mi funziona anche se invece di creare il percorso faccio direttamento fopen(nomefile,"w").. ma quindi e' sbagliato creare un file mettendo un path? Non credo perche' la stessa identica cosa la faccio da un'altra parte nel programma e quello non mi da problemi... non capisco!
    Silvia C.

  2. #2
    usa sprintf anzichè snprintf
    ciao
    sergio

  3. #3
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,481
    La snprintf va bene (anzi meglio perche' e' la versione sicura della spritnf) ma va usata cosi'

    int snprintf(char *str, size_t size, const char *format, ...);

    e non mi pare che tu lo faccia ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  4. #4
    Originariamente inviato da oregon
    La snprintf va bene (anzi meglio perche' e' la versione sicura della spritnf) ma va usata cosi'

    int snprintf(char *str, size_t size, const char *format, ...);

    e non mi pare che tu lo faccia ...
    chiedo scusa... ho copiato male! nel codice reale la snprintf la uso cosi (anche perche' se no il compilatore me lo direbbe!):

    codice:
    snprintf(nomedir,MAXDIM,"%s%s/%s", D, nomeutente, nomefile);
    Ad ogni modo sembra che il problema sia risolto.. praticamente quando andavo a fare i test non cancellavo quello che creavo nelle directory e per questo credo non funzionava... puo' essere che il problema veniva fuori con la fopen ma non si trattava specificatamente della fopen? Cioe' non era lei a generare il problema?
    Lavoro col C ormai da un bel po' e non mi stupisco piu' di niente ormai.. :master:
    Silvia C.

  5. #5
    Utente di HTML.it L'avatar di XWolverineX
    Registrato dal
    Aug 2005
    residenza
    Prague
    Messaggi
    2,563
    Scusate se mi intrometto, ma che differenza c'è nell'usare versioni normali e sicure delle funzioni di cstdlib?
    "Se proprio devono piratare, almeno piratino il nostro." (Bill Gates)

    "Non è possibile che 2 istituzioni statali mi mettano esami nello stesso giorno." (XWolverineX)

    http://xvincentx.netsons.org/programBlog

  6. #6
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,481
    Con le versioni non sicure rischi un buffer overflow (con evidenti ripercussioni sulla sicurezza ...) ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  7. #7
    Utente di HTML.it L'avatar di XWolverineX
    Registrato dal
    Aug 2005
    residenza
    Prague
    Messaggi
    2,563
    Perchè rischio un buffer overflow? Se passo i parametri giusti non dovrebbe mai accadere.
    Le versioni sicure come si comportano?
    "Se proprio devono piratare, almeno piratino il nostro." (Bill Gates)

    "Non è possibile che 2 istituzioni statali mi mettano esami nello stesso giorno." (XWolverineX)

    http://xvincentx.netsons.org/programBlog

  8. #8
    se la scrivi giusta è certamente sicura, il problema e se la scrivi sbagliata, nel caso della snprintf non vai comunque mai in overflow.
    ciao
    sergio

  9. #9
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,481
    Originariamente inviato da XWolverineX
    Perchè rischio un buffer overflow? Se passo i parametri giusti non dovrebbe mai accadereLe versioni sicure come si comportano?
    Perche' non fai un piccolo esempio con le 2 versioni e rispondi a tutte e 2 le tue domande ...?
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  10. #10
    Se i dati che passi a sprintf sono conosciuti solo a runtime non puoi essere sicuro di non effettuare buffer overflow a meno di non effettuare diversi controlli prima della sprintf; usa snprintf e passa la paura (alla peggio ottieni una stringa troncata, ma eviti falle di sicurezza e problemi di stabilità del programma).
    Amaro C++, il gusto pieno dell'undefined behavior.

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 © 2026 vBulletin Solutions, Inc. All rights reserved.