DiegoEmilio01 / IIC3413

Repositorio del curso Implementación de Sistemas de Bases de Datos
16 stars 1 forks source link

Insufficient space for an object of type 'int32_t' #11

Open Creyel opened 5 months ago

Creyel commented 5 months ago

Estoy intentando hacer la funcion de vacuum, pero cuando intento serializar records en el char* que estoy usando para hacer la nueva pagina que reemplazara a la original, me aparece el siguiente error:

runtime error: store to address 0x7ffe0106d9b0 with insufficient space for an object of type 'int32_t' 0x7ffe0106d9b0: note: pointer points here

AddressSanitizer:DEADLYSIGNAL ================================================================= ==775==ERROR: AddressSanitizer: stack-overflow on address 0x7ffe0106d9b0 (pc 0x55a125bcfa0f bp 0x7ffe0106ab00 sp 0x7ffe01069920 T0) No se por que puede pasar esto, el char* tiene el tamaño de una pagina y la manera en que serializo los records es la misma que en el metodo para insertar.
cirojas commented 5 months ago

será que estas declarando memoria así?

char array[4096];

4096 es demasiado grande para inicializarse en el stack. Debes usar new/delete para que se inicialice en el heap.

char* array = new char[4096];
// ... code
delete[] array;
Creyel commented 5 months ago

Lo cambie y ahora me aparece otro error:(

==1011==ERROR: AddressSanitizer: heap-buffer-overflow on address 0x621000004080 at pc 0x55d6fe55c83c bp 0x7fff2d29ecb0 sp 0x7fff2d29eca0 WRITE of size 4 at 0x621000004080 thread T0

0 0x55d6fe55c83b in HeapFilePage::vacuum(Schema const&) /home/creyel/implementacion_bdd/IIC3413/src/storage/heap_file/heap_file_page.cc:146

#1 0x55d6fe553069 in HeapFile::vacuum() /home/creyel/implementacion_bdd/IIC3413/src/storage/heap_file/heap_file.cc:51
#2 0x55d6fe507eec in main /home/creyel/implementacion_bdd/IIC3413/src/tests/test_example_4.cc:50
#3 0x7fb99e2e9082 in __libc_start_main ../csu/libc-start.c:308
#4 0x55d6fe5061ed in _start (/home/creyel/implementacion_bdd/IIC3413/build/Debug/tests/test_example_4+0xb11ed)

Address 0x621000004080 is a wild pointer. SUMMARY: AddressSanitizer: heap-buffer-overflow /home/creyel/implementacion_bdd/IIC3413/src/storage/heap_file/heap_file_page.cc:146 in HeapFilePage::vacuum(Schema const&) Shadow bytes around the buggy address:

cirojas commented 5 months ago

El error indica que estás intentando escribir en una posición de memoria incorrecta. Según el sanitizer es en el archivo src/storage/heap_file/heap_file_page.cc linea 146.

Lo más probable es que estas usando una posición de memoria mal calculada previamente. Además dice heap-buffer-overflow así que lo más probable es que te pasaste de los bytes que tenias reservados.

Una causa típica de porque pasa eso es que cuando haces aritmetica con punteros de un tipo de dato que usa más de un byte, por ejemplo si tienes un int32_t* y le sumas x, en realidad le estas sumando x*sizeof(int32).

int32_t* ptr = something;
ptr += 1;  // esto no mueve el puntero 1 byte, lo mueve 4 bytes