Stack overflow detection in Embedded C - Time & Space Complexity
We want to understand how the time needed to detect a stack overflow changes as the program runs.
How does the detection process scale when the stack grows larger?
Analyze the time complexity of the following code snippet.
#define STACK_SIZE 100
int stack[STACK_SIZE];
int top = -1;
int push(int value) {
if (top >= STACK_SIZE - 1) {
return -1; // Stack overflow detected
}
stack[++top] = value;
return 0;
}
This code tries to add a value to a stack and checks if the stack is full to detect overflow.
Identify the loops, recursion, array traversals that repeat.
- Primary operation: A single comparison to check if the stack is full before pushing.
- How many times: Once per push operation, no loops or recursion involved.
Each push checks the top index against the stack size once, regardless of how many items are in the stack.
| Input Size (n) | Approx. Operations |
|---|---|
| 10 | 10 comparisons |
| 100 | 100 comparisons |
| 1000 | 1000 comparisons |
Pattern observation: The number of operations grows directly with the number of push attempts, but each check is simple and constant time.
Time Complexity: O(1)
This means each stack overflow check takes the same small amount of time no matter how big the stack is.
[X] Wrong: "Checking for stack overflow takes longer as the stack grows."
[OK] Correct: The check only compares the top index to a fixed size, so it always takes the same time.
Understanding that simple checks like stack overflow detection run in constant time helps you explain efficient code and avoid unnecessary loops.
"What if the stack overflow check involved scanning the entire stack array? How would the time complexity change?"
Practice
What is the main purpose of stack overflow detection in embedded C?
Solution
Step 1: Understand stack overflow concept
Stack overflow occurs when data is pushed beyond the stack's allocated size.Step 2: Identify purpose of detection
Detection helps prevent writing beyond stack limits, avoiding crashes and corruption.Final Answer:
To prevent writing data beyond the stack's fixed size -> Option BQuick Check:
Stack overflow detection = prevent overflow [OK]
- Thinking stack size can grow automatically
- Confusing overflow detection with CPU optimization
- Assuming stack clears itself on overflow
Which of the following code snippets correctly checks for stack overflow before pushing a value?
int stack[10];
int sp = 0; // stack pointer
int value = 5;
// Check before push
if (____) {
stack[sp++] = value;
}Solution
Step 1: Understand stack pointer and size
Stack size is 10, valid indices are 0 to 9, so sp must be less than 10 to push.Step 2: Choose correct condition
Condition 'sp < 10' ensures we don't write beyond array bounds.Final Answer:
sp < 10 -> Option AQuick Check:
Push only if sp less than stack size [OK]
- Using sp >= 10 allows overflow
- Using sp == 10 pushes out of bounds
- Using sp > 10 misses last valid index
What will be the output of the following code snippet?
int stack[3];
int sp = 0;
void push(int val) {
if (sp < 3) {
stack[sp++] = val;
printf("Pushed %d\n", val);
} else {
printf("Stack Overflow!\n");
}
}
int main() {
push(1);
push(2);
push(3);
push(4);
return 0;
}Solution
Step 1: Trace push calls and stack pointer
First three pushes succeed because sp < 3; fourth push fails as sp == 3.Step 2: Check output for each push
Outputs "Pushed 1", "Pushed 2", "Pushed 3", then "Stack Overflow!" on last push.Final Answer:
Pushed 1 Pushed 2 Pushed 3 Stack Overflow! -> Option AQuick Check:
Pushes succeed until sp == 3, then overflow [OK]
- Assuming push always succeeds
- Ignoring else branch output
- Confusing sp increment timing
Identify the bug in the following stack push function that causes stack overflow detection to fail:
void push(int val) {
if (sp <= 3) {
stack[sp++] = val;
} else {
printf("Overflow detected\n");
}
}Solution
Step 1: Analyze condition sp <= 3 with stack size 3
sp can be 3, but valid indices are 0,1,2; sp=3 causes out-of-bounds write.Step 2: Correct condition to prevent overflow
Use sp < 3 to allow only valid indices 0 to 2.Final Answer:
Condition should be sp < 3, not sp <= 3 -> Option CQuick Check:
Use strict less than to avoid overflow [OK]
- Allowing sp == stack size causes overflow
- Not incrementing sp after push
- Misplacing overflow message
You have a stack of size 5 and want to implement a safe push function that returns 0 on success and -1 on overflow. Which code snippet correctly implements this?
int stack[5];
int sp = 0;
int push(int val) {
// Fill in condition
if (__________) {
stack[sp++] = val;
return 0;
} else {
return -1;
}
}Solution
Step 1: Understand stack size and valid indices
Stack size is 5, so valid indices are 0 to 4; sp must be less than 5 to push safely.Step 2: Choose condition that prevents overflow
Condition 'sp < 5' ensures no out-of-bounds write and returns 0 on success.Final Answer:
sp < 5 -> Option DQuick Check:
Push only if sp less than stack size [OK]
- Using sp <= 5 allows overflow
- Returning success on overflow
- Checking sp == 5 instead of less than
Ready to prove it?
Pass the test and this pattern moves unknown
