Visualizzazione dei risultati da 1 a 6 su 6

Discussione: [C] funzione sprintf

  1. #1

    [C] funzione sprintf

    sprintf(var1, var2.arr);

    var1 e' una variabile di stack
    var2.arr e' un'array di 80 byte, dichiarato sullo stack, ed e' stato riempito appena prima con un strncpy (quindi senza '\0')

    mi è stato detto che
    eseguire sprintf copiando da una variabile dove non e' garantito lo '\0' e' pericoloso, si puo' sporcare lo stack in modo definitivo, corrompendo gli Instruction Pointer delle varie chiamate e corrompendo anche i registri che sono pushati sullo stack assieme ai valori delle variabili

    con quale funzione conviene sostituirla?
    strncpy è ok?

    Grazie

  2. #2
    C'è una concezione errata di fondo su strncpy, che deriva dal fatto che è chiamata in maniera stupida.
    strncpy non nasce come versione "sicura" di strcpy, ma come una funzione che non c'entra niente per operare su buffer a lunghezza fissata (non su stringhe NUL-terminate), per cui scrive gli zeri solo come padding, senza garantire che la stringa sia effettivamente terminata. Ergo, nei casi "buoni" perde tempo a scrivere degli zeri inutili, in quelli "cattivi" lascia la stringa non terminata.
    L'equivalente-strcpy a lunghezza limitata (non standard, presente solo su alcuni compilatori) si chiama in genere strlcpy. In ogni caso, la puoi facilmente implementare "a mano":
    codice:
    void mystrlcpy(char * dst, const char * restrict src, size_t size) {
        if(!size) return 0;
        while(*src && size) {
            *dst = *src;
            dst++; src++; size--;
        }
        dst[-1]=0;
    }
    Amaro C++, il gusto pieno dell'undefined behavior.

  3. #3
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,466
    Non capisco il fine di tutto il discorso.

    Perché usi la strncpy? E perché, in ogni caso, non aggiungi anche il terminatore?
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  4. #4
    Quote Originariamente inviata da oregon Visualizza il messaggio
    Non capisco il fine di tutto il discorso.

    Perché usi la strncpy? E perché, in ogni caso, non aggiungi anche il terminatore?
    uso la sprintf, come ho scritto, e chiedo come sostituirla

    scusate ma sono poco esperto di C e è un codice che mi sono ritrovato

  5. #5
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,466
    Le mie domande erano altre ... comunque ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  6. #6
    non ho idea, mi sono trovato quel codice

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