mirror of https://github.com/ARMmbed/mbed-os.git
77 lines
2.1 KiB
C++
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);
|
|
}
|