Fix off by 1 error in DqnString::Expand()

This commit is contained in:
Doyle T 2018-03-11 21:26:18 +11:00
parent dc22ba2a02
commit 0bc8a48dbd
2 changed files with 28 additions and 7 deletions

View File

@ -5,8 +5,29 @@
set ProjectName=dqn_unit_test set ProjectName=dqn_unit_test
set CompileEntryPoint=..\dqn_unit_test.cpp set CompileEntryPoint=..\dqn_unit_test.cpp
REM Build tags file REM Build tags file if you have ctags in path
ctags -R where /q ctags
if %errorlevel%==0 (
REM When parsing a C++ member function definition (e.g. "className::function"),
REM ctags cannot determine whether the scope specifier is a class name or
REM a namespace specifier and always lists it as a class name in the scope
REM portion of the extension fields. Also, if a C++ function is defined outside
REM of the class declaration (the usual case), the access specification (i.e.
REM public, protected, or private) and implementation information (e.g. virtual,
REM pure virtual) contained in the function declaration are not known when the
REM tag is generated for the function definition. -c++-kinds=+p fixes that
REM The --fields=+iaS option:
REM a Access (or export) of class members
REM i Inheritance information
REM S Signature of routine (e.g. prototype or parameter list)
REM
REM The --extra=+q option:
REM By default, ctags only generates tags for separate identifiers found in
REM the source files. With --extras=+q option, then ctags will also generate
REM a second, class-qualified tag for each class member
ctags -R --c++-kinds=+p --fields=+iaS --extras=+q
)
REM Check if build tool is on path REM Check if build tool is on path
REM >nul, 2>nul will remove the output text from the where command REM >nul, 2>nul will remove the output text from the where command

10
dqn.h
View File

@ -775,9 +775,9 @@ struct DqnAllocatorMetadata
isize *PtrToAllocAmount (u8 const *ptr) const; isize *PtrToAllocAmount (u8 const *ptr) const;
private: private:
u32 boundsGuardSize; // sizeof(GUARD_VALUE) OR 0 if BoundsGuard is disabled. u32 boundsGuardSize; // sizeof(GUARD_VALUE) OR 0 if BoundsGuard is disabled.
u32 allocHeadSize; // Bounds Guard Size + Offset To Src Size + Alloc Amount Size u32 allocHeadSize; // Bounds Guard Size + Offset To Src Size + Alloc Amount Size
u32 allocTailSize; // Bounds Guard Size u32 allocTailSize; // Bounds Guard Size
}; };
// #DqnMemStack API // #DqnMemStack API
@ -1099,7 +1099,7 @@ T *DqnArray<T>::Insert(T const item, isize index)
this->data[index] = item; this->data[index] = item;
T *result = this->data + index; T *result = this->data + index;
DQN_ASSERT(this->count < this->max); DQN_ASSERT(this->count <= this->max);
return result; return result;
} }
@ -6395,7 +6395,7 @@ bool DqnString::Expand(i32 newMax)
usize allocSize = sizeof(*(this->str)) * (newMax + 1); usize allocSize = sizeof(*(this->str)) * (newMax + 1);
char *result = nullptr; char *result = nullptr;
if (this->str) result = (char *)this->memAPI->Realloc(this->str, this->max, allocSize); if (this->str) result = (char *)this->memAPI->Realloc(this->str, (this->max + 1), allocSize);
else result = (char *)this->memAPI->Alloc(allocSize, Dqn::ZeroClear::False); else result = (char *)this->memAPI->Alloc(allocSize, Dqn::ZeroClear::False);
if (result) if (result)