Dnia 2011-10-10, pon o godzinie 01:31 +0200, Tomasz Wasilczyk pisze:
> zauważyłem, że w niektórych konfiguracjach gg_vsaprintf ucina ciągi
> dłuższe niż 256 znaków. Konkretnie chodzi o przypadek, w którym
> GG_CONFIG_HAVE_C99_VSNPRINTF jest NIE ustawione, mimo, że vsnprintf
> jest w wersji C99. Według opisu w configure.ac, nie zawsze jesteśmy w
> stanie to ustalić (głównie chodzi o cross-kompilację). Nie jest to też
> sprawdzane w Pidginie, skąd wynikał mój problem.
> 
> Udało mi się zmusić do współpracy kod dla wersji "starej" vsnprintfa z
> nowym - na trzy sposoby różniące się poziomem inwazyjności w kod
> libgadu.

Podoba mi się idea wykrywania wersji vsnprintf() w trakcie działania,
ale jeśli dobrze rozumiem zmianę C, na systemach z C99 będziemy alokować
pamięć dwa razy. Wyłączając przypadek, gdy przypadkiem trafimy na ciąg
mający 255 znaków. Mam rację?

Może wykrywanie stosować jeśli GG_CONFIG_HAVE_C99_VSNPRINTF nie jest
zdefiniowane, żeby uniknąć problemu, na który trafiłeś? Nie pozbędziemy
się kodu, ale też nie będziemy niepotrzebnie męczyć alokatora.
> 
> Ponadto zauważyłem parę rzeczy związanych z tą funkcją:

> - funkcja nie oferuje spójnego zachowania dla obu wersji, tzn. dla tej
> "nie-C99" nie alokuje najmniejszego możliwego rozmiaru bufora
> (poprawione w wersji C mojego patcha)

Nie przejmowałbym się tym za bardzo. Jeśli ktoś ma tak stare środowisko,
to ma większe problemy niż zmarnowane 50 bajtów ;)

> - również wykorzystanie zmiennej size nie jest spójne, tzn. czasem
> oznacza rozmiar bufora, czasem długość ciągu (bez '\0') - także
> poprawione w wersji C

Jasne, nie mam nic na usprawiedliwienie.

> - zastanawiam się, po co kopiować zmienną ap do aq (zresztą jak nie ma
> dostępnych funkcji do kopiowania, nasza funkcja tego po prostu nie
> robi); Poza tym wywołanie vsnprintf na końcu w wersji patcha C jest
> prawdopodobnie zbędne (bo i tak w buforze jest to, co trzeba)

Jeśli dobrze pamiętam, to na jakimś PowerPC można było użyć typu va_list
tylko raz, dlatego jedna kopia była używana do określenia rozmiaru
bufora, druga do właściwego vsnprintf(). Nie wiem, czy jest sens nadal
utrzymywać taki kod.

Pozdr,
Wojtek

_______________________________________________
libgadu-devel mailing list
libgadu-devel@lists.ziew.org
http://lists.ziew.org/mailman/listinfo/libgadu-devel

Reply via email to