Hi,
I've discovered a bug in the memory allocation of the String class.
This seems pretty significant because this class is used everywhere in
the library. Here's the function in question (common/string.cpp:23):
void String::reserve_i(size_t s)
{
size_t old_size = end_ - begin_;
size_t new_size = (storage_end_ - begin_) * 3 / 2;
if (new_size < 64) new_size = 64;
if (new_size + 1 < s) new_size = s + 1; <=========
if (old_size == 0) {
if (begin_) free(begin_);
begin_ = (char *)malloc(new_size);
} else {
begin_ = (char *)realloc(begin_, new_size);
}
end_ = begin_ + old_size;
storage_end_ = begin_ + new_size;
}
The problem is if the initial buffer is small (<64 so it is expanded
to 64 in the 3rd line) and s (the length we need to make room for) is
64 or 65. In this case, new_size will still be 64, not leaving room
for the last character of s and possibly the null terminator. Yikes!
What was really meant was:
if (new_size - 1 < s) new_size = s + 1;
Also, in String operator+ (string.hpp:397) the names of the two
arguments are switched. The function works correctly, as the names are
used consistently wrong, but I was pretty confused when I stepped
through this function while tracking down the above error. I take
'lhs' and 'rhs' to mean "Left/Right Hand Side", but 'rhs' actually
ends up on the left side of the concatenated string.
Brett Wilson
_______________________________________________
Aspell-devel mailing list
[EMAIL PROTECTED]
http://lists.gnu.org/mailman/listinfo/aspell-devel