Can you give an example of stack overflow in C++? Other than the recursive case:
void foo() { foo(); }
Keep trying to return main until the stack runs out?
int main(int argc, char **argv)
{
return main(argc, argv);
}
If you want to generate an explicitly non-recursive program to result in a stack overflow by function calls:
#!/usr/bin/env python
import sys
print "void func" + sys.argv[1] + "() { }"
for i in xrange(int(sys.argv[1])-1, -1, -1):
print "void func" + str(i) + "() { func" + str(i+1) + "(); }"
print "int main() { func0(); return 0; }"
Sample output:
$ python recursion.py 5
void func5() { }
void func4() { func5(); }
void func3() { func4(); }
void func2() { func3(); }
void func1() { func2(); }
void func0() { func1(); }
int main() { func0(); return 0; }
Sample usage:
$ python recursion.py 250000 | g++ -x c++ - && ./a.out
At least on my system, the call stack seems to be 174602, so you'll need to set the argument to recursion.py
to be larger than that; and it takes a few minutes to compile and link the program.
The typical case that does not involve infinite recursion is declaring an automatic variable on the stack that is too large. For example:
int foo()
{
int array[1000000];
}
This example shows uncontrolled recursion. Eventually, the stack spaced allocated to this process will be completely overwritten by instances of bar and ret...
int foo( int bar )
{
int ret = foo( 42 );
return ret;
}
Infinite recursion:
void infiniteFunction() { infiniteFunction(); } int main() { infiniteFunction(); return 0; }
You could also get a stack overflow if you try to put large objects on the stack (by-value).