2013-01-17 21 views
12

在zlib的1.2.7,文件inffast.c,線320,還有就是我不明白聲明:爲什麼zlib只努力計算正指針差異?

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

變量endout是兩個指針到輸出緩衝區。 此語句努力計算end - outend > outout - endout >= end時,但我不明白爲什麼它可能要這樣做。這在我看來,最終的結果是一樣的,那就是,該行可能也已被寫入:

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

兩個指針的差異有符號整型,ptrdiff_t(C99 6.5.6:9 ),並且257具有類型int。這兩者之間的更高級別的增加發生,我不明白三元運營商可能會防範什麼。

+3

如果zlib的着名可移植性也可以通過* not *依賴定義的行爲,而是檢查實現實際執行的操作,那麼我不會感到驚訝。 –

+1

是否有源代碼回購有足夠的歷史責怪這條線,看看它是否從不同的公式演變而來? – Potatoswatter

+1

@Patatoswatter我發現的唯一的東西是在inflate.c中的「更改歷史記錄」,將* strm-> next_out [-state-> offset]更改爲*(strm-> next_out - state-> offset),以避免出現否定問題inflate.c中的Alphas(64位)「,但這並不能解釋它。我可以看到'p [-o]'可以與'*(p-o)'不同,'o'是一個32位無符號整數,'p'是一個64位指針。我的問題中的陳述是別的。 –

回答

17

您的觀察對於C99以及C89/C90是正確的。

這行代碼是在十年前編寫的。在這一點上,我的記憶使我只能以偏執狂爲藉口。顯然我擔心在某些編譯器中,減去兩個指針的結果可能是無符號的。我不記得這一關切的起源,還是根本沒有任何基礎。

至於change history,那行代碼就像你今天看到的那樣,是從宙斯的額頭出生的。它自寫入以來一直沒有改變。