2014-10-02 14 views
5

Il mio programma funziona su diverse piattaforme. Tra questi, Windows CE. Attualmente, sprintf è ampiamente utilizzato, il che comporta un sacco di problemi con buffer-overflow, ecc. Voglio sostituirli con le chiamate a snprintf. Per Visual Studio, ho trovato questa domanda, che risolve la parte win32 del problema:snprintf per Windows CE

snprintf and Visual Studio 2010

ma non riesco a farlo funzionare per Windows CE, dal momento che le funzioni _vsnprintf_s e _vscprintf, e la costante _TUNCATE non sono disponibili Qualcuno sa di un modo per replicare il comportamento di snprintf (linux) su Windows CE?

+0

Controlla se questa risposta può darti le informazioni utili http://stackoverflow.com/questions/23882340/windows-ce-5-0-vs-windows-mobile-6/23883768#23883768 – daniele3004

risposta

1

Finora ho finito il seguente funzione:

int my_snprintf(char* str, size_t size, const char* format, ...) 
{ 
    int len = 0; 
    va_list ap; 

    if (size == 0) 
    { 
     return 0; 
    } 

    va_start(ap, format); 
    len = _vsnprintf(str, size, format, ap); 
    va_end(ap); 

    if (len < 0 || len >= size) 
    { 
     len = size - 1; 
    } 

    if (size > 0) 
    { 
     str[size - 1] = '\0'; 
    } 

    return len; 
} 

test preliminare sembra OK, e compila anche per WinCE .. Qualsiasi commento è molto apprezzato

+1

Sembra buono finora. Solo per dirlo: sei consapevole che 'snprintf' non aggiusta il codice bug? È necessario riscrivere in entrambi i modi, è necessario testare il valore restituito di 'snprintf' per vedere se è disponibile spazio sufficiente e, in caso contrario, riallocare il buffer (o qualunque cosa sia appropriata nel tuo caso). – mafso

+0

sì, sono consapevole - questo sarà il prossimo passo nel debug del codice .. Lo scopo principale ora è evitare alcuni misteriosi arresti causati da overflow – pjaall

+0

'Lo scopo principale ora è evitare alcuni misteriosi arresti causati da overflow' - Non penso che sistemerai i tuoi bug facendo questo, nasconderà solo il vero problema di root. snprintf proteggerà dal sovraccarico del buffer, ma se la logica del codice richiede dati più grandi e il buffer è troppo piccolo, non funzionerà ancora correttamente. – marcinj

0

Penso che sia possibile utilizzare la specifica funzione printf_s di Microsoft. Non sono sicuro che sia compatibile al 100% e penso che non permetta al buffer di essere nullo quando la dimensione è 0, ma potrebbe essere sufficiente per i tuoi requisiti e ... Non ho un VS2010 per confermare che printf_s sia presente in Edizione Windows CE.

Problemi correlati