mbed-os/libraries/tests/mbed/heap_and_stack/main.cpp

77 lines
2.1 KiB
C++

#include "test_env.h"
static char *initial_stack_p;
static char *initial_heap_p;
static char line[256];
static unsigned int iterations = 0;
void report_iterations(void) {
unsigned int tot = (0x100 * iterations)*2;
printf("\nAllocated (%d)Kb in (%u) iterations\n", tot/1024, iterations);
#if !defined(TOOLCHAIN_GCC_CR)
// EA: This causes a crash when compiling with GCC_CR???
printf("%.2f\n", ((float)(tot)/(float)(initial_stack_p - initial_heap_p))*100.);
#endif
#ifdef TOOLCHAIN_ARM
#ifndef __MICROLIB
__heapvalid((__heapprt) fprintf, stdout, 1);
#endif
#endif
}
void stack_test(char *latest_heap_pointer) {
char stack_line[256];
iterations++;
sprintf(stack_line, "\nstack pointer: %p", &stack_line[255]);
puts(stack_line);
char *heap_pointer = (char*)malloc(0x100);
if (heap_pointer == NULL) {
int diff = (&stack_line[255] - latest_heap_pointer);
if (diff > 0x200) {
sprintf(stack_line, "\n[WARNING] Malloc failed to allocate memory too soon. There are (0x%x) free bytes", diff);
report_iterations();
puts(stack_line);
} else {
puts("\n[SUCCESS] Stack/Heap collision detected");
report_iterations();
}
return;
} else {
heap_pointer += 0x100;
sprintf(line, "heap pointer: %p", heap_pointer);
puts(line);
}
if ((&stack_line[255]) > heap_pointer) {
stack_test(heap_pointer);
} else {
puts("\n[WARNING] The Stack/Heap collision was not detected");
report_iterations();
}
}
int main (void) {
char c;
initial_stack_p = &c;
initial_heap_p = (char*)malloc(1);
if (initial_heap_p == NULL) {
printf("Unable to malloc a single byte\n");
notify_completion(false);
}
printf("Initial stack/heap geometry:\n");
printf(" stack pointer:V %p\n", initial_stack_p);
printf(" heap pointer :^ %p\n", initial_heap_p);
initial_heap_p++;
stack_test(initial_heap_p);
notify_completion(true);
}