2010年8月23日 星期一

Return value trap

Linux系統程式設計下,一些系統呼叫可能因為我們錯誤地認為回傳資訊而造成錯誤。

下面是一個判斷是不是該繼續接收資料的例子。

if (!((byteRead = recv(sock, buffer, bufsize, 0))))break;

在這個判斷式中存在一個陷阱,在發生recv錯誤的時候,如Connection Reset by Peer,recv會回傳-1,但是不足以跳出這個迴圈。會造成的錯誤是,byteRead會拿-1來進行運算,造成錯誤結果。

下面是比較正確的寫法,或是偵測perror()來得知是否現在是錯誤。

if (!((byteRead = recv(sock, buffer, bufsize, 0)) > 0))break;

沒有留言: