2013-01-17 11 views
12

W zlib 1.2.7, plik inffast.c, linia 320, znajduje się stwierdzenie, że nie rozumiem:Dlaczego zlib stara się obliczyć tylko różnicę wskaźnika pozytywnego?

strm->avail_out = (unsigned)(out < end ? 
          257 + (end - out) : 257 - (out - end)); 

zmiennych end i out są dwa wskaźniki do bufora wyjściowego. To stwierdzenie dokłada wszelkich starań, aby obliczyć end - out, gdy, 3110 i , gdy out >= end, ale nie rozumiem, dlaczego może to zrobić. Wydaje mi się, że efekt końcowy jest taki sam, to znaczy, że linia może równie dobrze napisane:

strm->avail_out = 257 + (end - out); 

Różnica dwóch wskaźników ma podpisaną integralną typ ptrdiff_t (C99 6.5.6: 9) i 257 ma typ int. Dodanie odbywa się w typie wyższego rzędu między tymi dwoma i nie widzę tego, z czym może się przeciwstawić operator trójskładnikowy.

+3

Nie zdziwiłbym się, gdyby słynna przenośność zlib była również możliwa przez * nie * poleganie na określonym zachowaniu, ale raczej na sprawdzeniu, co faktycznie wykonują implementacje. –

+1

Czy istnieje repozytorium kodu źródłowego z wystarczającą historią, aby winić tę linię i sprawdzić, czy powstało ono z innego sformułowania? – Potatoswatter

+1

@Potatoswatter Jedyne co znalazłem to "Historia zmian" w inflate.c "Zmień strm-> next_out [-state-> offset] na * (strm-> next_out - state-> offset), aby uniknąć problemu z negacją Alphas (64-bitowy) w trybie inflate.c ", ale to nie wyjaśnia. Widzę, jak 'p [-o]' może się różnić od '* (p-o)' z 'o' 32-bitowym unsigned int i' p' z 64-bitowym wskaźnikiem. Oświadczenie w moim pytaniu jest czymś innym. –

Odpowiedz

17

Twoja obserwacja jest poprawna dla C99 i C89/C90.

Ten wiersz kodu został napisany dziesięć lat temu. W tym momencie moja pamięć pozwala mi tylko uzyskać pretekst do paranoi. Najwyraźniej obawiałem się, że w niektórych kompilatorach wynik odjęcia dwóch wskaźników może być niepodpisany. Nie przypominam sobie pochodzenia tej troski ani jej podstawy.

Jeśli chodzi o change history, ta linia kodu powstała z czoła Zeusa, jak widać dzisiaj. Nie uległa zmianie od czasu jej napisania.

Powiązane problemy