2014-10-02 17 views
5

Mój program działa na kilku platformach. Wśród nich Windows CE. Obecnie sprintf jest szeroko wykorzystywany, co powoduje wiele problemów z przepełnieniami bufora itp. Zamiast tego chcę zastąpić je wywołaniami snprintf. Visual Studio, znalazłem na to pytanie, które rozwiązuje część win32 problemu:snprintf dla Windows CE

snprintf and Visual Studio 2010

ale nie mogę dostać pracy dla Windows CE, ponieważ funkcje i _vscprintf_vsnprintf_s i stałej _TUNCATE nie są dostępne. Czy ktoś wie o sposobie replikowania zachowania snprintf (linux) w Windows CE?

+0

Sprawdź, czy ta odpowiedź może dostarczyć przydatnych informacji http://stackoverflow.com/questions/23882340/windows-ce-5-0-vs-windows-mobile-6/23883768#23883768 – daniele3004

Odpowiedz

1

Jak dotąd skończyło się na następujących funkcji:

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; 
} 

Wstępne testy wygląda OK, a nawet kompiluje dla WinCE .. Wszelkie informacje zwrotne ogromnie docenia

+1

Wygląda dobrze. Wystarczy, aby to wspomniało: jesteś świadomy, że 'snprintf' nie naprawia błędnego kodu? Musisz ponownie napisać w dowolny sposób, musisz przetestować zwracaną wartość 'snprintf', aby sprawdzić, czy dostępna jest wystarczająca ilość miejsca, a jeśli nie, zresetuj bufor (lub cokolwiek, co jest odpowiednie w twoim przypadku). – mafso

+0

Tak, jestem tego świadomy - to będzie kolejny krok w debugowaniu kodu. Teraz głównym celem jest uniknięcie tajemniczych awarii spowodowanych przepełnieniami. – pjaall

+0

'Głównym celem jest teraz uniknięcie tajemniczych awarii spowodowanych przez przepełnienia" - Nie sądzę, że naprawisz swoje robaki, to tylko ukryje prawdziwy problem root. snprintf chroni przed przepełnieniem bufora, ale jeśli twoja logika kodu wymaga większych danych, a bufor jest za mały, to nadal nie będzie działał poprawnie. – marcinj

0

Myślę, że można użyć specyficznej dla firmy Microsoft funkcji printf_s. Nie jestem pewien, czy jest on w 100% kompatybilny i myślę, że nie pozwala na zerowanie bufora, gdy rozmiar wynosi 0, ale może być wystarczający dla twoich wymagań i ... Nie mam VS2010, aby potwierdzić printf_s jest obecny w Wersja Windows CE.