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