bug-gnulib
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: memmem issues


From: Bruno Haible
Subject: Re: memmem issues
Date: Mon, 31 Dec 2007 11:43:32 +0100
User-agent: KMail/1.5.4

Paul Eggert wrote:
> The 'char' type can have padding bits, which means that code like this:
> 
>      char const *needle = (char const *) needle_start;
>      char const *haystack = (char const *) haystack_start;
>      if ((unsigned char) *needle == (unsigned char) *haystack) ...
> 
> might ignore some of the bits in the storage addressed by A and B.
> To get a proper memcmp-style comparison one must do something like this:
> 
>      unsigned char const *needle = (unsigned char const *) needle_start;
>      unsigned char const *haystack = (unsigned char const *) haystack_start;
>      if (*needle == *haystack) ...
> 
> (In the latter version, the casts are needed only because this code is
> intended to be portable to C++.)

I disagree. Citing ISO C 99, section 7.21.4:

   "The sign of a nonzero value returned by the comparison functions
    memcmp, strcmp, and strncmp is determined by the sign of the
    difference between the values of the first pair of characters
    (both interpreted as unsigned char) that differ in the objects
    being compared."

It says that the _values_ of the characters are interpreted as
unsigned char. I.e. like this:

    if ((unsigned char) *needle == (unsigned char) *haystack) ...

It does _not_ say that the memory storage should be interpreted as
'unsigned char[]'.

Bruno





reply via email to

[Prev in Thread] Current Thread [Next in Thread]