Files
libvec/tests/crash_9b_test.c
T

107 lines
2.0 KiB
C

#include <mach/mach.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct
{
char* arr;
size_t size;
size_t capacity;
} Vec8_t;
#define CAPACITY 1024
Vec8_t
create(const Vec8_t* input)
{
Vec8_t vec = { .arr = NULL, .size = 0, .capacity = CAPACITY };
if (input == NULL)
{
vec.arr = calloc(vec.capacity, sizeof(char));
return vec;
}
if (input->size > 0)
{
vec.size = input->size + 1;
}
vec.arr = calloc(vec.capacity, sizeof(char));
return vec;
}
void
delete(Vec8_t* vec)
{
if (vec->arr != NULL)
{
free(vec->arr);
vec->arr = NULL;
}
vec->size = 0;
vec->capacity = 0;
}
Vec8_t
add_back(Vec8_t* vec, const char val)
{
if (vec->size >= vec->capacity)
{
vec->capacity = 2 * vec->capacity;
char* new_arr =
reallocf(vec->arr, vec->capacity * sizeof(char));
if (new_arr == NULL)
{
return *vec;
}
vec->arr = new_arr;
}
vec->arr[vec->size] = val;
vec->size++;
return *vec;
}
vm_size_t
get_physical_mem()
{
struct task_basic_info info;
mach_msg_type_number_t count = TASK_BASIC_INFO_COUNT;
task_info(mach_task_self(), TASK_BASIC_INFO, (task_info_t)&info,
&count);
return info.resident_size;
}
int
main()
{
printf("=== PROGRESSIVE TEST: 1K -> 10K -> 100K -> 1M -> 10M -> 100M -> 1B ===\n\n");
size_t targets[] = {1000, 10000, 100000, 1000000, 10000000, 100000000, 1000000000};
int num_tests = 7;
for (int t = 0; t < num_tests; t++) {
size_t target = targets[t];
printf("\n=== TEST %d: %zu elements ===\n", t+1, target);
Vec8_t vec = create(NULL);
size_t start_cap = vec.capacity;
for (size_t i = 0; i < target; i++) {
vec = add_back(&vec, 'x');
if (vec.arr == NULL) {
printf("CRASHED at %zu elements!\n", i);
return 1;
}
}
printf("SUCCESS: %zu elements, capacity %zu\n", vec.size, vec.capacity);
printf("Memory: %.2f MB\n", get_physical_mem() / 1024.0 / 1024.0);
delete(&vec);
}
printf("\n=== ALL TESTS PASSED ===\n");
printf("Final memory: %.2f MB\n", get_physical_mem() / 1024.0 / 1024.0);
return 0;
}