|
|
Message-ID: <20230106092010.GA2032@voyager>
Date: Fri, 6 Jan 2023 10:20:10 +0100
From: Markus Wichmann <nullplan@....net>
To: musl@...ts.openwall.com
Subject: Re: [PATCH] fix return value of wcs{,n}cmp for near-limits
signed wchar_t values
On Wed, Jan 04, 2023 at 04:07:19PM +0100, Gabriel Ravier wrote:
> int wcscmp(const wchar_t *l, const wchar_t *r)
> {
> for (; *l==*r && *l && *r; l++, r++);
I just noticed this line. Isn't the "&& *r" part superfluous? If r is a
prefix of l, then *r and *l will be unequal, and the loop will terminate
because of the first condition alone. (If l is a prefix of r, we need
the second condition to terminate the loop.)
> - return *l - *r;
> + return *l < *r ? -1 : *l > *r;
> }
Ah, that old bug. The problem is that the difference between two 32-bit
values takes up 33 bits to save. I wonder if it would be worth it to
just cast the values to 64 bits, then dividing the result by two. You
know, like
return ((int64_t)*l - *r) >> 1;
Although that does presuppose that wchar_t is smaller than 64 bits,
which the proposed change does not require.
Ciao,
Markus
Powered by blists - more mailing lists
Confused about mailing lists and their use? Read about mailing lists on Wikipedia and check out these guidelines on proper formatting of your messages.