1c1bc9d1214d8c057eb2e96f3e96454688e5488c4sewardj 2c1bc9d1214d8c057eb2e96f3e96454688e5488c4sewardj/* A simple test to demonstrate heap, stack, and global overrun 3c1bc9d1214d8c057eb2e96f3e96454688e5488c4sewardj detection. */ 4c1bc9d1214d8c057eb2e96f3e96454688e5488c4sewardj 5c1bc9d1214d8c057eb2e96f3e96454688e5488c4sewardj#include <stdio.h> 6c1bc9d1214d8c057eb2e96f3e96454688e5488c4sewardj#include <stdlib.h> 7c1bc9d1214d8c057eb2e96f3e96454688e5488c4sewardj 8c1bc9d1214d8c057eb2e96f3e96454688e5488c4sewardjshort ga[100]; 9c1bc9d1214d8c057eb2e96f3e96454688e5488c4sewardj 10c1bc9d1214d8c057eb2e96f3e96454688e5488c4sewardj__attribute__((noinline)) 11c1bc9d1214d8c057eb2e96f3e96454688e5488c4sewardjint addup_wrongly ( short* arr ) 12c1bc9d1214d8c057eb2e96f3e96454688e5488c4sewardj{ 13c1bc9d1214d8c057eb2e96f3e96454688e5488c4sewardj int sum = 0, i; 14c1bc9d1214d8c057eb2e96f3e96454688e5488c4sewardj for (i = 0; i <= 100; i++) 15c1bc9d1214d8c057eb2e96f3e96454688e5488c4sewardj sum += (int)arr[i]; 16c1bc9d1214d8c057eb2e96f3e96454688e5488c4sewardj return sum; 17c1bc9d1214d8c057eb2e96f3e96454688e5488c4sewardj} 18c1bc9d1214d8c057eb2e96f3e96454688e5488c4sewardj 19c1bc9d1214d8c057eb2e96f3e96454688e5488c4sewardj__attribute__((noinline)) 20c1bc9d1214d8c057eb2e96f3e96454688e5488c4sewardjint do_other_stuff ( void ) 21c1bc9d1214d8c057eb2e96f3e96454688e5488c4sewardj{ 22c1bc9d1214d8c057eb2e96f3e96454688e5488c4sewardj short la[100]; 23c1bc9d1214d8c057eb2e96f3e96454688e5488c4sewardj return 123 + addup_wrongly(la); 24c1bc9d1214d8c057eb2e96f3e96454688e5488c4sewardj} 25c1bc9d1214d8c057eb2e96f3e96454688e5488c4sewardj 26c1bc9d1214d8c057eb2e96f3e96454688e5488c4sewardj__attribute__((noinline)) 27c1bc9d1214d8c057eb2e96f3e96454688e5488c4sewardjint do_stupid_malloc_stuff ( void ) 28c1bc9d1214d8c057eb2e96f3e96454688e5488c4sewardj{ 29c1bc9d1214d8c057eb2e96f3e96454688e5488c4sewardj int sum = 0; 30c1bc9d1214d8c057eb2e96f3e96454688e5488c4sewardj unsigned char* duh = malloc(100 * sizeof(char)); 31c1bc9d1214d8c057eb2e96f3e96454688e5488c4sewardj sum += duh[-1]; 32c1bc9d1214d8c057eb2e96f3e96454688e5488c4sewardj free(duh); 33c1bc9d1214d8c057eb2e96f3e96454688e5488c4sewardj sum += duh[50]; 34c1bc9d1214d8c057eb2e96f3e96454688e5488c4sewardj return sum; 35c1bc9d1214d8c057eb2e96f3e96454688e5488c4sewardj} 36c1bc9d1214d8c057eb2e96f3e96454688e5488c4sewardj 37c1bc9d1214d8c057eb2e96f3e96454688e5488c4sewardjint main ( void ) 38c1bc9d1214d8c057eb2e96f3e96454688e5488c4sewardj{ 39c1bc9d1214d8c057eb2e96f3e96454688e5488c4sewardj long s = addup_wrongly(ga); 40c1bc9d1214d8c057eb2e96f3e96454688e5488c4sewardj s += do_other_stuff(); 41c1bc9d1214d8c057eb2e96f3e96454688e5488c4sewardj s += do_stupid_malloc_stuff(); 42c1bc9d1214d8c057eb2e96f3e96454688e5488c4sewardj if (s == 123456789) { 43c1bc9d1214d8c057eb2e96f3e96454688e5488c4sewardj fprintf(stdout, "well, i never!\n"); 44c1bc9d1214d8c057eb2e96f3e96454688e5488c4sewardj } else { 45c1bc9d1214d8c057eb2e96f3e96454688e5488c4sewardj fprintf(stdout, "boringly as expected\n"); 46c1bc9d1214d8c057eb2e96f3e96454688e5488c4sewardj } 47c1bc9d1214d8c057eb2e96f3e96454688e5488c4sewardj return 0; 48c1bc9d1214d8c057eb2e96f3e96454688e5488c4sewardj} 49