[Top][All Lists]
[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
- Re: memmem issues, (continued)
Re: memmem issues, Bruno Haible, 2007/12/26
Re: memmem issues, Bruno Haible, 2007/12/26
Re: memmem issues, Bruno Haible, 2007/12/21