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