/*
  One way to get a stack overflow - recursion depth gets too large.

  This program multiplies numbers by repeated addition, and adds by repeated increment. 
  This is a silly way to multiply numbers, but it is a recursive program that 
  will crash if the recursion depth gets too large.
 */

#include <stdio.h>

int recursion_depth, max_recursion_depth;

unsigned int add(unsigned int x, unsigned int y, int recursion_depth) {
  if (recursion_depth > max_recursion_depth) max_recursion_depth = recursion_depth;
  if (y == 0) return x;
  return add(x, y-1, recursion_depth+1);
}

unsigned int mult(unsigned x, unsigned y, int recursion_depth) {
  if (recursion_depth > max_recursion_depth) max_recursion_depth = recursion_depth;
  if (y == 0) return 0;
  if (y == 1) return x;

  return x + mult(x, y-1, recursion_depth+1);
}

int main(int argc, char *argv[]) {
  max_recursion_depth = 0;
  recursion_depth = 0;
  
  unsigned int a = (unsigned int) 78, b = (unsigned int) 1e5; // change this to 1e6 to get a stack overflow 
  printf("%u * %u = %u\n", a, b, mult(a, b, recursion_depth+1));
  printf("max_recursion_depth = %d\n", max_recursion_depth);
  return 0;
}