From the select man page for Linux:
Under Linux, select() may report a socket file descriptor as "ready for reading", while nevertheless a subsequent read blocks. This could for example happen when data has arrived but upon examination
has wrong checksum and is discarded. There may be other circumstances in which a file descriptor is spuriously reported as ready. Thus it may be safer to use O_NONBLOCK on sockets that should not block.
Of course, that warning is in the bugs section, implying that the authors think that isn't an expected behavior -- but nevertheless, under Linux at least it is something that can happen. Personally, I always set my sockets to be non-blocking; that way I don't have to worry about my program accidentally blocking anywhere other than where I intended it to block (i.e. inside select()).