On 11/06/2013 01:06 AM, Dmitry V. Levin wrote:
> On Tue, Nov 05, 2013 at 04:19:31PM +0100, Denys Vlasenko wrote:
>> On 11/05/2013 01:33 PM, Dr. David Alan Gilbert wrote:
>> There can be legitimate programs which use select() in excess of
>> glibc-imposed
>> artificial limit on bit array sizes.
>
> Yes, the syscall itself imposes no such limitations.
> Such programs are more expected to use poll() instead of select(), though.
>
>>> (I guess you could argue that's a false positive from fortify, but there
>>> again I think it is an illegal use of FD_ISSET).
>>
>> Do you see a reasonably portable way to check FD_ISSET?
>
> Looks like all FD_ISSET implementations just test the n-th bit in the
> array of long ints. I've pushed a commit with yet another FD_ISSET
> implementation that hopefully does the same.
static int
fd_isset(int d, fd_set *fds)
{
const int bpl = 8 * sizeof(long);
long *s = (long *) fds;
return !!(s[d / bpl] & (1L << (d % bpl)));
}
The function is executed *for each bit*.
With gcc -Os at least, this will execute a signed division
because gcc must ensure "d / bpl" has a correct value for
negative d too - it does not know that we never use negative d.
0: 89 f9 mov %edi,%ecx
2: bf 40 00 00 00 mov $0x40,%edi
7: 89 c8 mov %ecx,%eax
9: 99 cltd
a: f7 ff idiv %edi <============
c: 89 d1 mov %edx,%ecx
e: 48 63 d0 movslq %eax,%rdx
11: 48 8b 04 d6 mov (%rsi,%rdx,8),%rax
15: 48 d3 f8 sar %cl,%rax
18: 83 e0 01 and $0x1,%eax
1b: c3 retq
Making bpl "unsigned":
0: 89 f8 mov %edi,%eax
2: 89 f9 mov %edi,%ecx
4: c1 e8 06 shr $0x6,%eax
7: 83 e1 3f and $0x3f,%ecx
a: 89 c0 mov %eax,%eax <==== stupid gcc??
c: 48 8b 04 c6 mov (%rsi,%rax,8),%rax
10: 48 d3 f8 sar %cl,%rax
13: 83 e0 01 and $0x1,%eax
16: c3 retq
Inlining fd_isset eliminates call overhead at the cost of only 2 bytes:
# size desc.o desc.o.inlined
text data bss dec hex filename
5101 0 1024 6125 17ed desc.o
5103 0 1024 6127 17ef desc.o.inlined
I committed a change to implement these.
------------------------------------------------------------------------------
November Webinars for C, C++, Fortran Developers
Accelerate application performance with scalable programming models. Explore
techniques for threading, error checking, porting, and tuning. Get the most
from the latest Intel processors and coprocessors. See abstracts and register
http://pubads.g.doubleclick.net/gampad/clk?id=60136231&iu=/4140/ostg.clktrk
_______________________________________________
Strace-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/strace-devel