From owner-freebsd-hackers@FreeBSD.ORG Mon May 27 10:27:15 2013 Return-Path: Delivered-To: freebsd-hackers@freebsd.org Received: from mx1.freebsd.org (mx1.FreeBSD.org [8.8.178.115]) by hub.freebsd.org (Postfix) with ESMTP id 94F2E7BD for ; Mon, 27 May 2013 10:27:15 +0000 (UTC) (envelope-from lee_thomas@aslantools.com) Received: from roproxy2-pub.unifiedlayer.com (roproxy2-pub.unifiedlayer.com [69.89.18.3]) by mx1.freebsd.org (Postfix) with SMTP id 6CFB4285 for ; Mon, 27 May 2013 10:27:15 +0000 (UTC) Received: (qmail 12220 invoked by uid 0); 27 May 2013 10:20:32 -0000 Received: from unknown (HELO mailchannelsproxy2.unifiedlayer.com) (66.147.243.71) by roproxy2.unifiedlayer.com with SMTP; 27 May 2013 10:20:32 -0000 X-Sender-Id: {:fast21.fastdomain.com:lthomasn:fast21.fastdomain.com} {sentby:program running on server} Received: from fast21.fastdomain.com (fast21.fastdomain.com [74.220.199.21]) by 0.0.0.0:2500 (trex/4.8.69); Mon, 27 May 2013 10:20:32 GMT Received: from localhost ([127.0.0.1]:54553 helo=fast21.fastdomain.com) by fast21.fastdomain.com with esmtp (Exim 4.80) (envelope-from ) id 1UguXY-0000IC-8x for freebsd-hackers@freebsd.org; Mon, 27 May 2013 04:20:32 -0600 To: Subject: Re: Performance improvement to strnlen(). X-PHP-Script: aslantools.com/mail/index.php for 173.71.114.222 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit Date: Mon, 27 May 2013 06:20:32 -0400 From: Lee Thomas Organization: Aslan Tools In-Reply-To: References: <2adc4d8e7c55e92d935f61efb4c9d723@lthomas.net> Message-ID: X-Sender: lee_thomas@aslantools.com User-Agent: Roundcube Webmail/0.8.4 X-Identified-User: {:fast21.fastdomain.com:lthomasn:fast21.fastdomain.com} {sentby:program running on server} X-BeenThere: freebsd-hackers@freebsd.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: Technical Discussions relating to FreeBSD List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 27 May 2013 10:27:15 -0000 On 2013-05-27 04:37, Václav Zeman wrote: > 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 Hello Václav, I am not an expert in C either, so you may be right that this is technically illegal. However, I copied this code from strlen.c, which has had it, and still has it, for 4.5 years, and I can't see any way any alias analysis done by the compiler could invalidate this code. In addition, there are many places in the kernel, and in other codebases I've worked on, where this kind of type conversion is done. See for instance /sys/amd64/amd64/vm_macdep.c:200, where we compute the base of a thread's stackframe from a pointer to an unrelated type of 'struct pcb', and then write to it. I am willing to uglify the code in the way you suggest if that is the general concensus, but I think the code as it stands is both safe and more legible. Thanks, Lee