lkml.org 
[lkml]   [2003]   [Aug]   [13]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    /
    Date
    From
    SubjectRe: generic strncpy - off-by-one error
    On Tue, Aug 12, 2003 at 11:38:31PM -0400, Albert Cahalan wrote:
    > That's excellent. On ppc I count 12 instructions,
    > 4 of which would go away for typical usage if inlined.
    > Annoyingly, gcc doesn't get the same assembly from my
    > attempt at that general idea:
    >
    > char * strncpy_5(char *dest, const char *src, size_t count){
    > char *tmp = dest;
    > while (count--){
    > if(( *tmp++ = *src )) src++;
    > }
    > return dest;
    > }
    >
    > I suppose that gcc could use a bug report.

    I often noticed that using '++' and '--' within or just before assignments
    and/or comparisons often break the code and make it suboptimal. C provides
    enough flexibility to code what you think nearly at the instruction level.
    Since 'while' loops often start with a jump to the end, you can sometimes help
    the compiler by enclosing them within an 'if' statement such as below. BTW, in
    your case, count ends with -1.

    I've absolutely not tried this one, but it could produce different code on your
    PPC, and can trivially be derived to cleaner constructs. I proceeded the same
    way when I wrote my own optimized strlcpy() implementation which is 45 bytes
    long and copies 1 char per CPU cycle on i686.

    char *strncpy(char *dest, const char *src, size_t count)
    {
    if (count) {
    char *tmp = dest;
    while (1) {
    *tmp = *src;
    if (*src) src++;
    tmp++;
    if (!count--) break;
    }
    }
    return dest;
    }

    Cheers,
    Willy

    -
    To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
    the body of a message to majordomo@vger.kernel.org
    More majordomo info at http://vger.kernel.org/majordomo-info.html
    Please read the FAQ at http://www.tux.org/lkml/

    \
     
     \ /
      Last update: 2005-03-22 13:47    [W:0.024 / U:30.836 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site