Performance improvement to strnlen().

Václav Zeman vhaisman at gmail.com
Mon May 27 08:37:42 UTC 2013


On 26 May 2013 21:01, Lee Thomas wrote:
> On 2013-05-26 08:00, Václav Zeman wrote:
>>
>> On 05/25/2013 10:27 PM, Lee Thomas wrote:
>>>
>>> +       lp = (const unsigned long *)((uintptr_t)str & ~LONGPTR_MASK);
>>> +       va = (*lp - mask01);
>>> +       vb = ((~*lp) & mask80);
>>
>> I do not think that this correct C. This is type punning violating the
>> rules of the language.
>
>
> Hello Václav,
>
> The aliasing here is safe, because there are no writes through either of the
> pointers, and the reads are correctly aligned.
I disagree. IANALL but AFAIK, this is simply not allowed by the
language => UB => even though it seems to work in this instance, you
are just lucky the UB is actually doing what you expect.

--
VZ


More information about the freebsd-hackers mailing list