Re: [PATCH] SBuf c-string comparisons

From: Alex Rousskov <rousskov_at_measurement-factory.com>
Date: Wed, 16 Apr 2014 08:32:35 -0600

On 04/16/2014 12:05 AM, Amos Jeffries wrote:
> On 16/04/2014 5:07 a.m., Alex Rousskov wrote:
>> If I am reading the code correctly, there is a new bug:
>>
>>> It also avoids the s[] access by using strlen(s) != byteCompareLen.
>>
>>> + if (byteCompareLen < n && strlen(s) != byteCompareLen)
>>
>> s is guaranteed to be 0-terminated when n == npos only. For other cases,
>> we do not have such a guarantee and, hence, cannot use strlen(). Using
>> strlen(s) when n is not npos may lead to s overreads.

> I don't see any way around this without hand-crafing a full byte-by-byte
> strncmp replacement.

I am not against hand-crafting if it is really necessary -- we already
hand-craft memCaseCmp IIRC. Personally, I would hand-craft _if_ system
implementation of strncmp() is just a basic loop rather than some
complicated, optimized low-level code. Otherwise, I would find a way to
avoid strlen().

The following cloning approach also works, but I hope we do not have to
pay such a high performance price here:

  SBuf clone(*this);
  return ... ? strncmp(clone.c_str(), s, n) : strncasecmp(...);

> Which would appear to be overkill for this
> transitional method (only needed until all I/O and globals/constants are
> SBuf based).

Since the hand-crafted implementation is simple, I do not consider it an
overkill. And I am sure there is a way to avoid it if needed.

> I will comment the new methods with "Requires S to be null-terminated.".

I do not see why we should change (and limit) the "standard" API in this
case.

> Is this acceptible to you after those minor changes?

I disagree that we should limit the API to require terminated c-strings.

Sorry,

Alex.
Received on Wed Apr 16 2014 - 14:32:49 MDT

This archive was generated by hypermail 2.2.0 : Thu Apr 17 2014 - 12:00:23 MDT