2

How to create the condition of stack overflow in GNU/linux?

Seki
  • 11,135
  • 7
  • 46
  • 70

8 Answers8

13

a recursive function with no way out should do the trick

pseudo-code, my c is a bit rusty

void stack_overflow()
{
   stack_overflow();
}
Jason
  • 15,915
  • 3
  • 48
  • 72
9

I'd recommend reading the phrack magazine article "Smashing the stack for fun and profit". It also contains sample code.

edef
  • 743
  • 4
  • 13
5

You just need to think about what uses the stack in C.

  • Dynamic memory allocation (with malloc()) uses the heap;
  • Local variables and function call stacks use the stack.

So, all you have to do is exhaust the stack. Either endless recursion on a function or large local variable creation (don't let them be cleaned up though by going out of scope) should do it.

cletus
  • 616,129
  • 168
  • 910
  • 942
4

There are code samples in the Wikipedia article. Why you'd want to cause one is beyond me...

ceejayoz
  • 176,543
  • 40
  • 303
  • 368
1

Lot of examples have been referred here in other answers. But every one seems to have missed this.

To force the stack overflow, one needs to understand what is the size of your stack. In linux the default size of the stack is 8MB.

 ulimit -a         //would give you the default stack size 
 ulimit -s 16384   // sets the stack size to 16M bytes

So you can force the stack overflow even with an array of say 100 integers , if you tweak the stack size to be that much small.

Jay D
  • 3,263
  • 4
  • 32
  • 48
  • If you double the array size on each iteration and you actually access the last (or first) array element, you'll hit stack overflow in less than 64 iterations on modern computers regardless of the stack size. – Alexey Frunze Jul 04 '12 at 22:49
  • @ AlexeyFrunze : the stack size is not the variant here. there can be million ways to overflow the stack once we know the stack limit. may it be doubling the array size , having an infinitely recursive function call or anything else. – Jay D Jul 04 '12 at 23:14
1

With alloca() or strdupa()

dmityugov
  • 4,390
  • 23
  • 18
1

The simplest way is just declare a large enough automatic stack variable. No recursion or alloca needed. Interestingly, this is not a compile-time error. The size needed will vary by platform:

#define SIZE 10000000

int main(int argc, char **argv)
{
    char a[SIZE];
}
Matthew Flaschen
  • 278,309
  • 50
  • 514
  • 539
0

"how to create the condition of stack overflow in linux"

The same way you'd create a stack overflow on Windows.

Jason's answer might work, but some compilers by optimize it into a loop. I think adding a a parameter will do the trick:

    int Add(int num)
    {
        num += Add(num);
        return num;
    }
Giovanni Galbo
  • 12,963
  • 13
  • 59
  • 78