deep memory issues. so many issues.

This commit is contained in:
2025-06-14 21:32:07 -04:00
parent 99e3e5f48a
commit 4dd6b805cb
15 changed files with 137 additions and 67 deletions
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
+36
View File
@@ -0,0 +1,36 @@
# Save this as valgrind.supp
{
glibc_tls_init
Memcheck:Param
set_robust_list(head)
...
fun:__libc_setup_tls
}
{
glibc_malloc_init
Memcheck:Cond
...
fun:ptmalloc_init*
}
{
glibc_getrandom
Memcheck:Cond
fun:getrandom
...
}
{
glibc_dl_init
Memcheck:Cond
...
fun:_dl_*
}
{
glibc_tcache_init
Memcheck:Cond
...
fun:tcache_init*
}
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -12,6 +12,8 @@ namespace amsmathutil25
void test_amsarray_select();
void test_amsarray_sort1();
void test_amsarray_insertdelete1();
void test_amsarray_insertdelete2();
void test_amsarray_minimal();
@@ -39,6 +39,13 @@ namespace ams
amsarray_size_t lmin = 0;
T defval = T();
void* test_ptr = malloc(16);
if(test_ptr) free(test_ptr);
else {
printf("HEAP CORRUPTED before reserve()!\n");
return amsarray_failure;
}
if(_newcap<=0)
{
length = 0;
@@ -61,12 +68,14 @@ namespace ams
return ret;
}
//this shouldn't be necessary, but I'm getting weird memory bugs.
ams::buffer_set<T>(newdata,0,_newcap,defval);
if(data!=NULL)
{
lmin = (_newcap>=reserved) ? reserved : _newcap;
ams::buffer_cast_copy<T,T>(newdata,data,lmin);
}
ams::buffer_set<T>(newdata,reserved,_newcap,defval);
//ams::buffer_set<T>(newdata,reserved,_newcap,defval);
if(data!=NULL) {delete[] data; data = NULL;}
data = newdata;
@@ -132,7 +141,7 @@ namespace ams
return ret;
}
q = (amsarray_size_t)((1.0/growfactor)*(double)_newlen);
q = (amsarray_size_t)((1.0/growfactor)*(double)reserved);
if(_newlen<q)
{
res = this->reserve(_newlen);
@@ -237,6 +246,8 @@ namespace ams
growfactor = other.growfactor;
data = other.data;
other.length = 0;
other.reserved = 0;
other.growfactor = 0;
other.data = NULL;
}
return *this;
@@ -405,8 +416,8 @@ template<typename T> int amsarray<T>::insert(amsarray_size_t ind, const T& val)
{
int ret = amsarray_success;
int res;
amsarray<T> narr;
amsarray_size_t I;
amsarray_size_t I, oldlen;
amsarray_size_t I0,I1;
if(ind<0)
{
@@ -415,61 +426,45 @@ template<typename T> int amsarray<T>::insert(amsarray_size_t ind, const T& val)
}
else if(ind<=this->length)
{
res = narr.resize_insert(this->length+1);
if(res!=amsarray_success)
oldlen = this->length;
res = this->resize_insert(this->length + 1);
if(res==amsarray_success)
{
//for now, do things single threaded.
//to do things multithreaded, I'd need another buffer
if(this->data!=NULL)
{
for(I=oldlen;I>=ind+1;I--)
{
this->data[I] = this->data[I-1];
}
this->data[ind] = val;
}
ret = amsarray_success;
return ret;
}
else
{
ret = amsarray_failure;
return ret;
}
if(this->data!=NULL)
{
for(I=0;I<ind && I<this->length;I++)
{
narr.data[I] = this->data[I];
}
}
narr.data[ind] = val;
if(this->data!=NULL)
{
for(I=ind+1;I<narr.length;I++)
{
narr.data[I] = this->data[I-1];
}
}
//steal data from narr
if(this->data!=NULL) {delete[] this->data; this->data=NULL;}
this->length = narr.length;
this->data = narr.data;
narr.length = 0;
narr.data = NULL;
}
else
{
//inserting past the end of the array
res = narr.resize_insert(ind+1);
res = this->resize_insert(ind+1);
if(res!=amsarray_success)
{
ret = amsarray_failure;
return ret;
}
if(this->data!=NULL)
else
{
for(I=0;I<this->length;I++)
{
narr.data[I] = this->data[I];
}
this->data[ind] = val;
ret = amsarray_success;
return ret;
}
narr.data[ind] = val;
//steal data from narr
if(this->data!=NULL) {delete[] this->data; this->data=NULL;}
this->length = narr.length;
this->data = narr.data;
narr.length = 0;
narr.data = NULL;
}
return ret;
@@ -480,7 +475,6 @@ template<typename T> int amsarray<T>::erase(amsarray_size_t ind)
{
int ret = amsarray_success;
int res;
amsarray<T> narr;
amsarray_size_t I;
if(ind<0 || ind>=this->length)
@@ -489,31 +483,16 @@ template<typename T> int amsarray<T>::erase(amsarray_size_t ind)
return ret;
}
res = narr.resize_insert(this->length-1);
if(res!=amsarray_success)
{
ret = amsarray_failure;
return ret;
}
if(this->data!=NULL)
{
for(I=0;I<ind && I<this->length && I<narr.length;I++)
for(I=ind;I<this->length-1;I++)
{
narr.data[I] = this->data[I];
}
for(I=ind+1;I<this->length && (I-1)<narr.length;I++)
{
narr.data[I-1] = this->data[I];
this->data[I] = this->data[I+1];
}
this->data[this->length-1] = T();
}
//steal data from narr (should be similar to what std::move would do?)
if(this->data!=NULL) {delete[] this->data; this->data=NULL;}
this->length = narr.length;
this->data = narr.data;
narr.length = 0;
narr.data = NULL;
res = this->resize_insert(this->length-1);
ret = res;
return ret;
}
@@ -611,7 +590,7 @@ template<typename T> bool amsarray<T>::operator==(const amsarray<T>& other) cons
amsarray_size_t I;
int J;
int nthreads;
std::vector<std::thread*> threads;
amsarray<std::thread*> threads;
if(this->length != other.length)
{
@@ -246,6 +246,53 @@ void test_amsarray_insertdelete1()
return;
}
#include <string.h>
struct testing_amsarray_somelargestruct
{
int q1[50];
float q2[255];
testing_amsarray_somelargestruct() {
memset(q1, 0, sizeof(q1));
memset(q2, 0, sizeof(q2));
return;
}
};
void test_amsarray_insertdelete2()
{
int I,J;
//int K;
amsarray<testing_amsarray_somelargestruct> la;
la.resize(0);
for(I=0;I<255;I++)
{
la.append(testing_amsarray_somelargestruct());
printf("la length: %ld reserved: %ld\n", (long)la.length, (long)la.reserved);
}
for(I=0;I<255;I++)
{
J = la.length-1;
la.erase(J);
printf("la length: %ld reserved: %ld\n", (long)la.length, (long)la.reserved);
}
return;
}
void test_amsarray_minimal()
{
amsarray<int> simple_array;
for(int i = 0; i < 10; i++)
{
simple_array.append(i);
printf("Length: %ld\n", simple_array.length);
}
}
+7 -1
View File
@@ -1,5 +1,8 @@
#include <amsmathutil25/amsmathutil25.hpp>
using namespace ams;
using namespace ams::amsmathutil25;
int main(int argc, char* argv[])
{
int ret = 0;
@@ -9,7 +12,10 @@ int main(int argc, char* argv[])
//ams::amsmathutil25::test_amsarray2();
//ams::amsmathutil25::test_amsarray_select();
//ams::amsmathutil25::test_amsarray_sort1();
ams::amsmathutil25::test_amsarray_insertdelete1();
//test_amsarray_insertdelete1();
//test_amsarray_insertdelete2();
test_amsarray_minimal();
return ret;
}